Excel - туда и обратно

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Excel - туда и обратно

Сообщение Игорь Столяров »

Привет всем и с днем Победы !

Есть задача - преобразовать номер колонки в MS Excel в ее наименование.
Т.е. число (1,2,3,4 ... 26,27,28 .... 16383,16384) в строку формата (A,B,C,D ... Z,AA,AB ...,XFC,XFD)

По идее должно работать преобразование в из 10-ой в 26-ричную систему счисления.
Но, что-то ничего не получается ... :(

Если кто-нибудь сталкивался с задачей - подскажите пожалуйста алгоритм.
Заранее спсибо !

P.S. И что обидно - обратная задача (преобразование имени в число) решается элементарно ...
Make Clarion Great Again ! 😎
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Re: Excel - туда и обратно

Сообщение Andrew Listiev »

Приветствую! С праздником!

Пробуй это:

Код: Выделить всё

!--------------------------------------------------------------------------------------------
! Definition : ClaUtil.longToAny()
! Parameters : LONG InputLong - long integer which must be convert to presentation based on iBase
!               (InputBase = 16 - hexdecimal presentation
!                InputBase = 8 - octal presentation and etc.)
!              BYTE InputBase - base for decoding (if omitted, then iBase = 16)
!                   InputBase range is 2-36, other value ignored and returned '_INVALID_BASE_'
!              BYTE StringLength - length of returned string, must be in range 1-32, other
!                   value ignored and returned '_INVALID_LENGTH_'
! Returns    : STRING - presentation of input iLong
! Description: Return String() - hexdecimal presentation of input parameter iLong,
!              with leading "0"
!--------------------------------------------------------------------------------------------
ClaUtil.longToAny     Procedure(Long InputLong, Byte InputBase = 16, Byte StringLength)
tBase36    STRING('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
tResultString   STRING('0{32}')
  CODE
    if InputBase > 36 OR InputBase < 2; Return('_INVALID_BASE_') .
    if StringLength > 32 OR StringLength < 1; Return('_INVALID_LENGTH_') .
    idx# = 32
    ndx# = 0
    delta# = InputBase
    loop While InputLong > delta#
       ndx# = InputLong % delta#
       tResultString[idx#] = tBase36[ndx# + 1]
       InputLong = INT(InputLong / delta#)
       idx# -= 1
    end
    tResultString[idx#] = tBase36[InputLong + 1]

    Return(tResultString[ 32 - StringLength + 1 : 32])
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Excel - туда и обратно

Сообщение Игорь Столяров »

Спасибо - сделал на основании полученного кода:

GetABC Procedure(Column_)
XResult String(3)
Code

If (Column_ > 0) and (Column_ < 16385)
Column_ -= 1 ! Номера колонок должны начинаться с нуля
Clear(XResult) ! Очистили строку с результатом
Loop While Column_ >= 26
XResult = Chr((Column_ % 26) + 65) & Clip(XResult)
Column_ = Int(Column_ / 26) - 1
end
Return(Clip(Left(Chr(Column_+ 65) & Clip(XResult))))
else
Return('???')
end

Проверено - работает на всем диапазоне ячеек ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Excel - туда и обратно

Сообщение WadimZapara »

! по номеру столбца возвращает его литерное имя 1->A, 2->B, 3->C, 4->D
NameOfColumn Function(Short Num) !,String
Name CString(2)
x Short
Code
Num -= 1
x = Num / 26
If x Then Name = Chr(64 + x).
Return (Name & Chr(65 + Num % 26))
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Ответить