Знатокам синтаксиса формул Excel VBA. Как написать формулу

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
Aent
Сообщения: 1108
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

11 апр 2008, 10:59

Что то вы не то написали, дорогие товарищи.
1)результатом приведённого кода является инициализация массива sVar строковыми значениями из ранга, а вовсе не присваивание переменным, указанным ViktorM.
2) даже в этом случае Split и прочее cовсем не нужны. Что мешает сразу определить массив
Array(-14,-13,...2) :)
3)Ранг можно прочитать в массив и непосредственно

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

Div v()
v = Range( ActiveCell.Offset(iзап, 0).Resize(, 9))
'Получается двумерный массив v(1,1), v(1,2),v(1,3) ....
Чем им удобнее оперировать чем просто ячейками я не понимаю
4) Разименования в VBA нет это всё таки не С++ ;)
Можно динамически переопределять имена листа
Но нельзя вычислять имя переменной VBA для левой части оператора присваивания
Аватара пользователя
VictorM
Сообщения: 787
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

11 апр 2008, 11:35

Aent,
Чем им удобнее оперировать чем просто ячейками я не понимаю
да, похоже Вы правы. Лишняя головная боль.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
VictorM
Сообщения: 787
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

16 июн 2008, 21:35

Здравствуйте, Уважаемые.
Опять "заклинило" :confused: , прошу помощи.
Суть такова:
начальная яч. диапазона A5
конечную, правую нижнюю, нахожу так:
Range("A5").End(xlDown).Offset(0, 6).Select (Select - пока, временно) т.к. кол-во строк не знаю.
А теперь мне нужно этот дипазон скопировать.
Я написал конечно, но двумя строками с Select и чувствую, что коряво.
Понимаю, что можно определить диапазон для копирования одной строкой, но как только начинаю все это приводить к одной строке, VBE "жутко ругается" на скобки и синтаксис.
**************************
Простите за лишний пост, все написал.
Эта строка должна выглядеть так:
Range(Range("A5"), Range("A5").End(xlDown).Offset(0, 6)).Copy
**************************************
p.s. а мож это можно написать по другому, без .End(xlDown) ?
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1108
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

17 июн 2008, 00:43

[A5].CurrentRegion.Copy ?
Если в столбце G есть данные
Андрей Энтелис,
aentelis.livejournal.com
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

17 июн 2008, 06:26

Если в столбце "G" нет данных, то нет и требуемого диапазона.
Если есть, например, одно значение, то код

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

Range(Range("A5"), Range("A5").End(xlDown).Offset(0, 6)).Copy
скопирует диапазон "A5:G" & Rows.Count, т.е. до последней строки листа. Что есть не правильно, не говоря уже о том, что в столбце "G" может много раз встретиться пустая ячейка. Корректно, опять же при условии наличия хотя бы одного значения в столбце "G" (If Columns("G").Text <> ""), можно записать:

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

Range([A5], Cells(Cells(Rows.Count, "G").End(xlUp).Row, "G")).Copy
Аватара пользователя
VictorM
Сообщения: 787
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

17 июн 2008, 09:24

Aent, спасибо за совет, но .CurrentRegion в данном случае не идет, там вокруг этих данных полно еще всякого. Вообще стараюсь его применять очень ограниченно.
SAS888, большое спасибо, очень красиво. И работает как надо.
Только у меня вопрос возник, раньше не приходилось работать с [ ] и не могу понять синтаксис. Справка выдает "поиск не дал результатов".
Можно пару слов о применении [ ] ?
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

17 июн 2008, 10:26

[A5] - это то же, что Range("A5"). Просто сокращенная запись, которую "понимает" компилятор VBA.
Аватара пользователя
VictorM
Сообщения: 787
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

17 июн 2008, 10:31

SAS888, СПАСИБО!!!!
Я этого нигде не мог найти.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
VictorM
Сообщения: 787
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

17 июн 2008, 11:15

И вот опять вопрос по синтаксису.
Почему вот это

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

Worksheets("БТ").Range([A5], Cells(Cells(Rows.Count, "G").End(xlUp).Row, "G")).ClearContents
не работает, если лист не активен. Если сделаю вот так

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

Worksheets("БТ").Activate
Range([A5], Cells(Cells(Rows.Count, "G").End(xlUp).Row, "G")).ClearContents
все работает :confused:
но у меня таких листов 5 штук и не хочу я их активировать, только для того чтобы очистить диапазон с данными :(
можно их конечно сгруппировать и т.д. , но меня интересует - почему не работает первая строка?
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

17 июн 2008, 11:41

Если лист не активен, то ссылку на лист необходимо повторять при каждом обращении к ячейке. Иначе, получается, что Вы пытаетесь выделить диапазон от

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

Worksheets("БТ").Range("A5")
до последней заполненной ячейки столбца "G" активного листа. Т.е. нужно так:

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

With Worksheets("БТ")
        .Range(.Range("A5"), .Cells(.Cells(Rows.Count, "G").End(xlUp).Row, "G")).ClearContents
    End With
Ответить