如何使用列号而不是字母在 vba 中创建范围?
10 回答
要引用单元格范围,您可以使用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
以下是选择范围 A1 的两种解决方案。
Cells(1,1).Select '(row 1, column 1)
Range("A1").Select
另请查看此链接;
我们强烈建议您使用 Range 而不是 Cells 来处理单元格和单元格组。它使您的句子更清晰,并且您不必记住 AE 列是第 31 列。
您将使用单元格的唯一时间是当您想要选择工作表的所有单元格时。例如: Cells.Select 选择所有单元格,然后清空您将使用的值或公式的所有单元格: Cells.ClearContents
--
“单元格”在动态设置范围和使用计数器循环范围时特别有用。使用字母作为列号定义范围在短期内可能更透明,但它也会使您的应用程序更加严格,因为它们是“硬编码”表示 - 不是动态的。
感谢金吉森
范围.整列
是的!你可以使用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
这是 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
如果您希望将列号转换为字母:
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
我真的很喜欢 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
这些答案似乎奇怪地令人费解。除非我遗漏了什么......如果你想将数字转换为字母,你可以使用 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
哈哈,可爱的 - 让我也包括我的 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;
}
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
如果您不知道最后一行或最后一列是什么,但仍想使用 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