对象工作表的 Excel VBA_方法范围失败(运行时错误 1004)



在不同的模块中编写了一些vba过程。然后,有一个用户窗体,在用户窗体中有这样的子,我在模块中调用子

Sub uf2_imp_new_Click()
Call a_xxx_delete '[Sub in Module A]
Call a_xxx_import '[Sub in Module A]
Call b_TransXXX    '[Sub in Module B]
Call c_plist_reset_all '[Sub in Module C]
Call c_xxx_listfrom_transANB '[Sub in Module C]
End Sub

执行时,我在模块 C 子c_xxx_listfrom_transANB中收到运行时错误 1004"对象工作表的方法范围失败":

Option Explicit
Sub c_xxx_listfrom_transANB()
Dim wb As Workbook
Dim ws_trans_anb As Worksheet
Dim ws_plist As Worksheet
Dim zeile_trans As Integer  
Dim zeile_plist As Integer
Set wb = ThisWorkbook
Set ws_trans_anb = wb.Worksheets("Trans_XXX")       
Set ws_plist = wb.Worksheets("PROJEKTLISTE")  
letztezeile = ws_trans_anb.Cells(Rows.Count, 1).End(xlUp).Row
For zeile_trans = 2 To letztezeile
[...]
ws_plist.Range(Cells(zeile_plist, 2), Cells(zeile_plist, 16)).Borders(xlEdgeBottom).LineStyle = xlContinuous
Next
EndSub

发生错误时突出显示的行是

ws_plist.Range(Cells(zeile_plist, 2), Cells(zeile_plist, 16)).Borders(xlEdgeBottom).LineStyle = xlContinuous

有人知道如何解决这个问题吗?我在几天前对模块进行了编码,但从未出现过错误。但是现在,当通过用户表单调用子时,它不再起作用了。奇怪的是:我在模块 C 中通过轻舔 VBA 中的"播放"来执行 Sub,发生错误。但是当我逐步执行模块 C 中的 Sub 时,没有错误。这对我来说太过分了..:)谁能帮忙?

你的代码不精确。您正在计算一个工作表(活动工作表(中的行,然后在另一个工作表中使用该数字。您还假定要定义的单元格与使用它们的区域位于同一工作表上。结果不应该使 VBA 崩溃,但随后您面临 VBA 无法按预期运行的情况。因此,请提高精度,如下所示。

Sub c_xxx_listfrom_transANB()
' 056

Dim Wb             As Workbook
Dim Ws_trans_anb   As Worksheet
Dim Ws_plist       As Worksheet
Dim zeile_trans    As Integer      ' should be Long
Dim zeile_plist    As Integer      ' should be Long
Dim Rng            As Range

Set Wb = ThisWorkbook
Set Ws_trans_anb = Wb.Worksheets("Trans_XXX")
Set Ws_plist = Wb.Worksheets("PROJEKTLISTE")

With Ws_trans_anb
' count the rows in the same worksheet where you define the last cell
letztezeile = .Cells(.Rows.Count, 1).End(xlUp).Row
End With

For zeile_trans = 2 To letztezeile
' [...]
With Ws_plist
Set Rng = .Range(Cells(zeile_plist, 2), Cells(zeile_plist, 16))
Rng.Borders(xlEdgeBottom).LineStyle = xlContinuous
Next
End Sub

在上面的代码中,您将能够使用 F8 升级到故障线,并在崩溃发生之前检查组件。

你可能会发现zeile_plist不是你想象的那样。从逻辑上讲,它应该是zeile_trans,使用循环计数器?它可能是 0,这将导致现金。

我认为您需要研究变量命名。带有下划线的蜿蜒名称会降低它们的可读性。您只使用小写字母具有相同的效果。ZeilePlistZeileTrans将是一个改进。但Zeile这个词并不是区分这些名字的原因。我可能会使用ZplistZtrans,也许有更好的机会不落入你发现自己的陷阱。

如注释中所述,没有什么可以保证对 Cells(( 的非限定调用将返回ws_plist上的范围。

所以你的行:

ws_plist.Range(Cells(zeile_plist, 2), Cells(zeile_plist, 16)).Borders(xlEdgeBottom).LineStyle = xlContinuous

应该变成:

ws_plist.Range(ws_plist.Cells(zeile_plist, 2), ws_plist.Cells(zeile_plist, 16)).Borders(xlEdgeBottom).LineStyle = xlContinuous

最新更新