Vba excel буква колонки по номеру

This function returns the column letter for a given column number.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

testing code for column 100

Sub Test()
    MsgBox Col_Letter(100)
End Sub

Stevoisiak's user avatar

Stevoisiak

22.8k27 gold badges122 silver badges219 bronze badges

answered Oct 9, 2012 at 9:44

brettdj's user avatar

5

If you’d rather not use a range object:

Function ColumnLetter(ColumnNumber As Long) As String
    Dim n As Long
    Dim c As Byte
    Dim s As String

    n = ColumnNumber
    Do
        c = ((n - 1) Mod 26)
        s = Chr(c + 65) & s
        n = (n - c)  26
    Loop While n > 0
    ColumnLetter = s
End Function

answered Mar 12, 2013 at 16:37

robartsd's user avatar

robartsdrobartsd

1,3901 gold badge9 silver badges15 bronze badges

7

Something that works for me is:

Cells(Row,Column).Address 

This will return the $AE$1 format reference for you.

answered Nov 21, 2013 at 21:00

Damian Fennelly's user avatar

2

I'm surprised nobody suggested:   Columns(Column Index).Address

  • For example: MsgBox Columns( 9347 ).Address returns $MUM:$MUM.

To return ONLY the column letter(s): Split((Columns(Column Index).Address(,0)),":")(0)

  • For example: MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) returns DAD.

  More Examples


answered Mar 30, 2018 at 15:22

ashleedawg's user avatar

ashleedawgashleedawg

20k8 gold badges73 silver badges104 bronze badges

2

And a solution using recursion:

Function ColumnNumberToLetter(iCol As Long) As String

    Dim lAlpha As Long
    Dim lRemainder As Long

    If iCol <= 26 Then
        ColumnNumberToLetter = Chr(iCol + 64)
    Else
        lRemainder = iCol Mod 26
        lAlpha = Int(iCol / 26)
        If lRemainder = 0 Then
            lRemainder = 26
            lAlpha = lAlpha - 1
        End If
        ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
    End If

End Function

answered Nov 27, 2013 at 10:31

Nikolay Ivanov's user avatar

Nikolay IvanovNikolay Ivanov

5,1191 gold badge26 silver badges22 bronze badges

5

Just one more way to do this. Brettdj’s answer made me think of this, but if you use this method you don’t have to use a variant array, you can go directly to a string.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

or can make it a little more compact with this

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

Notice this does depend on you referencing row 1 in the cells object.

Stevoisiak's user avatar

Stevoisiak

22.8k27 gold badges122 silver badges219 bronze badges

answered May 23, 2014 at 15:22

OSUZorba's user avatar

OSUZorbaOSUZorba

1,07911 silver badges13 bronze badges

0

This is available through using a formula:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

and so also can be written as a VBA function as requested:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function

answered Dec 9, 2014 at 12:08

Alistair Collins's user avatar

Alistair CollinsAlistair Collins

2,2005 gold badges25 silver badges44 bronze badges

This is a version of robartsd’s answer (with the flavor of Jan Wijninckx’s one line solution), using recursion instead of a loop.

Public Function ColumnLetter(Column As Integer) As String
    If Column < 1 Then Exit Function
    ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function

I’ve tested this with the following inputs:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""

Stevoisiak's user avatar

Stevoisiak

22.8k27 gold badges122 silver badges219 bronze badges

answered Feb 4, 2015 at 16:18

alexanderbird's user avatar

alexanderbirdalexanderbird

3,7071 gold badge24 silver badges35 bronze badges

2

robertsd’s code is elegant, yet to make it future-proof, change the declaration of n to type long

In case you want a formula to avoid macro’s, here is something that works up to column 702 inclusive

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

where A1 is the cell containing the column number to be converted to letters.

Stevoisiak's user avatar

Stevoisiak

22.8k27 gold badges122 silver badges219 bronze badges

answered Feb 17, 2014 at 3:29

Jan Wijninckx's user avatar

1

This is a function based on @DamienFennelly’s answer above. If you give me a thumbs up, give him a thumbs up too! :P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function

Stevoisiak's user avatar

Stevoisiak

22.8k27 gold badges122 silver badges219 bronze badges

answered Mar 20, 2014 at 18:43

BrettFromLA's user avatar

BrettFromLABrettFromLA

9061 gold badge7 silver badges17 bronze badges

2

There is a very simple way using Excel power: Use Range.Cells.Address property, this way:

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

This will return the address of the desired column on row 1. Take it of the 1:

strCol = Left(strCol, len(strCol) - 1)

Note that it so fast and powerful that you can return column addresses that even exists!

Substitute lngRow for the desired column number using Selection.Column property!

Niall's user avatar

Niall

29.8k10 gold badges100 silver badges140 bronze badges

answered Jul 29, 2014 at 12:39

flaviomorgado's user avatar

Here is a simple one liner that can be used.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

It will only work for a 1 letter column designation, but it is nice for simple cases. If you need it to work for exclusively 2 letter designations, then you could use the following:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)

answered Aug 26, 2014 at 14:15

Syd B's user avatar

Syd BSyd B

211 bronze badge

This will work regardless of what column inside your one code line for cell thats located in row X, in column Y:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

If you have a cell with unique defined name «Cellname»:

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)

answered Nov 5, 2014 at 17:30

Codeplayer's user avatar

So I’m late to the party here, but I want to contribute another answer that no one else has addressed yet that doesn’t involve arrays. You can do it with simple string manipulation.

