我已经看到了类似的事情,但是我的代码似乎可以正常运行,我只想检查是否有改进或可能的错误以及意想不到的后果。
我收到的电子表格最终得到了重复的信息。有很多电子表格,有些电子表格每个文件中包含100张纸。显然,不想使用删除重复的信息来手动浏览每张纸。经过四处搜寻,我认为我有一个解决方案,希望你对此有意见。我有JS背景,这是我第一次使用vba。
Sub RemoveDuplicates()
'RemoveDuplicates宏'选择所有值,然后删除重复项'
' Declare Current as a worksheet object variable.
Dim Current As Worksheet
Dim starting_ws As Worksheet
Set starting_ws = ActiveSheet 'remember which worksheet is active in the beginning
' Loop through all of the worksheets in the active workbook.
For Each Current In Worksheets
Current.Activate
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
ActiveSheet.Range("A1" & LastRow).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), Header:=xlYes
Next
starting_ws.Activate 'activate the worksheet that was originally active
结束子
我只在每张纸上寻找重复项,而不是在工作表中寻找重复项。列数也将保持不变。非常感谢你的提前帮助。抱歉,这是基本的VB。
Option Explicit
。ActiveSheet.Range("A1" & LastRow)
肯定是错误的。想一想。Range
,Cells
,Rows
和Columns
例如Current.Cells
,Current.Rows.Count
...Current
。Current
是ActiveSheet
你的情况(因为你已激活它),因此无需使用ActiveSheet
。Excel
我们定义范围:你要定义它。有问题的代码
Option Explicit
Sub removeDupes()
' Here's a question:
' Why can't I use 'Cols' instead of the array written explicitly?
Dim Cols As Variant
Cols = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
Const FirstAddress As String = "A1"
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim ws As Worksheet
Dim LastCell As Range
For Each ws In wb.Worksheets
Set LastCell = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(, 10)
ws.Range(FirstAddress, LastCell).RemoveDuplicates _
Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), Header:=xlYes
' This doesn't work.
'ws.Range(FirstAddress, LastCell).RemoveDuplicates _
Columns:=Cols, Header:=xlYes
Next
End Sub
非常感谢你。只是查看Option Explicit是什么,非常有用,它认为我确实也在我所引用的代码示例中看到了它。我明白了您指的是引用一个单元格然后是一行的意思。我一直使用当前的活动表来进行斩波和更改,我明白我的错误。而且我确实感到很奇怪,您必须为列使用显式数组。因此,从您的示例中我假设使用ws.Rows.Count将仅对其中包含数据的行进行计数?优秀的答复再次感谢,
因为
Excel 2007
,ws.Rows.Count
(Rows.Count
在工作表)方式排1048576
,所以它实际上是在列的最后一个单元格A
:单元格A1048576
。仅End(xlUp)会“跳转”到最后一个非空单元格。等效于按CRTL
+UP
。最后,Offset(, 10)
或的Offset(0, 10)
意思是在右边确定十列,以确定同一行中但在列中的单元格K
,因此在下一行(ws.Range(FirstAddress, LastCell)...
)中,我们可以定义完整范围:fromA1 to KwhateverRow
。非常感谢!那完全清楚地解释了这些人在做什么。感谢您帮助像vba这样的完整初学者。@ VBasic2008