56

如何使用列号而不是字母在 vba 中创建范围?

4

10 回答 10

83

要引用单元格范围,您可以使用Range(Cell1,Cell2),示例:

Sub RangeTest()
  Dim testRange As Range
  Dim targetWorksheet As Worksheet
  
  Set targetWorksheet = Worksheets("MySheetName")
  
  With targetWorksheet
    .Cells(5, 10).Select 'selects cell J5 on targetWorksheet
    Set testRange = .Range(.Cells(5, 5), .Cells(10, 10))
  End With
  
  testRange.Select 'selects range of cells E5:J10 on targetWorksheet
  
End Sub

在此处输入图像描述

于 2012-10-31T13:53:08.863 回答
42

以下是选择范围 A1 的两种解决方案。

Cells(1,1).Select '(row 1, column 1) 
Range("A1").Select

另请查看此链接;

我们强烈建议您使用 Range 而不是 Cells 来处理单元格和单元格组。它使您的句子更清晰,并且您不必记住 AE 列是第 31 列。

您将使用单元格的唯一时间是当您想要选择工作表的所有单元格时。例如: Cells.Select 选择所有单元格,然后清空您将使用的值或公式的所有单元格: Cells.ClearContents

--

“单元格”在动态设置范围和使用计数器循环范围时特别有用。使用字母作为列号定义范围在短期内可能更透明,但它也会使您的应用程序更加严格,因为它们是“硬编码”表示 - 不是动态的。

感谢金吉森

于 2012-10-31T12:00:27.783 回答
11

范围.整列

是的!你可以使用Range.EntireColumn MSDN

dim column : column = 4

dim column_range : set column_range = Sheets(1).Cells(column).EntireColumn

范围(“列名:列名”)

如果您在特定列之后,您可以使用语法创建一个硬编码的列范围,例如Range("D:D").

但是,我会使用整个列,因为它为以后更改该列提供了更大的灵活性。

工作表.列

Worksheet.Columns提供对工作表中列的范围访问。 MSDN

如果您想访问第一张表的第一列。您将调用Columns工作表上的函数。

dim column_range: set column_range = Sheets(1).Columns(1)

Columns属性也可在任何Range MSDN上找到

EntireRow如果您有单个单元格的范围但想到达该行上的其他单元格,这也很有用,类似于LOOKUP

dim id : id = 12345


dim found : set found = Range("A:A").Find(id)

if not found is Nothing then
    'Get the fourth cell from the match
    MsgBox found.EntireRow.Cells(4)
end if
于 2015-05-05T06:53:23.727 回答
5

这是 ConvertToLetter 函数的精简替换,理论上它应该适用于所有可能的正整数。例如,1412 产生“BBH”作为结果。

Public Function ColumnNumToStr(ColNum As Integer) As String
Dim Value As Integer
Dim Rtn As String
    Rtn = ""
    Value = ColNum - 1
    While Value > 25
        Rtn = Chr(65 + (Value Mod 26)) & Rtn
        Value = Fix(Value / 26) - 1
    Wend
    Rtn = Chr(65 + Value) & Rtn
    ColumnNumToStr = Rtn
End Function
于 2016-07-13T16:33:30.600 回答
2

如果您希望将列号转换为字母:

Function ConvertToLetter(iCol As Integer) As String
    Dim iAlpha As Integer
    Dim iRemainder As Integer
    iAlpha = Int(iCol / 27)
    iRemainder = iCol - (iAlpha * 26)
    If iAlpha > 0 Then
        ConvertToLetter = Chr(iAlpha + 64)
    End If
    If iRemainder > 0 Then
        ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
    End If
End Function

这样你可以做这样的事情:

Function selectColumnRange(colNum As Integer, targetWorksheet As Worksheet)
    Dim colLetter As String
    Dim testRange As Range
    colLetter = ConvertToLetter(colNum)
    testRange = targetWorksheet.Range(colLetter & ":" & colLetter).Select
End Function

该示例函数将选择整个列(即 Range("A:A").Select)

来源: http: //support.microsoft.com/kb/833402

于 2014-12-11T17:16:59.790 回答
1

