运行此宏时出现错误,即使使用调试过程,也找不到错误的地方
Sub Update(brand)
Dim c As Range
Dim tbl As ListObject
Dim Rng As Range
Dim i As Integer
brand = brand & "_Param"
For Each tbl In Worksheets("Assumptions").ListObjects
Set Rng = Range(tbl.name)
For Each c In Rng
If Not IsEmpty(c.Value) Then
Worksheets(brand).Range(c.Address).Value = c.Value
End If
Next
Next tbl
End Sub
来自Set Rng = Range(tbl.name)
的问题
我收到错误消息:对象_global的方法范围失败
几天前,我使用了这种代码,但我不明白为什么它不再起作用了
答案 0 :(得分:2)
我想问题是.Range()
的父项(工作表)没有明确定义。因此,它将在代码所在的ActiveSheet
或工作表上查找表格。因此,它昨天才起作用,可能在ActiveSheet
出现变化之前。
根据vba的经验,请确保始终声明Range
,Cell
,Column
,Row
或任何其他Range
对象。在这种情况下:
For Each tbl In Worksheets("Assumptions").ListObjects
Set Rng = Worksheets("Assumptions").Range(tbl.name)
For Each c In Rng
If Not IsEmpty(c.Value) Then
Worksheets(brand).Range(c.Address).Value = c.Value
End If
Next
Next tbl
或者如果您喜欢这个:
Set Rng = Worksheets(tbl.Parent.Name).Range(tbl.Name)
,并且如果您使用多个Excel文件,则可能会发生类似的情况 (但可能不建议):
Set Rng = Workbooks(tbl.Parent.Parent.Name).Worksheets(tbl.Parent.Name).Range(tbl.Name)
答案 1 :(得分:2)
使用ListObject
的现有对象组件-在您的情况下为ListObject.DataBodyRange-代替Set Rng = Range(tbl.Name)
。
For Each tbl In Worksheets("Assumptions").ListObjects
For each c in tbl.DataBodyRange
...
Next c
Next tbl