11

我在正在构建的工作表上遇到了一些问题。我想在表格的特定位置插入一列,然后设置标题。

我搜索了一段时间,发现(某些版本)以下代码:

ActiveSheet.Columns(2).Insert

这可以插入列,但我不确定在此之后如何更改表的标题。

另外,我之前在这里得到了一些关于在表的末尾添加列并命名它们的建议。

代码是:

Dim oSh As Worksheet
Set oSh = ActiveSheet
Dim oLc As ListColumn
Set oLc = oSh.ListObjects("PropTable").ListColumns.Add

oLc.Name = "XYZ"

我尝试以各种方式结合这两种方法,但我没有任何运气。有没有办法修改第二个代码块,使其在特定位置插入一列,而不仅仅是添加一列?

谢谢。

-肖恩

4

3 回答 3

19

可以使用同一行代码将列添加到特定位置的表并为其命名。

Table.ListColumns.Add(2).Name = "New Header"

这将在表中第二列的左侧添加一列,并将其命名为 New Header。您可以通过在您知道其名称的列的左侧添加一列来使您的代码动态化。这样,就不必指定新列的固定位置的整数值。

Dim newColNum as Integer
newColNum = Range("Table[Column Name]").Column
Table.ListColumns.Add(newColNum).Name = "New Header"

[Column Name] 是表中要插入新列的列的名称。它可以在表中的任何位置,您可以将它的值作为整数传递给 Add。

于 2016-06-03T07:03:48.277 回答
8
  Dim Table As ListObject
  Set Table = Sheet1.ListObjects("Table1")
  Table.ListColumns.Add 2
  Table.HeaderRowRange(2) = "New header"
于 2013-07-09T13:50:39.940 回答
2

我知道线程很旧,但我必须指出,这里最受好评的答案是有风险的,可能会给你带来严重的麻烦。我不知道它是否取决于 Excel 版本 - 我使用 Excel'16。

让我们考虑包含列的表:col A、col B 和 col C。

宏之前

我们使用“The Dudes”单行代码并希望将我们的新列命名为“Col B”。它已经存在,但请检查会发生什么:

Sub theDude()

  Dim Table As ListObject
  Set Table = ActiveSheet.ListObjects(1)
  
  With Table
  
    ' adding column on the second place
    ' and trying to force its header to "Col B"
    .ListColumns.Add(2).Name = "Col B"
    
    'fill "Col B" with value
    .ListColumns("Col B").DataBodyRange = "test"
    
  End With
  
End Sub

我们得到了什么?结果我们有 4 列:

  • 可乐
  • 新插入的Column1或表的列的另一个默认名称 (1)
  • Col B - 用“test”字符串填充的“旧”B 列
  • 科尔C

宏之后

(1) 这取决于你的语言版本——我的叫做 Kolumna1,它是由 Excel 自动给出的

最糟糕的是我们在 Col B 中的数据在宏运行后丢失了。所以我建议改为使用@stenci 的逐步解决方案,或者更好地添加一些错误处理,例如:

Sub AddingColumn()

  Dim Table As ListObject
  ' ActiveSheet just for test
  Set Table = ActiveSheet.ListObjects(1)   
  
  Dim newColName As Variant     ' or string / long
      newColName = "Col B"
      
  If headerExists(newColName, Table) Then
 
    Dim tit As String:  tit = "Error"
    Dim txt As String
        txt = "Header " & newColName & " already exists. Macro will be interrupted"

        MsgBox txt, vbOKOnly, tit
        Exit Sub
    
  Else
    
    ' main code goes here *********************
    With Table
      ' adding column on the second place
      ' and trying to force its header to "Col B"
        .ListColumns.Add(2).Name = newColName
      'fill "Col B" with value
        .ListColumns("Col B").DataBodyRange = "test"
    End With
    
  End If
  
End Sub

Function headerExists(ByVal findHeader As String, ByVal tbl As ListObject) As Boolean
    
    Dim pos As Variant     ' position
        pos = Application.Match(findHeader, tbl.HeaderRowRange, 0)
        
        headerExists = Not IsError(pos)

End Function
于 2020-08-09T09:07:12.670 回答