Как перейти от строки, столбца к нотации Excel A1?

Учитывая строку и столбец (как долго), как вы можете определить нотацию электронной таблицы с помощью VBA в Excel (2007):

e.g.:

(R, C) = (1, 1) -> "A1"
(R, C) = (2, 1) -> "A2"
(R, C) = (2, 2) -> "B2"

Таким образом, если у вас есть функция:

Function CellRef(R As Long, C As Long) As String

который предоставил эту функциональность, вы могли бы сделать что-то вроде:

Worksheet.Range(CellRef(R1, C1) + ":" + CellRef(R2, C2)).Copy

Небольшая предыстория, если это неправильный подход: цель этого состоит в том, что у меня есть мастер-лист, который описывает другие рабочие листы в таблице:

WorksheetName, Range etc....

Этот мастер-лист управляет преобразованиями на листе, но значение диапазона, очевидно, указано в нотации Excel для удобного последующего использования при ссылке на диапазон. Однако подпрограмма для управления этой таблицей, сообщения об исключениях и обеспечения согласованности действительно получает данные из других листов в строке и столбце, поэтому, например, она получает строку и столбец, где она знает, что что-то начинается и заканчивается.

Вот функция, которую я получил:

Private Function CellRef(R As Long, C As Long) As String
    CellRef = vbNullString
    On Error GoTo HandleError:
    CellRef = Replace(Mid(Application.ConvertFormula("=R" & R & "C" & C, XlReferenceStyle.xlR1C1, XlReferenceStyle.xlA1), 2), "$", "")
    Exit Function
HandleError:
End Function

person Cade Roux    schedule 11.07.2009    source источник


Ответы (5)


Возможно, это то, что вы ищете?

person Jimmy Chandra    schedule 11.07.2009
comment
+1. Что ж, публикация части этого кода здесь или хотя бы объяснение того, как это делается, поможет. (Гнилость ссылок когда-нибудь может сделать этот ответ менее полезным) :) - person Anirudh Ramanathan; 23.09.2012

Числа столбцов в буквы

От букв столбца к цифрам

Всё хорошее в комментариях

person Dick Kusleika    schedule 12.07.2009
comment
Вау, крутая штука. Однако я не уверен, что какой-либо из них лучше, чем то, что я придумал на основе Application.ConvertFormula, найденного в первом ответе. - person Cade Roux; 12.07.2009
comment
Согласованный. Я просто включил для полноты. - person Dick Kusleika; 13.07.2009
comment
Отличный блог у вас получился ;) - person onedaywhen; 14.07.2009

http://support.microsoft.com/kb/833402 — это решение Microsoft для проблемы преобразование чисел в буквы (сложная часть преобразования из 1,1 в A1). Это на самом деле имеет красоту работы в других приложениях, чем Excel, поскольку он опирается на базовый VBA.

Затем вы добавляете:

' Converts row and column index to Excel notation, ie (3, 2) to B3.
Private Function generateExcelNotation(row As Integer, column As Integer) As String
    ' error handling of your choice, I go for returning an empty string
    If (row < 1 Or column < 1) Then
        generateExcelNotation = ""
        Exit Function
    End If
    generateExcelNotation = ConvertToLetter(column) & row
End Function
person Mr. Napik    schedule 12.03.2014

Выражение 'rngTemp.Address(False, False, , , .Cells(1, 1))' будет отображать адрес диапазона rngTemp в нотации A1, которая не содержит $s для обозначения абсолютного адреса. Чтобы получить абсолютный адрес, замените «False, False» на «,».

person OneSkyWalker    schedule 18.01.2019

Вот два решения. Один с элегантной универсальностью, другой простой и прямой, направленный на текущую реализацию Excel. Первый ограничен только точностью типа данных Integer или Long. Второй вызов завершится ошибкой, если максимальное количество столбцов превысит 18 278 – точку, в которой ссылки на столбцы изменяются с трех букв на четыре. Оба являются чистым VBA без зависимости от функции, характерной для приложения MS Office.

