在 Excel VBA 中插入新列到表格

13

我在制作一个表格时遇到了一些问题。我想在表格的特定位置插入一列,然后设置标题。

我搜寻了一段时间,并找到了以下代码(某个版本):

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"

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

谢谢。

-Sean


“Naming” a column是什么意思? - stenci
@stenci 对于之前的误用我感到抱歉。我将进行编辑以作澄清。我的意思是,我想在一个预先存在的表中插入一列,然后设置该列的标题。 - detroitwilly
你正在使用工作表内的表格吗?我从未用过,但是在尝试宏录制器后,我建议你探索对象Range("Table1").ListObject.ListColumns.Count。它看起来像是一个命名范围,并且可以通过ListObject属性访问。 - stenci
@stenci 感谢你的帮助。我在MSDN上找到了ListObjects.ListColumns属性,并发现可以在.Add方法中添加位置。示例:Set sLc = sSh.ListObjects("PropTable").ListColumns.Add(2) - detroitwilly
Range("Table1[ColName]") 指的是整个列范围。 - stenci
显示剩余2条评论
3个回答

22

可以使用同一行代码,在特定位置添加一个列并对其进行命名。

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

这将在表格的第二列左侧添加一列,并将其命名为“新标题”。 您可以通过在已知名称的列的左侧添加一列使您的代码变得动态。这样,就不需要指定新列的固定位置的整数值。

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

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


8
  Dim Table As ListObject
  Set Table = Sheet1.ListObjects("Table1")
  Table.ListColumns.Add 2
  Table.HeaderRowRange(2) = "New header"

2
我知道这个帖子已经很老了,但是我必须指出,在这里最受赞的答案是有风险的,可能会让你陷入严重的麻烦。我不知道它是否取决于Excel版本——我使用的是Excel'16。
让我们考虑包含列A、列B和列C的表格。

before macro

我们使用“ 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列:
  • 列A
  • 新插入的列1或表格列的另一个默认名称(1)
  • 列B - 旧的B列填充了"test"字符串
  • 列C

after macro

(1) 这取决于你的语言版本 - 我的称为Kolumna1,它是由Excel自动给出的。
最糟糕的是,在宏运行后我们在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

好的见解,谢谢! - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接