我真的很喜欢 stackPusher 的 ConvertToLetter 函数作为解决方案。然而,在使用它时,我注意到由于数学中的一些缺陷,在非常特定的输入处发生了几个错误。例如输入392返回'N\',418返回'O\',444返回'P\'等。

我对函数进行了重新设计,结果为所有输入产生了正确的输出,直到 703(这是第一个三字母列索引,AAA)。

Function ConvertToLetter2(iCol As Integer) As String
    Dim First As Integer
    Dim Second As Integer
    Dim FirstChar As String
    Dim SecondChar As String

    First = Int(iCol / 26)
    If First = iCol / 26 Then
        First = First - 1
    End If
    If First = 0 Then
        FirstChar = ""
    Else
        FirstChar = Chr(First + 64)
    End If

    Second = iCol Mod 26
    If Second = 0 Then
        SecondChar = Chr(26 + 64)
    Else
        SecondChar = Chr(Second + 64)
    End If

    ConvertToLetter2 = FirstChar & SecondChar

End Function
于 2015-05-13T20:44:41.703 回答
1

这些答案似乎奇怪地令人费解。除非我遗漏了什么......如果你想将数字转换为字母,你可以使用 for 循环将它们全部存储在一个数组中,然后调用与该列字母关联的数字。像这样

For intloop = 1 To 26
    colcheck(intloop) = Chr$(64 + intloop)
    For lenloop = 1 To 26
        colcheck((intloop * 26) + lenloop) = Chr$(64 + intloop) & Chr$(64 + lenloop)
        For terloop = 1 To 26
            colcheck((intloop * 676) + (lenloop * 26) + terloop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop)
            For qualoop = 1 To 26
                colcheck((intloop * 17576) + (lenloop * 676) + (terloop * 26) + qualoop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop) & Chr$(64 + qualoop)
            Next qualoop
        Next terloop
    Next lenloop
Next intloop

然后只需使用 colcheck(yourcolumnnumberhere),您将获得与该字母关联的列标题(即 colcheck(703) = AAA

于 2016-02-05T21:46:52.630 回答
0

哈哈,可爱的 - 让我也包括我的 stackPusher 代码版本:)。我们在 C# 中使用此功能。适用于所有 Excel 范围。:

public static String ConvertToLiteral(int number)
{
        int firstLetter = (((number - 27) / (26 * 26))) % 26;
        int middleLetter = ((((number - 1) / 26)) % 26);

        int lastLetter = (number % 26);
        firstLetter = firstLetter == 0 ? 26 : firstLetter;
        middleLetter = middleLetter == 0 ? 26 : middleLetter;
        lastLetter = lastLetter == 0 ? 26 : lastLetter;
        String returnedString = "";
        returnedString = number > 27 * 26 ? (Convert.ToChar(firstLetter + 64).ToString()) : returnedString;
        returnedString += number > 26 ? (Convert.ToChar(middleLetter + 64).ToString()) : returnedString;
        returnedString += lastLetter >= 0 ? (Convert.ToChar(lastLetter + 64).ToString()) : returnedString;
        return returnedString;
}
于 2015-12-22T12:01:06.323 回答
0
Function fncToLetters(vintCol As Integer) As String

        Dim mstrDigits As String

    ' Convert a positive number n to its digit representation in base 26.
    mstrDigits = ""
    Do While vintCol > 0
        mstrDigits = Chr(((vintCol - 1) Mod 26) + 65) & mstrDigits
        vintCol = Int((vintCol - 1) / 26)
    Loop

    fncToLetters = mstrDigits

End Function
于 2020-01-18T09:42:31.950 回答
0

如果您不知道最后一行或最后一列是什么,但仍想使用 Range

LastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
LastColumn = ActiveSheet.Cells(7, ActiveSheet.Columns.Count).End(xlToLeft).Column

'Column Transform number in Letter
Col_Letter = Split(Cells(1, LastColumn).Address(True, False), "$")(0)
x_range = "A1:"
y_range = Col_Letter & Trim(Str(LastRow))

'Set the range
rng_populated = x_range & "" & y_range

'Select the range
Range(rng_populated).Select
于 2021-12-03T15:11:21.070 回答