Блог о математике, программировании, алгоритмах. И немного о работе операционной системы Linux.

вторник, 18 октября 2011 г.

Tips & Tricks #4. Функция переводящая координаты Excel ячейки во внутренний адрес

Недавно, волею судеб, мне пришлось писать Excel-приложение. В процессе работы с таблицей, очень часто возникает необходимость обращаться к ячейкам или диапазонам по их адресу. Иногда удобнее обращаться к ячейкам по координатам. Почему-то мне не удалось использовать формат адресов "R1C1". При попытке сказать:
    Worksheets(1).Range("R1C1").Value = "Hello, World"
вылезала ошибка номер 1004 "Application-defined or object-defined error". В голову пришла идея написать функцию для преобразования координат ячейки или диапазона в его классическое Excel пердставление (знаменитые "A1:B2"). В общем-то вот она. Может быть кому-нибудь пригодится.
' Возвращает Excel адрес ячейки по её координатам, если правый нижний угол не задан,
' возвращает адрес ячейки, если задан - адрес диапазона
Function Addr(nLeft As Long, nTop As Long, _
                     Optional nRight As Long = -1, _
                     Optional nBottom As Long = -1) As String
    Dim sCol As String
    Dim nK1 As Integer, nK2 As Integer
    If (nLeft > 256 Or nRight > 256) Then
        Addr = ""
        Exit Function
    End If
    If (nTop > 65536 Or nBottom > 65536) Then
        Addr = ""
        Exit Function
    End If
    If (nLeft <= 26) Then
        sCol = Chr(Asc("A") + ((nLeft - 1) Mod 26))
    Else
        sCol = Chr(Asc("A") + ((nLeft - 27) \ 26)) + Chr(Asc("A") + ((nLeft - 1) Mod 26))
    End If
    Addr = sCol + CStr(nTop)
    If (nRight > 0 And nBottom > 0) Then
        If (nRight <= 26) Then
            sCol = Chr(Asc("A") + ((nRight - 1) Mod 26))
        Else
            sCol = Chr(Asc("A") + ((nRight - 27) \ 26)) + Chr(Asc("A") + ((nRight - 1) Mod 26))
        End If
        Addr = Addr + ":" + sCol + CStr(nBottom)
    End If
End Function

Комментариев нет:

Отправить комментарий