繁体   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