我有一个VBA可以将Sheet1中的唯一值复制并粘贴到Sheet3上。但是,当我运行VBA时,我得到运行时错误438。 我的VBA看起来像这样:
Sub UniqueList()
Application.ScreenUpdating = False
Dim lastrow As Long
Dim i As Long
Dim dictionary As Object
Set dictionary = CreateObject("scripting.dictionary")
ThisWorkbook.Sheet1.Activate
lastrow = Sheet1.Cells(Rows.Count, "M").End(xlUp).Row
On Error Resume Next
For i = 1 To lastrow
If Len(Cells(i, "M")) <> 0 Then
dictionary.Add Cells(i, "M").Value, 1
End If
Next
Sheet3.Range("a2").Resize(dictionary.Count).Value = _
Application.Transpose(dictionary.keys)
Application.ScreenUpdating = True
MsgBox dictionary.Count & " unique cell(s) were found and copied."
End Sub
获得错误的行是:
ThisWorkbook.Sheet1.Activate
我使用Sheet3中的按钮运行VBA。但我也尝试使用AltF8和AltF11运行它,并打开sheet1,没有任何效果。
我不确定为什么会收到这个错误,所以我希望有一个人可以帮助解决方案
答案 0 :(得分:4)
Sheet1
不是ThisWorkbook
的成员。 ThisWorkbook
是Workbook
个实例,Workbook
个对象不会为其Worksheets
集合中的每个工作表公开“动态成员”。因此错误438, Object不支持属性或方法。
Sheet1
是[我推测] CodeName
中工作表的ThisWorkbook
:它是VBA方便创建的全局范围Worksheet
对象,以{{1}命名文档模块的属性。
(Name)
对象具有Sheet1
属性;与每个Parent
对象一样,已经知道它所属的Worksheet
个实例:
Workbook
IntelliSense一直试图告诉你(通过不列出Debug.Print Sheet1.Parent Is ThisWorkbook
成员) - 听听它的内容!
那说,修理这样的指令:
Sheet1
...无法解决其他问题:您只使用Sheet1.Activate
,以便不合格的Activate
调用可以引用该特定工作表:
Cells
相反,限定他们:
For i = 1 To lastrow
If Len(Cells(i, "M")) <> 0 Then
dictionary.Add Cells(i, "M").Value, 1
End If
Next
然后For i = 1 To lastrow
If Len(Sheet1.Cells(i, "M")) <> 0 Then
dictionary.Add Sheet1.Cells(i, "M").Value, 1
End If
Next
电话变得毫无用处。
这些隐式Activate
引用很容易引入,很难发现。 Rubberduck(我管理的一个开源VBE加载项项目)可以帮助您找到它们(和其他东西):