ThisWoorkbook运行时错误438

时间:2017-09-20 13:33:13

标签: excel vba excel-vba

我有一个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,没有任何效果。

我不确定为什么会收到这个错误,所以我希望有一个人可以帮助解决方案

1 个答案:

答案 0 :(得分:4)

Sheet1不是ThisWorkbook的成员。 ThisWorkbookWorkbook个实例,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加载项项目)可以帮助您找到它们(和其他东西):

"Implicit reference to ActiveSheet" inspection results