Vba как найти номер столбца

 

Zhennya2030

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

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

#1

11.08.2014 16:13:34

Есть таблица в эксель например “Таблица1”  :)  
B2   C2 D2   E2    F2
Имя; Фамилия; Телефон; размер груди; наличие мозга

как в VBA узнать номер столбца по его названию (телефон) ?
что-то типа этого есть?

Код
Range("Таблица1") .Columns("Телефон") .column
 

Kuzmich

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

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

#2

11.08.2014 16:36:26

Код
Sub Telephon()
Dim Stolb As Integer
    Stolb = Rows(2).Find("Телефон", , xlValues, xlWhole).Column
End Sub
 
 

Кузьмич Спасибо!

а еще вариант естьтипа такого?
а= Range(“Таблица1″ ) .Cells(1,”Телефон” )

 

Ёк-Мок

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

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

#4

11.08.2014 17:03:32

Код
Sub Макрос()
For i = 2 To 6
If Cells(2, i).Value = "Телефон" Then a = Cells(2, i).Column
Next
End Sub

Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.

 

Kuzmich

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

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

Cells(1,”Телефон” )    Что это за ячейка?

 

Zhennya2030

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

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

#6

12.08.2014 08:27:33

скорее всего я очень плохо объясняю.
Полная задача в том, чтобы из экселя именованной таблицы, передать данные на SQL.
ну тупо пошли перебор таблицы по строкам.

Код
For i = 2 To Sheet1.Range("TAble_Table").Rows.Count
objRecordset.Fields("Phone") = Sheet1.Range("TAble_Table").Cells(i, "Telephone").Value

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

Думаю просто на отдельном “скрытом” листе определю их и оттуда буду брать номера.

Изменено: Zhennya203012.08.2014 10:51:42

 

забыл сказать!
Спасибо большое за помощь Kuzmich, Ёк-Мок !!!!

 

Андрей VG

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

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

Excel 2016, 365

#8

12.08.2014 08:50:55

Доброе время суток
Если вы используете “умную” таблицу, то можно и таким образом

Код
    Dim pLO As ListObject, iRow As Long
    Set pLO = ActiveSheet.ListObjects(1)
    For iRow = 1 To pLO.ListRows.Count
        objRecordset("Phone").Value = pLO.ListColumns("Telephone").DataBodyRange(iRow).Value
    Next
 

Успехов.

 

Zhennya2030

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

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

#9

12.08.2014 09:41:57

Андрей VG, Спасибо большое!

While you were looking for a VBA solution, this was my top result on google when looking for a formula solution, so I’ll add this for anyone who came here for that like I did:

Excel formula to return the number from a column letter (From @A. Klomp’s comment above), where cell A1 holds your column letter(s):

=column(indirect(A1&”1″))

As the indirect function is volatile, it recalculates whenever any cell is changed, so if you have a lot of these it could slow down your workbook. Consider another solution, such as the ‘code’ function, which gives you the number for an ASCII character, starting with ‘A’ at 65. Note that to do this you would need to check how many digits are in the column name, and alter the result depending on ‘A’, ‘BB’, or ‘CCC’.

Excel formula to return the column letter from a number (From this previous question How to convert a column number (eg. 127) into an excel column (eg. AA), answered by @Ian), where A1 holds your column number:

=substitute(address(1,A1,4),”1″,””)

Note that both of these methods work regardless of how many letters are in the column name.

Hope this helps someone else.

Свойства Column и Columns объекта Range в VBA Excel. Возвращение номера первого столбца и обращение к столбцам смежных и несмежных диапазонов.

Range.Column — свойство, которое возвращает номер первого столбца в указанном диапазоне.

Свойство Column объекта Range предназначено только для чтения, тип данных — Long.

Если диапазон состоит из нескольких областей (несмежный диапазон), свойство Range.Column возвращает номер первого столбца в первой области указанного диапазона:

Range(“B2:F10”).Select

MsgBox Selection.Column ‘Результат: 2

Range(“E1:F8,D4:G13,B2:F10”).Select

MsgBox Selection.Column ‘Результат: 5

Для возвращения номеров первых столбцов отдельных областей несмежного диапазона используется свойство Areas объекта Range:

Range(“E1:F8,D4:G13,B2:F10”).Select

MsgBox Selection.Areas(1).Column ‘Результат: 5

