设定范围数据表错误

时间:2018-07-18 12:50:30

标签: vba excel-vba

运行此宏时出现错误,即使使用调试过程,也找不到错误的地方

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的方法范围失败

几天前,我使用了这种代码,但我不明白为什么它不再起作用了

2 个答案:

答案 0 :(得分:2)

我想问题是.Range()的父项(工作表)没有明确定义。因此,它将在代码所在的ActiveSheet或工作表上查找表格。因此,它昨天才起作用,可能在ActiveSheet出现变化之前。

根据的经验,请确保始终声明RangeCellColumnRow或任何其他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