Function ColLetter(Col_Index As Long) As String

    Dim ColumnLetter As String

    'Prevent errors; if you get back a number when expecting a letter, 
    '    you know you did something wrong.
    If Col_Index <= 0 Or Col_Index >= 16384 Then
        ColLetter = 0
        Exit Function
    End If

    ColumnLetter = ThisWorkbook.Sheets(1).Cells(1, Col_Index).Address     'Address in $A$1 format
    ColumnLetter = Mid(ColumnLetter, 2, InStr(2, ColumnLetter, "$") - 2)  'Extracts just the letter

    ColLetter = ColumnLetter
End Sub

After you have the input in the format $A$1, use the Mid function, start at position 2 to account for the first $, then you find where the second $ appears in the string using InStr, and then subtract 2 off to account for that starting position.

This gives you the benefit of being adaptable for the whole range of possible columns. Therefore, ColLetter(1) gives back «A», and ColLetter(16384) gives back «XFD», which is the last possible column for my Excel version.

answered Dec 27, 2018 at 23:51

SandPiper's user avatar

SandPiperSandPiper

2,7765 gold badges32 silver badges49 bronze badges

Easy way to get the column name

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

I hope it helps =)

answered Nov 11, 2014 at 12:09

cristobal's user avatar

The solution from brettdj works fantastically, but if you are coming across this as a potential solution for the same reason I was, I thought that I would offer my alternative solution.

The problem I was having was scrolling to a specific column based on the output of a MATCH() function. Instead of converting the column number to its column letter parallel, I chose to temporarily toggle the reference style from A1 to R1C1. This way I could just scroll to the column number without having to muck with a VBA function. To easily toggle between the two reference styles, you can use this VBA code:

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub

answered Feb 12, 2015 at 18:07

Will Ediger's user avatar

Will EdigerWill Ediger

8939 silver badges17 bronze badges

Furthering on brettdj answer, here is to make the input of column number optional. If the column number input is omitted, the function returns the column letter of the cell that calls to the function. I know this can also be achieved using merely ColumnLetter(COLUMN()), but i thought it’d be nice if it can cleverly understand so.

Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
    If ColumnNumber = 0 Then
        ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
    Else
        ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
    End If
End Function

The trade off of this function is that it would be very very slightly slower than brettdj’s answer because of the IF test. But this could be felt if the function is repeatedly used for very large amount of times.

answered Mar 19, 2016 at 4:52

Rosetta's user avatar

RosettaRosetta

2,6251 gold badge12 silver badges28 bronze badges

Here is a late answer, just for simplistic approach using Int() and If in case of 1-3 character columns:

Function outColLetterFromNumber(i As Integer) As String

    If i < 27 Then       'one-letter
        col = Chr(64 + i)
    ElseIf i < 677 Then  'two-letter
        col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
    Else                 'three-letter
        col = Chr(64 + Int(i / 676)) & Chr(64 + Int(i - Int(i / 676) * 676) / 26)) & Chr(64 + i - (Int(i - Int(i / 676) * 676) / 26) * 26))
    End If

    outColLetterFromNumber = col

End Function

answered May 28, 2016 at 21:56

ib11's user avatar

ib11ib11

2,5203 gold badges21 silver badges54 bronze badges

Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function

answered Mar 4, 2017 at 22:36

Krzysztof's user avatar

Here, a simple function in Pascal (Delphi).

function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
  Result := Sheet.Columns[Col].Address;  // from Col=100 --> '$CV:$CV'
  Result := Copy(Result, 2, Pos(':', Result) - 2);
end;

answered Sep 8, 2017 at 11:00

Jordi's user avatar

JordiJordi

215 bronze badges

This formula will give the column based on a range (i.e., A1), where range is a single cell. If a multi-cell range is given it will return the top-left cell. Note, both cell references must be the same:

MID(CELL(«address»,A1),2,SEARCH(«$»,CELL(«address»,A1),2)-2)

How it works:

CELL(«property»,»range») returns a specific value of the range depending on the property used. In this case the cell address.
The address property returns a value $[col]$[row], i.e. A1 -> $A$1.
The MID function parses out the column value between the $ symbols.

answered Jan 31, 2018 at 18:49

Thom's user avatar

ThomThom

212 bronze badges

Sub GiveAddress()
    Dim Chara As String
    Chara = ""
    Dim Num As Integer
    Dim ColNum As Long
    ColNum = InputBox("Input the column number")

    Do
        If ColNum < 27 Then
            Chara = Chr(ColNum + 64) & Chara
            Exit Do
        Else
            Num = ColNum / 26
            If (Num * 26) > ColNum Then Num = Num - 1
            If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
            Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
            ColNum = Num
        End If
    Loop

    MsgBox "Address is '" & Chara & "'."
End Sub

Sebastian Brosch's user avatar

answered Feb 4, 2016 at 11:16

Chetan V.'s user avatar

Column letter from column number can be extracted using formula by following steps
1. Calculate the column address using ADDRESS formula
2. Extract the column letter using MID and FIND function

Example:
1. ADDRESS(1000,1000,1)
results $ALL$1000
2. =MID(F15,2,FIND(«$»,F15,2)-2)
results ALL asuming F15 contains result of step 1

In one go we can write
MID(ADDRESS(1000,1000,1),2,FIND(«$»,ADDRESS(1000,1000,1),2)-2)

answered Sep 22, 2015 at 20:54

Bhanu Sinha's user avatar

Bhanu SinhaBhanu Sinha

1,51612 silver badges10 bronze badges

