用vba中的列号创buildexcel范围?

如何使用列号而不是字母来创buildvba范围?

以下是select范围A1的两种解决scheme。

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

也检查这个链接;

我们强烈build议您使用“范围”而不是“单元格”来处理单元格和单元格组。 这使得你的句子更清晰,你不必被记住那栏AE是第31栏。

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

当使用计数器dynamic设置范围和循环范围时,“单元格”特别有用。 使用字母作为列号来定义范围在短期内可能会更加透明,但是它也会使您的应用程序更加僵化,因为它们是“硬编码”表示 – 不是dynamic的。

感谢Kim Gysen

要引用单元格的范围,可以使用Range(Cell1,Cell2),sample:

 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 

在这里输入图像描述

Range.EntireColumn

是! 您可以使用Range.EntireColumn MSDN

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

范围( “的ColumnName为:ColumnName”)

如果您在特定列之后,则可以使用Range("D:D")语法创build硬编码的列范围。

但是,我会使用整个列,因为它提供了更多的灵活性,以便稍后更改该列。

Worksheet.Columns

Worksheet.Columns提供对工作表中的列的范围访问权限。 MSDN

如果您想访问第一张表的第一列。 您可以调用工作表上的“ Columnsfunction。

 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 

如果你想把你的列号转换成一个字母:

 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 

该示例函数将select整个列(即范围(“A:A”)。select)

来源: http : //support.microsoft.com/kb/833402

下面是ConvertToLetter函数的一个精简replace,理论上它应该适用于所有可能的正整数。 例如,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 

我真的很喜欢stackPusher的ConvertToLetter函数作为解决scheme。 但是,在处理这个问题时,我注意到由于math上的一些缺陷,在非常特定的input中出现了一些错误。 例如,input392返回“N \”,418返回“O \”,444返回“P \”等。

我重新编写了这个函数,结果产生了所有input到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#中使用这个function。 适用于所有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; }