将每个ID的最新修订复制到新工作表

时间:2018-04-04 21:56:38

标签: excel vba excel-vba sorting

我有4列:NumberTitleRevisionID。每行都有一个唯一的ID。工作表按ID分组并排序,以便最新版本位于顶部。

我正在尝试创建一个仅包含每个ID的最新版本的新工作表。

我的代码:

 Sub mySub()

    Dim j As Long
    j = 2 ' row 1 on sheet2 is headings

    Dim source As Excel.Worksheet 'source
    Dim target As Excel.Worksheet 'target
    Set source = ThisWorkbook.Worksheets("owssvr (1)") 'source sheet
    Set target = wb.Sheets.Add(Type:=xlWorksheet, _
        after:=Application.ActiveSheet) '("Sheet2") 'target sheet
    Sheets("owssvr (1)").Activate 'sheet with data

    For Each c In source.Range("D1:D5000") 'currently currently 5000 rows
        Dim alreadythere As Boolean 'already on sheet2?
        alreadythere = False 'not in sheet2 yet

' ***** "TYPE MISMATCH" ERROR on following line *****
        If c.Cells(4, 1).Value <> c.Offset(0, 1).Cells(4, 1).Value Then 

            For ctr = 1 To j 'checking from row 1 to last row in sheet2
                If c = target.Cells(ctr, 4) Then 'if it is in sheet2
                    alreadythere = True 'already exists
                End If
            Next ctr
            If alreadythere = False Then 'if its not in sheet2 already
                 source.Rows(c.Row).Copy 'copy
                 target.Rows(j).PasteSpecial Paste:=xlPasteValues 'paste
                 Application.CutCopyMode = False 'fix mode
                 j = j + 1 'count new row
            End If
        End If
    Next c
End Sub

数据示例和预期结果:

Number    Title    Revision    ID
1        Title 1     C       GH6YY
1        Title 1     B       GH6YY
1        Title 1     A       SDF212
2        Title 2     B       SDF212
2        Title 2     A       SDF212
3        Title 3     B       GTR3000
3        Title 3     A       GTR3000
3        Title 4     C       RTT24
3        Title 4     B       RTT24
3        Title 4     A       RTT24  

预期结果:

Number   Title    Revision   ID
1        Title 1     C       GH6YY
2        Title 2     B       SDF212
3        Title 3     B       GTR3000
3        Title 4     C       RTT24  

1 个答案:

答案 0 :(得分:-1)

实际上有几种方法可以在几秒钟内完成,甚至不使用VBA。这是一种方式。

使用示例数据作为示例,在A到D列中,我们希望隐藏除每个ID的第一个出现之外的所有内容:

  • 在单元格E2中输入公式:

    =COUNTIF($D$2:D2,D2)
    

    ...然后将其复制或“填充”到第5000行,或者远离您的数据。 (如有必要,首先插入一个新列 - 当您完成设置后,您可以随时隐藏。)

  • Data菜单下,点击Filter

  • E列的过滤器菜单中,选择仅显示1的值。

除了最近的一切,一切都消失了。在屏幕的底部,您将看到总计和&amp;显示的行。即使列不是有序的,这种方法的另一个优点是可以工作。

img

现在我知道这不是切换按钮,但它非常接近。只是为了它,我也会把一些代码拼凑在一起。 (所以从技术上来说它使用VBA - 除了我要让Excel为我编写代码!)...

“切换”命令按钮:

添加命令按钮并将以下代码附加到该按钮(如有必要,可更改按钮名称和自动过滤列)

Sub Button1_Click()
    With ActiveSheet.Shapes("Button 1").TextFrame.Characters
        If .Text <> "Show All" Then
             'only most recent
            .Text = "Show All"
            ActiveSheet.Range("$A$1:$E$11").AutoFilter Field:=5, Criteria1:="1"
        Else
            'show all
            ActiveSheet.Range("$A$1:$E$11").AutoFilter Field:=5
            .Text = "Show Most Recent"
        End If
    End With
End Sub

img2

如何按您的信件/编号系统排序

如前所述,A→Z→AA→ZZ→ etc的编号系统还有很多不足之处,特别是因为Excel没有按字母排序。 (按字母顺序排列AA早于Z。)

但我有一个想法:如果有必要,你可以使用这种“偷偷摸摸”的方法从字母中获取“数字”,基于Excel的列号。

工作表公式:

=COLUMN(INDIRECT(A1&"1"))

VBA Functiom:

Function numberFromRevision(revStr As String) As Long
    On Error Resume Next
    numberFromRevision = Range(revStr & "1").Column
End Function

两者都返回结果:

img

最高列XFD = 16384次修订。这在你还没有考虑过的许多方面都很方便。 :)