Как можно создать диапазон в vba, используя номер столбца, а не букву?
Создавать диапазоны excel, используя номера столбцов в vba?
Ответ 1
Ниже приведены два варианта выбора диапазона A1.
Cells(1,1).Select '(row 1, column 1)
Range("A1").Select
Также проверьте эту ссылку;
Мы настоятельно рекомендуем использовать Range вместо Cells для работы с клеток и групп клеток. Это делает ваши предложения более ясными и вы не обязаны помнить, что столбец AE - столбец 31.
Единственный раз, когда вы будете использовать ячейки, - это когда вы хотите выбрать все ячейки рабочего листа. Например: Cells.Select Выбрать все и затем очистить все ячейки значений или формул, которые вы будете использовать: Cells.ClearContents
-
"Ячейки" особенно полезны при динамическом диапазоне диапазонов и перемещая диапазоны с помощью счетчиков. Определение диапазонов с использованием буквы в виде номеров столбцов могут быть более прозрачными в краткосрочной перспективе, но это также сделает ваше приложение более жестким, так как они "трудны" закодированные "представления - не динамические.
Благодаря Ким Гисен
Ответ 2
В диапазон ссылок я могу использовать 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
Ответ 3
Range.EntireColumn
Да! Вы можете использовать Range.EntireColumn
MSDN
dim column : column = 4
dim column_range : set column_range = Sheets(1).Cells(column).EntireColumn
Range ( "ColumnName: ColumnName" )
Если вы столкнулись с определенным столбцом, вы можете создать диапазон жестко закодированных столбцов с синтаксисом, например. Range("D:D")
.
Однако я бы использовал весь столбец, поскольку он обеспечивает большую гибкость для изменения этого столбца позднее.
Worksheet.Columns
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
Ответ 4
Если вы хотите преобразовать номер столбца в букву:
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
Эта примерная функция выберет весь столбец (т.е. диапазон ( "A: A" ). Выберите)
Источник: http://support.microsoft.com/kb/833402
Ответ 5
Вот конденсированная замена функции 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
Ответ 6
Мне действительно нравится функция 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
Ответ 7
Эти ответы кажутся странно запутанными. Если мне не хватает чего-то... если вы хотите преобразовать числа в буквы, вы можете просто запасать их все в массиве с помощью цикла 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
Ответ 8
Ха-ха, Lovely - позвольте мне также включить мою версию кода stackPusher:). Мы используем эту функцию в С#. Работает отлично для всех диапазонов 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;
}