如何使用 VBA 在 Excel 中正确添加 Table 列?
How do I correctly add Table Columns in Excel using VBA?
问题:使用 VBA 向多个工作簿中的 table 添加列时,我收到间歇性结果。有一次,我收到了一个超出范围的错误。有时会添加所有新列,但大多数情况下它只会添加几个,并将剩余的列标题带到下一行而不是创建列。
我想做什么:我正在尝试向现有 table 添加 7 列,然后将数据添加到引用现有 table每行数据。
我试过的:我试过不同版本的代码。
我在开始时添加了这段代码,在循环添加数据之前。此代码错误并显示“脚本超出范围”错误。它将添加前两列,它将第三列名称添加到第一行的第一个单元格,然后在尝试添加第四列时出错。 tblCols 变量是添加新列之前所有 table 列的计数。
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 1).Name = "Transaction Name In"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 2).Name = "Transaction Name Out"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 4).Name = "Inbound Path and File"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 5).Name = "Outbound Path and File"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 6).Name = "Lookup Tables"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 7).Name = "Logical Path"
如果我使用下面的代码并简单地添加新数据,大多数情况下,简单地添加此数据会强制创建新列,然后循环后面的代码用于命名 headers。但是,这也不总是有效。我不会收到错误,但最后几列 headers 将写入第一行,而不是创建列。我对循环代码没有任何问题。
Dim x As Long
For x = 1 To tblRows
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 1)) = CreateTransInName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 2)) = CreateTransOutName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 3)) = CreateBatchMapName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 4)) = CreateInboundPath(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 5)) = CreateOutboundPath(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 6)) = CopyLookupTables(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 7)) = CreatelogicalPath(x)
Next
DoEvents
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 1) = "Transaction Name In"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 2) = "Transaction Name Out"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 4) = "Inbound Path and File"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 5) = "Outbound Path and File"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 6) = "Lookup Tables"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 7) = "Logical Path"
MsgBox "Naming Convention Completed"
如果有人有任何建议,我愿意接受。我真的有点困惑,第一块代码不起作用。
您可以使用这些方法来添加列。将所有列名称放入一个字符串数组中,然后遍历这些项目,边走边添加。
Public Sub AddColumnsToTable()
Dim ColumnHeaders(1 To 3) As String
Dim col As ListColumn
Dim i As Integer
ColumnHeaders(1) = "Hello"
ColumnHeaders(2) = "This is"
ColumnHeaders(3) = "A new column"
For i = 1 To 3
Set col = Me.ListObjects(1).ListColumns.Add
col.Name = ColumnHeaders(i)
Next i
End Sub
纠正我的 copy/paste 错误,在第一个代码块的第 3 行用 ListColumns.Add
替换 HeaderRowRange
是修复。我的 post 中的第一段代码是添加列的正确方法。我只是犯了一个错误,幸好有人发现了。
改变这个:
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
为此:
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 3) = "Batch Map Name"
问题:使用 VBA 向多个工作簿中的 table 添加列时,我收到间歇性结果。有一次,我收到了一个超出范围的错误。有时会添加所有新列,但大多数情况下它只会添加几个,并将剩余的列标题带到下一行而不是创建列。
我想做什么:我正在尝试向现有 table 添加 7 列,然后将数据添加到引用现有 table每行数据。
我试过的:我试过不同版本的代码。
我在开始时添加了这段代码,在循环添加数据之前。此代码错误并显示“脚本超出范围”错误。它将添加前两列,它将第三列名称添加到第一行的第一个单元格,然后在尝试添加第四列时出错。 tblCols 变量是添加新列之前所有 table 列的计数。
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 1).Name = "Transaction Name In"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 2).Name = "Transaction Name Out"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 4).Name = "Inbound Path and File"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 5).Name = "Outbound Path and File"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 6).Name = "Lookup Tables"
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 7).Name = "Logical Path"
如果我使用下面的代码并简单地添加新数据,大多数情况下,简单地添加此数据会强制创建新列,然后循环后面的代码用于命名 headers。但是,这也不总是有效。我不会收到错误,但最后几列 headers 将写入第一行,而不是创建列。我对循环代码没有任何问题。
Dim x As Long
For x = 1 To tblRows
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 1)) = CreateTransInName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 2)) = CreateTransOutName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 3)) = CreateBatchMapName(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 4)) = CreateInboundPath(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 5)) = CreateOutboundPath(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 6)) = CopyLookupTables(x)
Worksheets(wsName).ListObjects(tblName).DataBodyRange(x, (tblCols + 7)) = CreatelogicalPath(x)
Next
DoEvents
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 1) = "Transaction Name In"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 2) = "Transaction Name Out"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 4) = "Inbound Path and File"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 5) = "Outbound Path and File"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 6) = "Lookup Tables"
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 7) = "Logical Path"
MsgBox "Naming Convention Completed"
如果有人有任何建议,我愿意接受。我真的有点困惑,第一块代码不起作用。
您可以使用这些方法来添加列。将所有列名称放入一个字符串数组中,然后遍历这些项目,边走边添加。
Public Sub AddColumnsToTable()
Dim ColumnHeaders(1 To 3) As String
Dim col As ListColumn
Dim i As Integer
ColumnHeaders(1) = "Hello"
ColumnHeaders(2) = "This is"
ColumnHeaders(3) = "A new column"
For i = 1 To 3
Set col = Me.ListObjects(1).ListColumns.Add
col.Name = ColumnHeaders(i)
Next i
End Sub
纠正我的 copy/paste 错误,在第一个代码块的第 3 行用 ListColumns.Add
替换 HeaderRowRange
是修复。我的 post 中的第一段代码是添加列的正确方法。我只是犯了一个错误,幸好有人发现了。
改变这个:
Worksheets(wsName).ListObjects(tblName).HeaderRowRange(tblCols + 3) = "Batch Map Name"
为此:
Worksheets(wsName).ListObjects(tblName).ListColumns.Add(tblCols + 3) = "Batch Map Name"