Excel VBA SpecialCells代码可以在家用电脑上运行,但不能在工作电脑上运行

Excel VBA SpecialCells代码可以在家用电脑上运行,但不能在工作电脑上运行,excel,vba,Excel,Vba,我编写宏来自动化工作流程。我的当前宏必须选择过滤数据的第一个可见行。我在家里用同一版本的Excel(16)测试了这段代码,效果很好。但是,当我在工作中尝试时,它给出了[运行时错误代码“1004”:无法获取Range类的SpecialCells属性] 我已经检查过,以确保两本书的格式相同。测试手册的数据量大于工作手册的数据量。由于该代码在家中使用的是同一版本的Excel,我不确定是什么原因导致了这种差异。这是我正在使用的代码 Sub First_Visible_Cell() With W

我编写宏来自动化工作流程。我的当前宏必须选择过滤数据的第一个可见行。我在家里用同一版本的Excel(16)测试了这段代码,效果很好。但是,当我在工作中尝试时,它给出了[运行时错误代码“1004”:无法获取Range类的SpecialCells属性]

我已经检查过,以确保两本书的格式相同。测试手册的数据量大于工作手册的数据量。由于该代码在家中使用的是同一版本的Excel,我不确定是什么原因导致了这种差异。这是我正在使用的代码

Sub First_Visible_Cell()

    With Worksheets("Items").AutoFilter.Range
        Range("A" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Select
    End With

End Sub

您的
范围
对象没有使用
With
语句,因为它不是以点开头的

那么这个

With Worksheets("Items").AutoFilter.Range
    Range("A" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Select
End With
实际上和

With Worksheets("Items").AutoFilter.Range
    ActiveSheet.Range("A" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Select
End With
你可能是有意的

With Worksheets("Items").AutoFilter.Range
    Worksheets("Items").Range("A" & .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row).Select
End With
还请注意,如果未设置
自动筛选
,它将抛出一个错误,如果
偏移量(1,0)
中没有可见的单元格,它也将抛出一个错误:

Dim wsItems As Worksheet
Set wsItems = Worksheets("Items")

With wsItems.AutoFilter.Range
    Dim VisibleCells As Range
    On Error Resume Next 'hide errors if they occur
    Set VisibleCells = .Offset(1, 0).SpecialCells(xlCellTypeVisible)(1) 'throws error if no visible cells
    On Error Goto 0 're-enable error reporting!

    If Not VisibleCells Is Nothing Then
        wsItems.Range("A" & VisibleCells.Row).Select
    Else
        MsgBox "No Visible Cells"
    End If
End With

两件事1。您确定
工作表(“项目”)
处于活动状态吗?您应该始终完全限定该范围。当前活动工作表可能不是您认为的工作表。尝试
工作表(“项目”).范围(“A”和偏移量(1,0).特殊单元格(xlCellTypeVisible)(1).行)。选择
2。使用
SpecialCells
时,最好进行正确的错误处理。参见示例。@SiddharthRout:谢谢你的第二个链接。我会用
处理它,如果错误号为0,那么
似乎更差。另一个教训(代号
sandwith
)@Siddharth-Rout:我确信
工作表(“项目”)
处于活动状态。较大的宏指定工作簿和工作表。此外,视图在相应的图纸上结束。它只是无法选择一行。然而,我确实尝试过建议修改代码,但没有效果。我要问的真正问题是,“为什么这些代码可以在我的家用电脑上运行,而不能在登录到我工作的虚拟桌面的笔记本电脑上运行?如果在你的家用电脑上运行,上述代码应该可以在另一台电脑上运行(在相同的情况下)。你能帮我运行这几个测试吗。在
xlCellTypeVisible
行之前添加两行…
Msgbox-Activesheet.name
,然后是
Msgbox-Activesheet.autofiltermode
。你得到了什么消息?@Siddharth-Rout:我添加了这些行。它给出了一个显示工作表名称的Msgbox框,然后是一个“True”,然后出现了正常错误消息。我尝试了评论中列出的许多建议。所有的代码修改都表明在我的家用电脑上可以正常工作。但是,当在我的工作笔记本电脑上使用时,它们会产生相同的错误信息。我要问的真正问题是,“为什么这些代码可以在我的家用电脑上工作,而不能在登录到我工作的虚拟桌面的笔记本电脑上工作?”我忍不住想,这可能不是实际代码本身的问题,而是代码如何与远程桌面系统或安全功能交互的问题,或者类似的。你测试过我发布的最后一个代码块吗?这一个不能给出与您在问题中发布的相同的错误。你得到的结果是什么?那确实有效。谢谢它只选择了第一个可见的单元格,但我只是添加了
行(ActiveCell.Row)。在代码之后选择
,以选择整行。现在,我的其余代码都可以正常工作了。我仍然想知道为什么原始代码在一张纸上工作,而不是在另一张纸上工作。这似乎很奇怪,我想了解这种奇怪现象的原因。谢谢大家的帮助!因为使用
.Select
ActiveSheet
不是很可靠(请参阅)<每当用户单击另一张工作表时,代码>活动工作表
都会更改。这意味着您无法可靠地判断这是哪张纸。尽量避免使用它,并对每个范围对象使用完整的工作表引用。