在VBA中使用列号创建Excel区域?

58

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

11个回答

88

要引用单元格范围,可以使用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

这里输入图片描述


43

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

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

同时请查看此链接;

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

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

--

“Cells”在动态设置范围并通过计数器循环遍历范围时特别有用。使用字母作为列号定义范围可能在短期内更透明,但它也会使您的应用程序更加僵硬,因为它们是“硬编码”的表示方式,而不是动态的。

感谢Kim Gysen


25
请注意,您也可以使用Cells(1, "A") :) - JMax
7
“Cells”在动态设置范围和使用计数器循环遍历范围时特别有用。使用字母作为列编号来定义范围可能会更加透明,但这也会使您的应用程序变得更加僵化,因为它们是“硬编码”表示 - 不是动态的。 - html_programmer
1
这如何帮助您创建命名范围?您肯定需要使用函数将数字+偏移量转换为“ A”吧?例如,Sheet1.Names.Add“text_label_for_range”,Sheet1.Range(<从数字转换的字母>&“:”&<从数字转换的字母>) - adolf garlic
1
他说“列应该用数字而不是字母”,而你发布了一个包含“A1”的答案,难道你是假设十六进制数字吗?! - adolf garlic
1
@adolfgarlic,他不想要一个命名区域,只是想引用一个范围而不使用列字母(例如Range("A1")=Cells(1,1))。 - CustomX
显示剩余4条评论

11

Range.EntireColumn

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

dim column : column = 4

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

Range("ColumnName:ColumnName")

如果你想要访问某一列,你可以使用硬编码的列区间语法,例如 Range("D:D")

然而,我建议使用整个列范围,因为它提供了更多灵活性,可以在以后更改该列。

Worksheet.Columns

Worksheet.Columns 提供对工作表中某一列的区域访问。 MSDN

如果您想要访问第一个工作表的第一列,则需要在工作表上调用 Columns 函数。

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

Columns属性也适用于任何Range MSDN

如果您有单个单元格的范围,但想要访问行上的其他单元格,类似于LOOKUP,那么EntireRow也可能有用。

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

6

以下是一种简化的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

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

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(您的列号)即可获取与该字母相关联的列标题(即colcheck(703) = AAA)。


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

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;
}

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

2
当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何帮助,特别是对于已经有被接受答案的问题,那么您的答案将对其他StackOverflow用户更有用。请参阅:如何撰写好的答案 - David Buck

0

如果你不知道最后一行或列是什么,但仍想获取范围,请使用

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

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