Ссылки на столбцы рассматриваются как последовательные наборы чисел по основанию 26 с заданным количеством цифр с алфавитом, выступающим в виде цифр A = 0, B = 1 и т. д. Сначала есть 26 столбцов с одной буквой. Тогда 26 ^ 2 = 676 столбцов с двойными буквами, Затем 26 ^ 3 = 17 576 столбцов с тройными буквами, всего 18 278, из которых только 16 384 используются Excel.

A1,B1,...,Z1 (1-26, 26 столбцов)

AA1,....,ZZ1,(от 27 до 702, 26^2 = 676 столбцов)

AAA1,...,XFD1 (от 703 до 16384, 15682 столбца из 26^3 = 17576 возможных с тремя буквами)

Это первое решение. В настоящее время максимальный номер столбца — 16384, поэтому код будет работать с целым числом (верхний предел 32767) вместо длинного. Если хотите, вы можете проверить, что параметр столбца C не выходит за пределы допустимого диапазона.

    '
    ' A "pure" implementation limited only by precision of the Long integer data type    
    '     
    '
    ' The first step is to find how many letters are needed.
    ' the second is to translate the column index into 0..(26^n) - 1  range
    ' Finally render that value as a base 26 number using alphabet for digits
    '


       Public Function CoordToA1Cell(ByVal R As Long, ByVal C As Long) As String
        Dim colRef As String
        Dim cwork As Long
        Dim n As Integer
        '
        Static e(0 To 6) As Long ' powers of 26
        Static s(0 To 6) As Long ' index ranges for number of letters needed

    If C <= 0 OR R <= 0 Then Exit Function

        ' initialize on first call
           If e(0) = 0 Then ' first call
              s(0) = 1
              e(0) = 1
              For n = 1 To UBound(s)
                e(n) = 26 * e(n - 1)
                s(n) = s(n - 1) + e(n)
              Next n
           End If

           cwork = C
           colRef = ""
        '
        ' step one: discover how many letters are needed
        '
           n = 1
           Do
              If C < s(n) Then
                 n = n - 1
                 Exit Do
              End If
              n = n + 1
           Loop
        ' step two: translate into 0..(26^n) - 1 interval
           cwork = cwork - s(n)
        '
        ' Step three: represent column index in base 26 using alphabet for digits
        '
           Do While n > 0
             colRef = colRef & Chr(65 + cwork \ e(n))
             cwork = cwork Mod e(n)
             n = n - 1
           Loop
        ' the final (or only) digit
           colRef = colRef & Chr(65 + cwork)

        CoordToA1Cell = colRef & R

        End Function

Этот второй простой («Быстрый и грязный») и будет работать с текущим Excel. Это потребует серьезной модификации, если максимальное количество столбцов превысит 18278, когда ссылка на столбец изменится с 3 на 4 буквы. '

Public Function CoordToA1CellQAD(ByVal R As Long, ByVal C As Long) As String
Dim colRef As String
Dim cwork As Long

If C <= 0 OR R <= 0 Then Exit Function

cwork = C

If cwork <= 26 Then
   colRef = Chr(64 + cwork)
ElseIf cwork <= 26 * 26 + 26 Then
   cwork = cwork - (26 + 1)
   colRef = Chr(65 + (cwork \ 26)) & Chr(65 + (cwork Mod 26))
'ElseIf cwork <= 26 * 26 * 26 + 26 * 26 + 26 Then  ' theoretical limit for three letters, 17576
ElseIf cwork <= 16384 Then                         ' actual Excel limit for columns
   cwork = cwork - (26 * 26 + 26 + 1)
   colRef = Chr(65 + (cwork \ 676))
   cwork = cwork Mod 676
   colRef = colRef & Chr(65 + (cwork \ 26)) & Chr(65 + (cwork Mod 26))
Else ' overflow
   Exit Function
End If

CoordToA1CellQAD = colRef & R

End Function
person RDeLisle    schedule 26.04.2020