Excel对象工作表的 VBA_ 方法范围失败(运行时错误 1004)
Excel VBA_ Method Range failed for Object Worksheet (Runtime Error 1004)
我在不同的模块 中编写了一些 vba 过程。然后,有一个 UserForm 和 在 UserForm 中有这样的 Subs 我在模块中调用 subs:
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,从来没有出现过错误。但是现在当通过用户表单调用 sub 时,它不再起作用了。奇怪的是:我通过单击 VBA 中的“播放”来执行模块 C 中的 Sub,发生错误。但是当我在Module C Step by Step中执行Sub时没有错误。这对我来说太多了.. :) 谁能帮忙?
如评论中所述,无法保证对 Cells() 的非限定调用 return 范围位于 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
您的代码不精确。您正在计算一个 sheet(ActiveSheet)中的行数,然后在另一个 sheet 中使用该数字。您还假设您定义的单元格与您使用它们的范围相同 sheet。结果不应该崩溃 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,这将导致现金。
我认为您需要处理变量命名问题。带有下划线的蛇形名称会降低它们的可读性。您使用小写字母只会产生相同的效果。 ZeilePlist 和 ZeileTrans 会有所改进。但是 Zeile 这个词并不是区分这些名字的原因。我可能会使用 Zplist 和 Ztrans,也许有更好的机会不落入你发现自己的陷阱。
我在不同的模块 中编写了一些 vba 过程。然后,有一个 UserForm 和 在 UserForm 中有这样的 Subs 我在模块中调用 subs:
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,从来没有出现过错误。但是现在当通过用户表单调用 sub 时,它不再起作用了。奇怪的是:我通过单击 VBA 中的“播放”来执行模块 C 中的 Sub,发生错误。但是当我在Module C Step by Step中执行Sub时没有错误。这对我来说太多了.. :) 谁能帮忙?
如评论中所述,无法保证对 Cells() 的非限定调用 return 范围位于 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
您的代码不精确。您正在计算一个 sheet(ActiveSheet)中的行数,然后在另一个 sheet 中使用该数字。您还假设您定义的单元格与您使用它们的范围相同 sheet。结果不应该崩溃 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,这将导致现金。
我认为您需要处理变量命名问题。带有下划线的蛇形名称会降低它们的可读性。您使用小写字母只会产生相同的效果。 ZeilePlist 和 ZeileTrans 会有所改进。但是 Zeile 这个词并不是区分这些名字的原因。我可能会使用 Zplist 和 Ztrans,也许有更好的机会不落入你发现自己的陷阱。