2017-04-21 122 views
0

我在Excel中运行VBA代码以在单击按钮后构建表(ListObject)。 通过使用标题名称的集合动态添加列。 在构建表之前,现有表将被删除以避免错误。Excel VBA:向ListObject添加列而不向工作表添加列

使用ListColums.Add的问题是,它会将列添加到整个工作表并将现有列向右推。所以每次点击按钮时,工作表将会有越来越多的列。这不是很干净。该按钮将非常频繁地按下,我想避免推动Excel工作表的限制。我构建功能的工作原理如下:

Function buildTable(wsName As String, tblName As String, clmns As Collection, Optional tableRange As String) 

    ' * If Range is not specified choose "$A$1" 
    If IsMissing(tableRange) Then 
     position = "$A$1" 
    End If 

    ' * Build the table based on the passed parameters 
    ThisWorkbook.Worksheets(wsName).ListObjects.Add(xlSrcRange, ThisWorkbook.Worksheets(wsName).Range(tableRange), , xlYes).Name = tblName 

    ' * Declare and define tblName as ListObject in Worksheet wsName 
    Dim tbl As ListObject 
    Set tbl = ThisWorkbook.Worksheets(wsName).ListObjects(tblName) 

    ' * Declare and define the columns of table tblName 
    Dim clmn As ListColumns 
    Set clmn = tbl.ListColumns 

    ' * Replace the first column name with the first item in our column Collection clmns 
    tbl.HeaderRowRange(1, 1).Value = clmns.Item(1) 

    ' * Now loop through the rest of the passed header name collection clmns. Start with 2, because 1 was already set in the last step 
    X = 2 

    For X = 2 To clmns.Count 
     ' * Add Item X to the table (String from the passed collection clmns) as column. 
     clmn.Add.Name = clmns(X) 
    Next X 

End Function 

我会这样称呼它:

' * Declare and fill my Collection of headers 
Dim clHeaders As New Collection 
clHeaders.Add "MyFirstColumn" 
clHeaders.Add "MySecondColumn" 
clHeaders.Add "MyThirdColumn" 

' * Call the builTable Function 
Call buildTable("Sheet1", "MyTable", clHeaders) 

我已经尝试过ThisWorkbook.Worksheets("Sheet1").Columns("AS").EntireColumn.Delete,但这只是清空已经空栏,并不会删除它们..

有没有办法做到这一点,而不必在每次单击按钮时在工作表末尾添加更多列?

+0

首先,您无法增加表单中的列数 - 它始终保持不变。其次,'EntireColumn.Delete'确实会删除整列的单元格,但和以前一样,列的总数将始终保持不变。 – Rory

+0

啊谢谢你,你给我带来了正确的想法! – 30000MONKEYS

回答

0

好吧,罗里有一点。

没有添加列,但视图空间不断增加(滚动条缩小)。

因此,所有我必须做的是ThisWorkbook.Worksheets(wsName).UsedRange.SpecialCells (xlCellTypeLastCell)我发现here

谢谢!