Подтвердить что ты не робот

Создавать диапазоны excel, используя номера столбцов в vba?

Как можно создать диапазон в vba, используя номер столбца, а не букву?

4b9b3361

Ответ 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

enter image description here

Ответ 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;
}