Страница 1 из 1
Excel - туда и обратно
Добавлено: 10 Май 2009, 9:18
Игорь Столяров
Привет всем и с днем Победы !
Есть задача - преобразовать номер колонки в MS Excel в ее наименование.
Т.е. число (1,2,3,4 ... 26,27,28 .... 16383,16384) в строку формата (A,B,C,D ... Z,AA,AB ...,XFC,XFD)
По идее должно работать преобразование в из 10-ой в 26-ричную систему счисления.
Но, что-то ничего не получается ...
Если кто-нибудь сталкивался с задачей - подскажите пожалуйста алгоритм.
Заранее спсибо !
P.S. И что обидно - обратная задача (преобразование имени в число) решается элементарно ...
Re: Excel - туда и обратно
Добавлено: 11 Май 2009, 11:48
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])
Re: Excel - туда и обратно
Добавлено: 11 Май 2009, 14:17
Игорь Столяров
Спасибо - сделал на основании полученного кода:
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
Проверено - работает на всем диапазоне ячеек !

Re: Excel - туда и обратно
Добавлено: 21 Май 2009, 17:33
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))