MsgBox Selection.Areas(2).Column ‘Результат: 4

MsgBox Selection.Areas(3).Column ‘Результат: 2

Свойство Range.Columns

Range.Columns — свойство, которое возвращает объект Range, представляющий коллекцию столбцов в указанном диапазоне.

Чтобы возвратить один столбец заданного диапазона, необходимо указать его порядковый номер (индекс) в скобках:

Set myRange = Range(“B4:D6”).Columns(1)  ‘Возвращается диапазон: $B$4:$B$6

Set myRange = Range(“B4:D6”).Columns(2)  ‘Возвращается диапазон: $C$4:$C$6

Set myRange = Range(“B4:D6”).Columns(3)  ‘Возвращается диапазон: $D$4:$D$6

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

MsgBox Range(“B4:D6”).Columns(7).Address  ‘Результат: $H$4:$H$6

Если указанный объект Range является несмежным, состоящим из нескольких смежных диапазонов (областей), свойство Columns возвращает коллекцию столбцов первой области заданного диапазона. Для обращения к столбцам других областей указанного диапазона используется свойство Areas объекта Range:

Range(“E1:F8,D4:G13,B2:F10”).Select

MsgBox Selection.Areas(1).Columns(2).Address ‘Результат: $F$1:$F$8

MsgBox Selection.Areas(2).Columns(2).Address ‘Результат: $E$4:$E$13

MsgBox Selection.Areas(3).Columns(2).Address ‘Результат: $C$2:$C$10

Определение количества столбцов в диапазоне:

Dim c As Long

c = Range(“D5:J11”).Columns.Count

MsgBox c  ‘Результат: 7

Буква вместо номера

Если в качестве индекса столбца используется буква, она соответствует порядковому номеру этой буквы на рабочем листе:

  • "A" = 1;
  • "B" = 2;
  • "C" = 3;

и так далее.

Пример использования буквенного индекса вместо номера столбца в качестве аргумента свойства Columns объекта Range:

Range(“G2:K10”).Select

MsgBox Selection.Columns(2).Address ‘Результат: $H$2:$H$10

MsgBox Selection.Columns(“B”).Address ‘Результат: $H$2:$H$10

Обратите внимание, что свойство Range("G2:K10").Columns("B") возвращает диапазон $H$2:$H$10, а не $B$2:$B$10.


Добрый день уважаемые форумчане!

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

Вопрос вот в чем. Надо перенести в пределах одной книги с одного листа (таблицы) на другой некие данные.
Понятное дело пользователь может наплодить в таблице своих столбцов и тогда жесткая привязка к определенным ячейкам сломает всю таблицу.
Выход из положения вижу один. Присвоил диапазонам ячеек в столбце определенные имена. Но вот как воспользоваться никак не могу понять.
Сейчас делаю вот так:

[vba]

Код

‘С помощью цикла заполняю таблицу
              Worksheets(“График”).Cells(R + i, C + 1).Value = Worksheets(“Лист1”).Range(“СУММА”).Value / 1000 ‘СУММА – имя ячейки из которой получаю данные
              Worksheets(“График”).Cells(R + i, C + 1).NumberFormat = “0.00”

[/vba]

На листе “График” есть столбец, в нем части ячеек из таблицы присвоено имя (Например “Расход” =График!$Y$9:$Y$1895).
Как вытащить из этого имени номер/имя столбца?
[moder]Прочитайте Правила форума
Приложите пример в Excel



Ученик

(162),
на голосовании



7 лет назад

Голосование за лучший ответ

Полосатый жираф Алик

Искусственный Интеллект

(310763)


7 лет назад

ActiveCell.Row – строка активной ячейки.
ActiveCell.Column – столбец активной ячейки.

Дмитрий ВладимировичУченик (162)

7 лет назад

Спасибо от части это, то что надо, но мне нужно иначе, помогите правильно написать.

Public Function Test(a, b)

a = ActiveCell.Row
b = ActiveCell.Column

Value = Cells(a, b)

Test = Value

End Function

Нужно чтобы переменные a, b передавали номер активной строки и столбца не из места, где расположена функция, а от указанных ячеек в функции, например =test (B3, B1) при этом сама функция находится в другом месте.

Извините за не внятно поставленный вопрос, я плохо разбираюсь в VB.

Добавить комментарий