this is only for REFEDIT … generaly use uphere code
shortly version… easy to be read and understood /
it use poz of $

Private Sub RefEdit1_Change()

    Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable  var=....'

End Sub

Function NOtoLETTER(REFedit)

    Dim First As Long, Second As Long

    First = InStr(REFedit, "$")                 'first poz of $
    Second = InStr(First + 1, REFedit, "$")     'second poz of $

    NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1)   'extract COLUMN LETTER

End Function

Tunaki's user avatar

Tunaki

131k46 gold badges330 silver badges415 bronze badges

answered Mar 19, 2016 at 17:02

Gabriel V's user avatar

answered Mar 30, 2016 at 9:31

PEDRO COUTO's user avatar

0

what about just converting to the ascii number and using Chr() to convert back to a letter?

col_letter = Chr(Selection.Column + 96)

answered Jul 15, 2016 at 15:41

beef_supreme's user avatar

0

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Ну, собственно, вопрос — в заголовке…

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Не придумал ничего лучше, чем это:  

  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  

  Вопрос — а нафига это нужно?

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

А таблицу соответствий в ВБА можно сделать?  
Ну там {1:А;2:В;…}

 

Nicks

Пользователь

Сообщений: 71
Регистрация: 09.07.2010

{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

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Спасибо.  
Сейчас попробую.  
А нужно мне это чтобы при обработкой макросом введённых юзером в таблицу данных можно было сказать ему, что, например, «Данные, введённые Вами в ячейку А2, не совместимы с данными, введёнными в ячейку Р5»

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Спасибо большое, Учитель джедаев!  
Как всегда элегантно и просто!  
Всё отлично работает.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Алексей, так может легче и быстрее методом «Find» воспользоваться?

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

{quote}{login=Дъмитръ}{date=10.09.2010 11:40}{thema=}{post}… методом «Find» воспользоваться?{/post}{/quote}  
Не понял, для чего?  
Что и где искать?

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

{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, _  
‘…  
——————

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Блин…  
Старею. Склероз+переклин…  
И в самом деле, всё же элементарно: Replace(Address,»$»,»»)  
Мало того, что сам затупил, так ещё и Йодо запутал…  
Спасибо за F1

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 
 

Алексей… :)  

  Не надо:  
Replace(Address,»$»,»»)  

  Надо так:  
Address = ActiveCell.Address(False, False)  

  Пятница наверное, отдыхать пора. ;)

 

{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post} Склероз+переклин…  
И в самом деле, всё же элементарно: Replace(Address,»$»,»»)  
Мало того, что сам затупил, так ещё и Йодо запутал…  
Спасибо за F1{/post}{/quote}  
1. Дело не в склерозе.  
Вы решили сэкономить слова на формулировке задачи.  
Подробно бы описали, что вам надо, — получили бы простой и внятный ответ.  

    2. Я вас не запутывал.  
Я дал точный ответ на сформулированную вами задачу. (как из числа получить букву)  
То, что вы забыли объяснить, для чего это нужно, — это уже не мои проблемы.  
Я, конечно, догадывался, что мудрить с вычислением буквы тут совсем не надо,  
и есть более простые решения, — но задавать кучу наводящих вопросов как-то не хотелось  
(вы всё же не первый день на форуме — могли бы и точнее формулировать вопросы)

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

Да, точно!  
Отдыхать пора.    
К стати, я с понедельника в отпуске!!!  
Уеду на 2 недели в Турцию в бунгало на Ultra All Inclusive  
Да при таком как там количестве халявных (ну, в смысле: «за всё уже уплочено») напитков русский язык бы за 2 недели не забыть, а про бэйсик я уже молчу…

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

Пользователь

Сообщений: 2746
Регистрация: 22.12.2012

На лицо ужасный, добрый внутри

{quote}{login=Alex_ST}{date=10.09.2010 12:09}{thema=}{post}Мало того, что сам затупил, так ещё и Йодо запутал…{/post}{/quote}  
Ну вот, поскупился на слова и получилось «казнить нельзя помиловать»…  

  Моя реплика должна была, естественно, звучать так:  
«Мало того, что сам затупил, так ещё и глубокоуважаемого учителя EducatedFool запутал своими необдуманными вопросами…»  
так понятно, кто кого запутал?  

  Посыпаю голову пеплом и бьюсь лбом об стол (между «клавой» и мышкой, конечно).

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Ну вот, уезжаете и еще уважаемого EducatedFool обидели, хотя и ему пора отдыхать, переработался. :)

 

Привет всем.  
Будучи в командировке, оторванным от инета, вспомнил название этой темы и решил поэкспериментировать. В принципе, это классическая задача о переводе числа в другую систему счисления, что видно из примера 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.

 

Somebody

Пользователь

Сообщений: 169
Регистрация: 01.01.1970

Узнаём имя 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

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Прошу прощения, а зачем оно может понадобиться?)  

  Sub io()  
MsgBox Columns(1).Address  
End Sub  

  Sub io2()  
MsgBox Columns(«A»).Column  
End Sub  

  >>В кавычках, потому что диапазон возвращаемого числа не ограничен числом столбцов:  
хотя…

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

для разнообразия немного изварщеный вариант  

  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

 

VovaK

Пользователь

Сообщений: 1716
Регистрация: 01.01.1970

Нормальные герои всегда идут в обход :)

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

А что означает (1) ? Посмотрел в справке функцию Split и не нашёл объяснения. Вот как можно было прийти к тому, что в конце нужно добавить (1), чтобы получить такое элегантное решение? )))

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

В скобках порядковый номер элемента массива (отсчёт с нуля).

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Cells(1, 6).Address будет $F$1  
Split(Cells(1, 6).Address, «$»)(1) будет F  
Split(Cells(1, 6).Address, «$»)(2) будет 1

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Ещё пример:  
Sub TestArr()  
Dim Stroka  
Stroka = «Первый второй третий»  
MsgBox Split(Stroka)(1)  
End Sub

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

#30

30.03.2012 19:25:52

Спасибо за примеры. То есть, если разделитель не указан, то в качестве разделителя выступает пробел, если он есть. Если же нет ни одного пробела, то в массиве один элемент. В качестве разделителей выступают любые указанные знаки. Правильно?

Hello! My blog: TRADING WAY

0 / 0 / 0

Регистрация: 13.02.2012

Сообщений: 18

1

14.02.2012, 21:04. Показов 23488. Ответов 12


Студворк — интернет-сервис помощи студентам

Есть ли в VBA функция переводящая номер столбца в его буквенный эквивалент в Excel’е?
Т.е. мне предположим надо вывести в msgbox информацию о том, с каким столбцом мы имеем дело. Его числовой номер я знаю, но хочу для удобства подать его в буквенном виде. Использовать оператор Select Case с длиной 256 строк как то не хочется… Есть другие варианты решения?



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

14.02.2012, 22:08

2

Лучший ответ Сообщение было отмечено как решение

Решение

Например столбец 56

Visual Basic
1
2
3
4
Dim a
a = Cells(1, 56).Address(0, 0)
a = Left(a, Len(a) - 1)
Debug.Print a

Или так

Visual Basic
1
Debug.Print split(application.ConvertFormula ("R1C56",xlR1C1 ,xla1),"$")(1)

Добавлено через 24 минуты
Нашел тему с другого сайта, где это обсуждалось. Еще вариация на тему первого и второго вариантов:

Visual Basic
1
2
3
Узнаём имя 6-го столбца
 
MsgBox Split(Cells(1, 6).Address, "$")(1)

Еще

У меня получилась такая функция:

Visual Basic
1
2
3
4
5
6
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



4



аналитика

здесь больше нет…

3372 / 1670 / 184

Регистрация: 03.02.2010

Сообщений: 1,219

15.02.2012, 10:45

3

вариант

Visual Basic
1
2
3
4
5
Function strCol(n As Integer) As String
    With Cells(1, n)
        strCol = Replace(.Address(0, 0), .Row, "")
    End With
End Function



1



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.02.2012, 16:02

4

Цитата
Сообщение от Казанский
Посмотреть сообщение

Еще
У меня получилась такая функция:

Visual Basic
1
2
3
4
5
6
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

Функция Num2ABC работает неправильно , при x = 26 Num2ABC=A@ и так далее.



1



m-ch

6169 / 934 / 309

Регистрация: 25.02.2011

Сообщений: 1,359

Записей в блоге: 1

15.02.2012, 17:17

5

Функция Num2ABC работает неправильно , при x = 26 Num2ABC=A@ и так далее

Visual Basic
1
2
3
4
5
6
7
Function Num2ABC(ByVal x As Long) As String
x = x - 1
Do
Num2ABC = Chr$(65 + x Mod 26) & Num2ABC
x = x  26 - 1
Loop While x >= 0
End Function



2



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.02.2012, 17:39

6

Вот правильная функция:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function Num2ABC(ByVal x As Long) As String
    Dim i As Integer
    Do While x > 0
        i = x Mod 26
        If i = 0 Then
            Num2ABC = "Z" & Num2ABC
            x = x  26 - 1
        Else
            Num2ABC = Chr$(64 + i) & Num2ABC
            x = x  26
        End If
    Loop
End Function



1



m-ch

6169 / 934 / 309

Регистрация: 25.02.2011

Сообщений: 1,359

Записей в блоге: 1

15.02.2012, 17:44

7

или так:

Visual Basic
1
2
3
4
5
6
Function Num2ABC(ByVal x As Long) As String
Do
Num2ABC = Chr$(65 + (x - 1) Mod 26) & Num2ABC
x = (x - 1)  26
Loop Until x = 0
End Function



2



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

15.02.2012, 17:46

8

Цитата
Сообщение от m-ch
Посмотреть сообщение

Visual Basic
1
2
3
4
5
6
7
Function Num2ABC(ByVal x As Long) As String
x = x - 1
Do
Num2ABC = Chr$(65 + x Mod 26) & Num2ABC
x = x  26 - 1
Loop While x >= 0
End Function

Это лучше



2



Piramidon

0 / 0 / 0

Регистрация: 13.02.2012

Сообщений: 18

16.02.2012, 11:48

 [ТС]

9

Цитата
Сообщение от m-ch
Посмотреть сообщение

или так:

Visual Basic
1
2
3
4
5
6
Function Num2ABC(ByVal x As Long) As String
Do
Num2ABC = Chr$(65 + (x - 1) Mod 26) & Num2ABC
x = (x - 1)  26
Loop Until x = 0
End Function

Вы бы не могли написать комменты к проге… Не понятно это Num2ABC = Chr$(65 + (x — 1) Mod 26) & Num2ABC… Вообще не могу понять, что происходит в этом выражении…



0



0 / 0 / 0

Регистрация: 01.11.2012

Сообщений: 20

09.02.2016, 15:30

10

Цитата
Сообщение от Казанский
Посмотреть сообщение

Узнаём имя 6-го столбца
MsgBox Split(Cells(1, 6).Address, «$»)(1)

Коротко и ясно!!! Спасибо большое очень пригодилось.



0



Модератор

Эксперт MS Access

11341 / 4660 / 748

Регистрация: 07.08.2010

Сообщений: 13,496

Записей в блоге: 4

09.02.2016, 16:49

11

а есть ли обратная функция
имя ячейки FJD
какой это номер столбика



0



m-ch

6169 / 934 / 309

Регистрация: 25.02.2011

Сообщений: 1,359

Записей в блоге: 1

09.02.2016, 16:56

12

Visual Basic
1
Cells(1, "FJD").Column



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

09.02.2016, 23:06

13

shanemac51, можно по аналогии

Visual Basic
1
2
3
4
5
6
7
Function ABC2Num(ByVal x As String) As Long
Dim i&
  x = UCase(x)
  For i = 1 To Len(x)
    ABC2Num = ABC2Num * 26 + AscW(Mid$(x, i, 1)) - 64
  Next
End Function

тест в Immediate

Код

?abc2num("FJD"),columns("FJD").column
 4320          4320



2



Функция для преобразования номера столбца в букву?



есть ли у кого-нибудь функция Excel VBA, которая может возвращать букву(Ы) столбца из числа?

, введя 100 должен возвратить CV.


843  


27  

27 ответов:

эта функция возвращает букву столбца для данного столбца.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

тестовый код для столбца 100

Sub Test()
    MsgBox Col_Letter(100)
End Sub

Если вы не хотите использовать объект диапазона:

Function ColumnLetter(ColumnNumber As Long) As String
    Dim n As Long
    Dim c As Byte
    Dim s As String

    n = ColumnNumber
    Do
        c = ((n - 1) Mod 26)
        s = Chr(c + 65) & s
        n = (n - c)  26
    Loop While n > 0
    ColumnLetter = s
End Function

то, что работает для меня-это:

Cells(Row,Column).Address 

это вернет вам ссылку на формат $AE$1.

и решение с использованием рекурсии:

Function ColumnNumberToLetter(iCol As Long) As String

    Dim lAlpha As Long
    Dim lRemainder As Long

    If iCol <= 26 Then
        ColumnNumberToLetter = Chr(iCol + 64)
    Else
        lRemainder = iCol Mod 26
        lAlpha = Int(iCol / 26)
        If lRemainder = 0 Then
            lRemainder = 26
            lAlpha = lAlpha - 1
        End If
        ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
    End If

End Function

еще один способ сделать это. Brettdj это заставил меня задуматься об этом, но если вы используете этот метод, вам не нужно использовать массив вариантов, вы можете перейти непосредственно к строке.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "", "")

или может сделать его немного более компактным с этим

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "", "")

обратите внимание, что это зависит от ссылки на строку 1 в объекте ячеек.

I'm surprised nobody suggested: **<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <code></code>**

  • например:MsgBox Columns( 9347 ).Addressвозвращает**<code>$MUM:$MUM</code>**.

вернуться только буква столбца(s):Split((Columns(Column Index).Address(,0)),":")(0)

  • например:MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)возвращает **<code>DAD</code>**.

More Examples


это доступно с помощью формулы:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

и поэтому также может быть записан как функция VBA по запросу:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function

Это версия robartsd это (со вкусом Ян Wijninckx в одной строке решение), используя рекурсию вместо цикла.

Public Function ColumnLetter(Column As Integer) As String
    If Column < 1 Then Exit Function
    ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function

Я проверил это со следующими входными данными:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""

robertsd код элегантно, но чтобы сделать его перспективным, измените объявление n на тип long

Если вы хотите, чтобы формула избегала макросов, вот что работает до столбца 702 включительно

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

где A1-ячейка, содержащая номер столбца, который будет преобразован в буквы.

существует очень простой способ использования Excel power: Use Range.Cells.Address собственность, таким образом:

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

это вернет адрес нужного столбца в строке 1. Возьмите его из 1:

strCol = Left(strCol, len(strCol) - 1)

обратите внимание, что он настолько быстрый и мощный, что вы можете вернуть адреса столбцов, которые даже существуют!

заменить lngRow для нужного номера столбца с помощью Selection.Column собственность!

здесь просто один лайнер, который может быть использован.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

Он будет работать только для обозначения столбца с 1 буквой, но это хорошо для простых случаев. Если вам нужно, чтобы он работал исключительно для 2 буквенных обозначений, то вы можете использовать следующее:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)

это будет работать независимо от того, какой столбец внутри вашей одной строки кода для ячейки, расположенной в строке X, в столбце Y:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

Если у вас есть ячейка с уникальным определенным именем «Cellname»:

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)

Это функция, основанная на @DamienFennelly это выше. Если ты покажешь мне большой палец, покажи и ему тоже! : P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function

решение от brettdj работает фантастически, но если вы сталкиваетесь с этим как с потенциальным решением по той же причине, что и я, я думал, что предложу свое альтернативное решение.

проблема, с которой я столкнулся, заключалась в прокрутке до определенного столбца на основе вывода функции MATCH (). Вместо преобразования номера столбца в его параллельную букву столбца я решил временно переключить ссылочный стиль с A1 на R1C1. Таким образом, я мог бы просто прокрутить до столбца номер без необходимости гадить с функцией VBA. Чтобы легко переключаться между двумя ссылочными стилями, вы можете использовать этот код VBA:

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub

далее на brettdj ответ, вот чтобы сделать ввод номера столбца необязательным. Если входной номер столбца опущен, функция возвращает букву столбца ячейки, которая вызывает функцию. Я знаю, что это также может быть достигнуто с помощью просто ColumnLetter(COLUMN()), но я подумал, что было бы неплохо, если бы он мог умно понять это.

Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
    If ColumnNumber = 0 Then
        ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
    Else
        ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
    End If
End Function

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

вот поздний ответ, просто для упрощенного подхода с использованием Int() и If в случае 1-3 столбцы символов:

Function outColLetterFromNumber(i As Integer) As String

    If i < 27 Then       'one-letter
        col = Chr(64 + i)
    ElseIf i < 677 Then  'two-letter
        col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
    Else                 'three-letter
        col = Chr(64 + Int(i / 676)) & Chr(64 + Int(i - Int(i / 676) * 676) / 26)) & Chr(64 + i - (Int(i - Int(i / 676) * 676) / 26) * 26))
    End If

    outColLetterFromNumber = col

End Function
Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function

здесь простая функция в Pascal (Delphi).

function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
  Result := Sheet.Columns[Col].Address;  // from Col=100 --> '$CV:$CV'
  Result := Copy(Result, 2, Pos(':', Result) - 2);
end;

эта формула даст столбец, основанный на диапазоне (т. е.,A1), где диапазон-это одна ячейка. Если задан диапазон нескольких ячеек, он вернет верхнюю левую ячейку. Обратите внимание, что обе ссылки на ячейки должны быть одинаковыми:

MID (ячейка («адрес»,A1),2,Поиск(«$»,ячейка(«адрес»,A1),2)-2)

Как работает:

ячейка («свойство», «диапазон») возвращает определенное значение диапазона в зависимости от используемого свойства. В этом деле адрес ячейки.
Свойство address возвращает значение $[col]$[row], т. е. A1 -> $A$1.
Функция MID анализирует значение столбца между символами$.

простой способ получить имя столбца

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

надеюсь, это поможет =)

Sub GiveAddress()
    Dim Chara As String
    Chara = ""
    Dim Num As Integer
    Dim ColNum As Long
    ColNum = InputBox("Input the column number")

    Do
        If ColNum < 27 Then
            Chara = Chr(ColNum + 64) & Chara
            Exit Do
        Else
            Num = ColNum / 26
            If (Num * 26) > ColNum Then Num = Num - 1
            If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
            Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
            ColNum = Num
        End If
    Loop

    MsgBox "Address is '" & Chara & "'."
End Sub

буква столбца из номера столбца может быть извлечена с помощью формулы, выполнив следующие шаги
1. Вычислите адрес столбца, используя формулу адреса
2. Извлеките букву столбца с помощью MID и найдите функцию

Пример:
1. Адрес(1000,1000,1)
результаты $всего 1000$
2. =MID(F15, 2, FIND («$ » , F15,2)-2)
результаты все asuming F15 содержит результат шага 1

За один раз мы можем написать
MID(ADDRESS (1000,1000,1), 2, FIND ( » $», ADDRESS(1000,1000,1),2)-2)

это только для REFEDIT … вообще используйте код uphere
коротко версия… легко читается и понимается /
его использование поз в размере

Private Sub RefEdit1_Change()

    Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable  var=....'

End Sub

Function NOtoLETTER(REFedit)

    Dim First As Long, Second As Long

    First = InStr(REFedit, "$")                 'first poz of $
    Second = InStr(First + 1, REFedit, "$")     'second poz of $

    NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1)   'extract COLUMN LETTER

End Function

Как насчет простого преобразования в число ascii и использования Chr() для преобразования обратно в букву?

col_letter = Chr(выделение.Колонки + 96)

вот еще один способ:

{

      Sub find_test2()

            alpha_col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,W,Z" 
            MsgBox Split(alpha_col, ",")(ActiveCell.Column - 1) 

      End Sub

}

В этой статье я расскажу о том, как преобразовать букву столбца в номер столбца или преобразовать номер столбца в букву. Например, преобразовать букву AA в столбце в число 27 или преобразовать номер столбца 100 в букву CV. Чтобы получить решение следующими методами.

Преобразуйте букву столбца в число или наоборот с помощью формул

Преобразование буквы столбца в число или наоборот с помощью функции, определяемой пользователем


стрелка синий правый пузырь Преобразуйте букву столбца в число или наоборот с помощью формул

Чтобы преобразовать букву столбца или метку в число или наоборот, приведенные ниже формулы могут помочь вам, пожалуйста, сделайте следующее:

Преобразование буквы столбца в номер столбца:

Пожалуйста, введите эту формулу: = КОЛОНКА (КОСВЕННО («AB1»)) в пустую ячейку, где вы хотите найти преобразованный результат, а затем нажмите Enter ключ для получения номера столбца:

doc преобразовать метку столбца в номер 1

Примечание: В приведенной выше формуле AB — буква столбца, на основе которой вы хотите получить номер столбца, вы можете изменить его по своему усмотрению.

Преобразуйте номер столбца в букву столбца:

Введите эту формулу: = ПОДСТАВИТЬ (АДРЕС (1,200,4); 1; «») в пустую ячейку, чтобы получить результат, а затем нажмите Enter чтобы получить букву столбца следующим образом:

doc преобразовать метку столбца в номер 2

Примечание: В приведенной выше формуле красное число 200 — это номер столбца, который вы хотите преобразовать в букву столбца, вы можете изменить его по своему усмотрению.


стрелка синий правый пузырь Преобразование буквы столбца в число или наоборот с помощью функции, определяемой пользователем

Кроме формул, здесь я также могу ввести Функция, определяемая пользователем справиться с этой задачей.

Преобразование буквы столбца в номер столбца:

1. Удерживайте ALT + F11 ключи, затем он открывает Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в Модули Окно.

Код VBA: преобразовать букву столбца в номер столбца:

Public Function ToColNum(ColN)
    ToColNum = Range(ColN & 1).Column
End Function

3. Затем сохраните и закройте этот код, вернитесь на рабочий лист и введите следующую формулу: = Tocolnum («ВВ») (VV — буква столбца, в которой вы хотите преобразовать число. ) в пустую ячейку и нажмите Enter ключ, чтобы получить номер столбца, см. снимок экрана:

doc преобразовать метку столбца в номер 3

Преобразуйте номер столбца в букву столбца:

1. Удерживайте ALT + F11 ключи, затем он открывает Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в Модули Окно.

Код VBA: преобразовать номер столбца в букву столбца:

Public Function ToColletter(Collet)
    ToColletter = Split(Cells(1, Collet).Address, "$")(1)
End Function

3. Затем сохраните и закройте этот код, вернитесь на рабочий лист и введите следующую формулу: = ToColletter (50) (50 — номер столбца, который вы хотите преобразовать в букву. ) в пустую ячейку и нажмите Enter ключ, чтобы получить номер столбца, см. снимок экрана:

doc преобразовать метку столбца в номер 4


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (10)


Номинальный 5 из 5


·


рейтинги 1

как в Екселе получить букву текущего столбца?

compositum
Начинающий
Начинающий
Аватара пользователя

 
Сообщения: 18
Зарегистрирован: 07.05.2006 (Вс) 15:23
Откуда: Санкт-Петербург
  • ICQ

как в Екселе получить букву текущего столбца?

как в Екселе получить букву текущего столбца?

Perfice te.


Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.05.2006 (Чт) 12:36

select case activecell.column

case 1: sColumn = «A»

case 2: sColumn = «B»



case 256: sColumn = «IV»

end select


$€rg
Обычный пользователь
Обычный пользователь
 
Сообщения: 99
Зарегистрирован: 11.01.2006 (Ср) 10:15
Откуда: Санкт-Петербург

Сообщение $€rg » 11.05.2006 (Чт) 12:46

может не надо получать букву то,

2Nicky, case256 это жэсть

процесс печатания программного кода укрепляет моральные устои С. Каммингс VBA4Dummies
:study:


Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 11.05.2006 (Чт) 12:46

Далеко его послали. :)

Доставай если так хочется мучиться, из адреса текущей ячейки

Чем перебирать его в таком длинном select case

В первие встречаю случаю, когда, хорошо что количество столбцов ограничено в 256 а не 65000 :)

To compositum

Что-то мне твоя птичка знакома.


uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя

 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 11.05.2006 (Чт) 12:48

Извратный способ:

s=Replace$(Left$(ActiveCell.Address(ColumnAbsolute:=False), 2), «$», «»)

ЗЫ А гифы я лучше обрабатываю :P

Быть… или не быть. Вот. В чём вопрос?


compositum
Начинающий
Начинающий
Аватара пользователя

 
Сообщения: 18
Зарегистрирован: 07.05.2006 (Вс) 15:23
Откуда: Санкт-Петербург
  • ICQ

Сообщение compositum » 11.05.2006 (Чт) 12:58

насчет CASE — мне будет проще застрелиться… а извратный способ…. щас гляну… =)

Perfice te.


compositum
Начинающий
Начинающий
Аватара пользователя

 
Сообщения: 18
Зарегистрирован: 07.05.2006 (Вс) 15:23
Откуда: Санкт-Петербург
  • ICQ

Сообщение compositum » 11.05.2006 (Чт) 12:59

а специальной функции нет? как-то не верится… =) неужели такую элементарную вещь в ВБА не предусмотрели???

Perfice te.


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2006 (Чт) 13:11

Самописная есть, пишется за 10 минут.

Lasciate ogni speranza, voi ch’entrate.


compositum
Начинающий
Начинающий
Аватара пользователя

 
Сообщения: 18
Зарегистрирован: 07.05.2006 (Вс) 15:23
Откуда: Санкт-Петербург
  • ICQ

Сообщение compositum » 11.05.2006 (Чт) 13:15

спасибо за «конкретный» ответ…

Perfice te.


Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 11.05.2006 (Чт) 13:16

compositum писал(а):а специальной функции нет? как-то не верится… =) неужели такую элементарную вещь в ВБА не предусмотрели???

Вы напишите, для чего эта буква нужно вам и я 90% уверен,

что будет ясно, что правильно сделали, что не предусмотрели.

Я в том смысле, это не такая важная функция чтобы его

поставлять в готовом виде.


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2006 (Чт) 13:17

Попробуй поискать по vbskb num.

Lasciate ogni speranza, voi ch’entrate.


Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.05.2006 (Чт) 13:29

Код: Выделить всё
Function GetColumnName(lCol As Long) As String
  Dim lColDiv As Long, lColMod As Long, sColumn As String

    lColDiv = lCol 26
  lColMod = lCol Mod 26
  If lColMod = 0 Then lColDiv = lColDiv - 1: lColMod = 26
  GetColumnName = IIf(lColDiv > 0, Chr(Asc("A") + lColDiv - 1), "") & Chr(Asc("A") + lColMod - 1)
End Function

О!

Код: Выделить всё
MsgBox Replace$(Mid$(ActiveCell.Address, 2, 2), "$", "")

Блин, это ж uhm’а код…

Последний раз редактировалось Nicky 11.05.2006 (Чт) 14:47, всего редактировалось 3 раз(а).


Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 11.05.2006 (Чт) 14:20

compositum писал(а):а специальной функции нет? как-то не верится… =) неужели такую элементарную вещь в ВБА не предусмотрели???

А чем это не элементарно?

Код: Выделить всё
Mid(ActiveCell.Address, 2, InStrRev(ActiveCell.Address, "$") - 2)

И почему не подходит просто номер столбца?

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


ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 22.08.2006 (Вт) 15:09

Вопрос посложнее — как получить букву ПРОИЗВОЛЬНОГО столбца?

Самописная процедура в общем-то невелика:

Код: Выделить всё
Function GetColLetter(ColNum As Integer) As String

Dim temp as Byte

If ColNum < 27 Then

    GetColLetter = Chr(64 + ColNum)

Else

    temp = Int(ColNum / 26)

    GetColLetter = Chr(64 + temp) & Chr(64 + ColNum - temp * 26)

End If

End Function

Но может есть что штатное? :)

Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.


GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.08.2006 (Вт) 21:15

Не могу представить ни одной ситуации, когда могло бы понадобиться узнавать букву столбца.

Но, к примеру, columns(55).address(false,false,xla1)

Но тебе это на самом деле не нужно, т.к. ты наверняка делаешь всё неправильно, раз понадобилась буква…

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 22.08.2006 (Вт) 22:37

ZlydenGL писал(а):Вопрос посложнее — как получить букву ПРОИЗВОЛЬНОГО столбца?…

Вылей воду из чайника ;)


KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 29.08.2006 (Вт) 20:56

еще вариант:

Split(ActiveCell.Address,»$»)(1)

Привет,

KL


ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 01.12.2006 (Пт) 17:18

GSerg, Nicky, зря вы так… Нужен пример ситуации, когда нужно получить букву произвольного столбца? Запросто!

Есть здоровенная матрица MxN, где N — число колонок — стремительно приближается к 200. M ПОКА не превышает 100, но в будущем их будет ой-ой-ой сколько. Есть макрос, который проверяет эту матрицу на наличие определенных ячеек (0 или значение, отличающееся от диапазона). Пользователя надо как-то оповестить, в каком именно столбце есть такая бага.

Какие варианты? Условное форматирование? Неудобно на таком большом количестве столбцов. Трехэтажную формулу, чтобы закрашивать допустим заголовки столбцов и строк? Тоже неудобно. Да и нужна вся эта шняга только ИНФОРМАТИВНО, чтоб юзверь САМ СЕБЯ проверил, что он не наоставлял таких значений — соответственно реализовать это автопереходом на соответствующую ячейку будет неудобно.

Согласен, ситуевина далека от идеальной… Но клиент требует именно такого функционала, а он как известно всегда прав!

Так что за columns(J).address(false,false,xla1) — ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО ;)

Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.


Pavel55
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 27.10.2006 (Пт) 20:11

Сообщение Pavel55 » 01.12.2006 (Пт) 23:26

А я пользуюсь этим

Код: Выделить всё
'узнаем название столбца (например, М)
ColName$ = Left(ActiveCell.AddressLocal(True, False, xlA1), _
InStr(1, ActiveCell.AddressLocal(True, False, xlA1), "$") - 1)
Msgbox ColName$


Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 02.12.2006 (Сб) 14:42

И, в каких целях ты используешь полученный результат?


Pavel55
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 27.10.2006 (Пт) 20:11

Сообщение Pavel55 » 03.12.2006 (Вс) 1:09

Avtopic, вы просто «бывалый» программыст VBA, а я только «начинающий» ( Поэтому я пока использую это в своих процедурах, но обещаю со временим уходить от этого )


Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 03.12.2006 (Вс) 14:00

Не надо обижаться. До моего ответа два раза было написано что, это дурная затея искать алфавитное обозначение столбца,

это значит, что выбран не совсем хороший (или совсем нехороший) путь, обращения столбцами.

Range и F1 предлагают очень много вариантов для этого.


ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.12.2006 (Вт) 16:41

Avtopic писал(а):До моего ответа два раза было написано что, это дурная затея искать алфавитное обозначение столбца,
это значит, что выбран не совсем хороший (или совсем нехороший) путь, обращения столбцами.
Range и F1 предлагают очень много вариантов для этого.

Сколько пафоса… А реальных идей нет. На ситуацию, описанную в моем посте, что ответишь?

Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.


Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя

 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 07.12.2006 (Чт) 11:31

ZlydenGL писал(а):На ситуацию, описанную в моем посте, что ответишь?

ситуация немного за уши притянута…

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

во-вторых, если уж очень нужно показать столбик (например там сумма значений ячеек неправильная), то его можно селектом выделить и показать юзеру — просто прокрутить на экране таблицу и остановиться около нужного столбца… помоему очень будет эффектно :)

Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.


ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 07.12.2006 (Чт) 15:31

Krasnaja Shapka, даже комментировать не буду. Есть задача, которую поставил КЛИЕНТ. ЕМУ это надо. Здесь описана только часть глобальной задачи (которую я естессно не буду описывать — слишком много времени потребуется), но как функциональная часть нужна именна та штука, что я описывал выше.

Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.



Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 1

Понравилась статья? Поделить с друзьями:
  • Vba excel библиотека макросов
  • Vba excel атрибут файла
  • Vba excel ассоциативный массив
  • Vba excel аналог функции или
  • Vba excel аналог поиск