Страницы: 1 2 След.
RSS
Как по номеру столбца узнать его букву (VBA)?
 
Ну, собственно, вопрос - в заголовке...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Не придумал ничего лучше, чем это:  
 
Sub test()  
   Debug.Print БукваСтолбца(6)  
End Sub  
 
Function БукваСтолбца(ByVal col As Long) As String  
   On Error Resume Next  
   БукваСтолбца = Application.ConvertFormula("rc" & col, xlR1C1, xlA1)  
   БукваСтолбца = Replace(Mid(БукваСтолбца, 2), 1, "")  
End Function  
 
Вопрос - а нафига это нужно?
 
А таблицу соответствий в ВБА можно сделать?  
Ну там {1:А;2:В;...}
 
{quote}{login=Alex_ST}{date=10.09.2010 10:57}{thema=Как по номеру столбца узнать его букву (VBA)?}{post}Ну, собственно, вопрос - в заголовке...{/post}{/quote}  
Есть только алгоритм функции на другом языке но переделать можно  
int целая часть  
clip(left аналог trim и тд  
If (Num > 0) and (Num < 16385)  
 Num -= 1 ! Номера колонок должны начинаться с нуля  
 Clear(Name) ! Очистили строку с результатом  
 Loop While Num >= 26  
 Name = Chr((Num % 26) + 65) & Clip(Name)  
 Num = Int(Num / 26) - 1  
 end  
 Return(Clip(Left(Chr(Num+ 65) & Clip(Name))))  
  else  
 Return('???')  
 end
 
Немного ошибся - правильно будет так:  
 
Sub test()  
   Debug.Print БукваСтолбца(6)  
End Sub  
 
Function БукваСтолбца(ByVal col As Long) As String  
   On Error Resume Next  
   БукваСтолбца = Application.ConvertFormula("r1c" & col, xlR1C1, xlA1)  
   БукваСтолбца = Replace(Replace(Mid(БукваСтолбца, 2), "$", ""), "1", "")  
End Function
 
Спасибо.  
Сейчас попробую.  
А нужно мне это чтобы при обработкой макросом введённых юзером в таблицу данных можно было сказать ему, что, например, "Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5"
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Спасибо большое, Учитель джедаев!  
Как всегда элегантно и просто!  
Всё отлично работает.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алексей, так может легче и быстрее методом "Find" воспользоваться?
<FONT COLOR="CadetBlue">
 
{quote}{login=Дъмитръ}{date=10.09.2010 11:40}{thema=}{post}... методом "Find" воспользоваться?{/post}{/quote}  
Не понял, для чего?  
Что и где искать?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.09.2010 11:20}{thema=}{post}А нужно мне это чтобы... {/post}{/quote}  
Алекс, а Address разве не устроит?
 
"Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5" + Юрия предложение. :)  
 
Кусочик примера.  
-----------------  
'...  
Set FindText = Range(Cells(1, 5), Cells(Cells(Rows.Count, 5).End(xlUp).Row, _  
5)).Find(What:=ActiveCell.Text, LookIn:=xlValues, LookAt:=xlWhole, _  
'...  
-----------------
<FONT COLOR="CadetBlue">
 
Блин...  
Старею. Склероз+переклин...  
И в самом деле, всё же элементарно: Replace(Address,"$","")  
Мало того, что сам затупил, так ещё и Йодо запутал...  
Спасибо за F1
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
___________
 
Алексей... :)  
 
Не надо:  
Replace(Address,"$","")  
 
Надо так:  
Address = ActiveCell.Address(False, False)  
 
Пятница наверное, отдыхать пора. ;)
<FONT COLOR="CadetBlue">
 
{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post} Склероз+переклин...  
И в самом деле, всё же элементарно: Replace(Address,"$","")  
Мало того, что сам затупил, так ещё и Йодо запутал...  
Спасибо за F1{/post}{/quote}  
1. Дело не в склерозе.  
Вы решили сэкономить слова на формулировке задачи.  
Подробно бы описали, что вам надо, - получили бы простой и внятный ответ.  
 
 
2. Я вас не запутывал.  
Я дал точный ответ на сформулированную вами задачу. (как из числа получить букву)  
То, что вы забыли объяснить, для чего это нужно, - это уже не мои проблемы.  
Я, конечно, догадывался, что мудрить с вычислением буквы тут совсем не надо,  
и есть более простые решения, - но задавать кучу наводящих вопросов как-то не хотелось  
(вы всё же не первый день на форуме - могли бы и точнее формулировать вопросы)
 
Да, точно!  
Отдыхать пора.    
К стати, я с понедельника в отпуске!!!  
Уеду на 2 недели в Турцию в бунгало на Ultra All Inclusive  
Да при таком как там количестве халявных (ну, в смысле: "за всё уже уплочено") напитков русский язык бы за 2 недели не забыть, а про бэйсик я уже молчу...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post}Мало того, что сам затупил, так ещё и Йодо запутал...{/post}{/quote}  
Ну вот, поскупился на слова и получилось "казнить нельзя помиловать"...  
 
Моя реплика должна была, естественно, звучать так:  
"Мало того, что сам затупил, так ещё и глубокоуважаемого учителя EducatedFool запутал своими необдуманными вопросами..."  
так понятно, кто кого запутал?  
 
Посыпаю голову пеплом и бьюсь лбом об стол (между "клавой" и мышкой, конечно).
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Ну вот, уезжаете и еще уважаемого EducatedFool обидели, хотя и ему пора отдыхать, переработался. :)
<FONT COLOR="CadetBlue">
 
