簡體   English   中英

使用 vba 中的列號創建 excel 范圍?

[英]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)

來源: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM