11

正如我在这里了解到的(也在SO 中引用),以下代码可用于选择第 3 列的数据主体Table1

ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Select

我需要帮助才能一起选择多列- 例如列 3 到 5,或列 X 到 X+3 。

使用这个问题的答案,我设法通过使用实际的列名来中途:

Range("Table1[[Column3]:[Column5]]").Select

但我需要能够使用列号而不是名称,因为它们将是函数的结果(即列 X 到 X+d)。

4

2 回答 2

18

对于连续范围,只需调整单个列的大小。

ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Resize(, 3).Select

对于更复杂的选择,在 .Select 过程之前使用 Union 来收集它们。

With ActiveSheet.ListObjects("Table1")
    Union(.ListColumns(3).DataBodyRange, _
          .ListColumns(4).DataBodyRange, _
          .ListColumns(5).DataBodyRange).Select
End With

请参阅如何避免在 Excel VBA 宏中使用 Select 以获得更好的方法。

于 2017-07-27T16:35:10.587 回答
2

在 DataBodyRange 上使用 Columns 方法,该方法可以采用相对表范围,例如"A:B"

因此,如果您想要前两列,您可以编写:ActiveSheet.ListObjects("Table1").DataBodyRange.Columns("A:B").Select

但是,如果您想根据相对列号进行选择怎么办?创建一些函数来将数字转换为这个字符串:

Sub selectMultipe()
    ActiveSheet.ListObjects("Table1").DataBodyRange.Columns(getRangeStr(1, 2)).Select
End Sub

'Get Range String
Function getRangeStr(startColNum As Long, endColNum As Long) As String
    startCol = ColLtr(startColNum)
    endCol = ColLtr(endColNum)

    getRangeStr = startCol + ":" + endCol
End Function

'Convert column number to letter
Function ColLtr(iCol As Long) As String
    If iCol > 0 And iCol <= Columns.Count Then ColLtr = Replace(Cells(1, iCol).Address(0, 0), 1, "")
End Function

注意:列号转字母功能可在此处找到

于 2017-07-27T16:53:24.520 回答