Привет всем.  
Будучи в командировке, оторванным от инета, вспомнил название этой темы и решил поэкспериментировать. В принципе, это классическая задача о переводе числа в другую систему счисления, что видно из примера Nicks.  
У меня получилась такая функция:  
 
Function Num2ABC(ByVal x As Long) As String  
Do  
   Num2ABC = Chr$(64 + x Mod 26) & Num2ABC  
   x = x \ 26  
Loop Until x = 0  
End Function  
 
Она работает в 25 раз быстрее, чем функция, основанная на Application.ConvertFormula.
 
Узнаём имя 6-го столбца  
 
MsgBox Split(Cells(1, 6).Address, "$")(1)  
 
 
P.S. Скорость не замерял
 
Высший пилотаж! Спасибо!
 
В связи с проявленным интересом к этой теме ( http://programmersforum.ru/showthread.php?t=166788 ), выкладываю функцию для обратного преобразования, "заголовка столбца" в число. В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов:  
 
?ABC2Num("a")  
1    
?ABC2Num("iv")  
256    
?ABC2Num("xfd")  
16384    
?ABC2Num("abcdefghijk")  
152686330658691    
 
Два варианта функции, один с разбором строки по символам, другой - через массив байт. Мой результат (Pentium M 1.6, WinXP, Office 2000):  
 
символы:  4,1875    
байты:  1,828125    
 
Function ABC2Num(ByVal x As String) As Double  
Dim i&  
x = UCase(x)  
For i = 1 To Len(x)  
   ABC2Num = 26# * ABC2Num + Asc(Mid$(x, i, 1)) - 64#  
Next  
End Function  
 
Function ABC2Num2(x As String) As Double  
Dim i&, b() As Byte  
b = x  
For i = 0 To UBound(b) Step 2  
   ABC2Num2 = 26 * ABC2Num2 + (b(i) And 31)  
Next  
End Function  
 
Sub test()  
Dim a#, t!, i&  
t = Timer  
For i = 1 To 1000000  
   ABC2Num "abcdefghijk"  
Next  
Debug.Print "символы: "; Timer - t  
t = Timer  
For i = 1 To 1000000  
   ABC2Num2 "abcdefghijk"  
Next  
Debug.Print "байты: "; Timer - t  
End Sub
 
Прошу прощения, а зачем оно может понадобиться?)  
 
Sub io()  
MsgBox Columns(1).Address  
End Sub  
 
Sub io2()  
MsgBox Columns("A").Column  
End Sub  
 
>>В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов:  
хотя...
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
для разнообразия немного изварщеный вариант  
 
Public Function xlsColName(j As Integer) As String  
On Error GoTo xlsColNameError  
Dim nCycle As Long  
Dim kkkk As Long  
Dim llll As Long  
Dim tmpRes As String  
Dim i As Integer  
Dim osnova As Long  
 
   osnova = 26  
   'Кол-во разрядов    nCycle = -1  
   i = 1  
   While i > 0  
       nCycle = nCycle + 1  
       i = (j - osnova ^ (nCycle - 1)) \ osnova ^ nCycle  
   Wend  
   kkkk = j - 1  
   For i = nCycle To 1 Step -1  
       llll = kkkk \ osnova ^ (i - 1)  
       If i > 1 Then  
           tmpRes = tmpRes + Chr(65 + llll - 1)  
       Else  
           tmpRes = tmpRes + Chr(65 + llll)  
       End If  
       kkkk = kkkk - llll * osnova ^ (i - 1)  
   Next i  
   xlsColName = tmpRes  
     
   GoTo xlsColNameEnd  
 
xlsColNameError:  
   MsgBox err.Description  
   Resume xlsColNameEnd  
xlsColNameEnd:  
 
End Function  
Public Function xlsColIndex(Name As String) As Integer  
On Error GoTo xlsColIndexError  
Dim nCycle As Long  
Dim kkkk As String  
Dim i As Integer  
Dim tmpRes As Integer  
 
   'Кол-во кругов  
   nCycle = Len(Name)  
   For i = nCycle To 1 Step -1  
       kkkk = Mid(Name, i, 1)  
       tmpRes = tmpRes + 26 ^ (nCycle - i) * (Asc(kkkk) - 65 + 1)  
   Next i  
   xlsColIndex = tmpRes  
     
   GoTo xlsColIndexEnd  
 
xlsColIndexError:  
   MsgBox err.Description  
   Resume xlsColIndexEnd  
xlsColIndexEnd:  
 
End Function
 
Нормальные герои всегда идут в обход :)
 
А что означает (1) ? Посмотрел в справке функцию Split и не нашёл объяснения. Вот как можно было прийти к тому, что в конце нужно добавить (1), чтобы получить такое элегантное решение? )))
Hello! My blog: TRADING WAY
 
В скобках порядковый номер элемента массива (отсчёт с нуля).
 
Cells(1, 6).Address будет $F$1  
Split(Cells(1, 6).Address, "$")(1) будет F  
Split(Cells(1, 6).Address, "$")(2) будет 1
 
Ещё пример:  
Sub TestArr()  
Dim Stroka  
Stroka = "Первый второй третий"  
MsgBox Split(Stroka)(1)  
End Sub
 
Спасибо за примеры. То есть, если разделитель не указан, то в качестве разделителя выступает пробел, если он есть. Если же нет ни одного пробела, то в массиве один элемент. В качестве разделителей выступают любые указанные знаки. Правильно?
Hello! My blog: TRADING WAY
Страницы: 1 2 След.
Читают тему
Наверх