![](/img/trans.png)
[英]Excel VBA: How to convert ranges to numbers and get output in a column as list
[英]Create excel ranges using column numbers in vba?
如何使用列號而不是字母在 vba 中創建范圍?
要引用單元格范圍,您可以使用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)
我真的很喜歡 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.