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,这将导致现金。

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