我有4列:Number
,Title
,Revision
,ID
。每行都有一个唯一的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
答案 0 :(得分:-1)
实际上有几种方法可以在几秒钟内完成,甚至不使用VBA。这是一种方式。
使用示例数据作为示例,在A到D列中,我们希望隐藏除每个ID的第一个出现之外的所有内容:
在单元格E2
中输入公式:
=COUNTIF($D$2:D2,D2)
...然后将其复制或“填充”到第5000行,或者远离您的数据。 (如有必要,首先插入一个新列 - 当您完成设置后,您可以随时隐藏。)
在Data
菜单下,点击Filter
。
在E
列的过滤器菜单中,选择仅显示1
的值。
除了最近的一切,一切都消失了。在屏幕的底部,您将看到总计和&amp;显示的行。即使列不是有序的,这种方法的另一个优点是可以工作。
现在我知道这不是切换按钮,但它非常接近。只是为了它,我也会把一些代码拼凑在一起。 (所以从技术上来说它使用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
如前所述,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
两者都返回结果:
最高列:XFD
= 16384次修订。这在你还没有考虑过的许多方面都很方便。 :)