【问题标题】:Is there a way in VBA to add a ListRow object and specify the columns by name?VBA 中有没有办法添加 ListRow 对象并按名称指定列?
【发布时间】:2021-07-25 01:58:35
【问题描述】:

我有一个像这样的名为“Names”的表

Name Value
Pete 5
Hugo 1

并且想添加新的数据点,比如说“Malcolm, 9”。

我可以这样做:

Sub addName()

Dim tbl as Listobject: Set tbl = Range("Names").ListObject
With tbl.ListRows.Add
    .Range(1) = "Malcolm"
    .Range(2) = 9
End With

End Sub

为了灵活,改变列顺序,插入列等,我想这样做:

Sub addName()

Dim tbl as Listobject: Set tbl = Range("Names").ListObject
With tbl.ListRows.Add
    .Range("Name") = "Malcolm"
    .Range("Value") = 9
End With

End Sub

VBA 中有没有一种方法可以轻松实现这一点?有一种解决方法,您首先检查表头,然后查找列名的位置。但这太乏味了。

【问题讨论】:

    标签: vba listobject


    【解决方案1】:

    希望这个不那么繁琐的解决方法能解决问题。您需要再插入两行。

    Sub addName3()
    
    Dim tbl As ListObject
    Dim clm1 As Integer
    Dim clm2 As Integer
    
    Set tbl = Range("Names").ListObject
    
    clm1 = tbl.ListColumns("Name").Index
    clm2 = tbl.ListColumns("Value").Index
    
    
    With tbl.ListRows.Add
        .Range(clm1) = "Malcolm"
        .Range(clm2) = 9
    End With
    
    End Sub
    

    【讨论】:

    • 很好的解决方法。易于维护,正是我想要的。
    【解决方案2】:

    据我所知,没有内置的解决方案。

    当然,您也可以创建自己的助手:

    Sub Main()
      Dim row as object: set row = CreateDict("Name", "Malcolm, "Age", 20)
      row("height") = "5'7"
      'later
      Call addRow(myListObject, row)
    End Sub
    
    Function addRow(Byval lo as ListObject, ByVal oRow as object) as Boolean
      On Error GoTo ErrorOccurred
      Dim keys as variant: Keys = oRow.keys()
      Dim v() as variant: Redim v(1 to 1, 1 to lo.listcolumns.count)
      Dim iKey as long
      For iKey = 0 to ubound(keys)
        Dim sKey as string: sKey = keys(iKey)
        On Error GoTo lcDoesntExist
          v(1,lo.listcolumns(sKey).index) = oRow(sKey)
        On Error GoTo 0
    lcDoesntExist:
      next
      lo.ListRows.Add.Value = v
    ErrorOccurred:
    End Function
    
    Function CreateDict(ParamArray Params()) as Object
      Dim o as object: set o = CreateObject("Scripting.Dictionary")
      Dim i as long
      For i = 0 to ubound(params) step 2
        if isObject(params(i+1)) then
          set o(params(i)) = params(i+1)
        else
          let o(params(i)) = params(i+1)
        end if
      next
      set CreateDict = o
    End Function
    

    此代码未经测试,可能存在一些问题。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2020-09-24
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多