Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: visual73
Дата сообщения: 13.08.2008 11:40
ecolesnicov
Нет. Ограничения заложены только в саму функцию Transpose.

Причем взять из ячеек элемент со строчкой превышающей 255 знаков можно:
Массив = Application.Transpose(Range(... ))

А обратно положить развернув не получится:
Range(... ) = Application.Transpose(Массив) - не работает для >255 знаков
Автор: recommend
Дата сообщения: 13.08.2008 13:03
Друзья, подскажите, пожалуйста, можно ли в VBA Excel получать данные по электронной почте?

Есть там какой-то класс Mailer но как с ним работать не понятно
Автор: MaximuS G
Дата сообщения: 15.08.2008 12:20
Привет всем!

Я начинающий программер по VBA... Требуется по работе, но на среднем уровне... До этого не программировал вообще... Скачал книгу, начал разбираться - ох и тяжело, а спросить не у кого... Вот вообщем ситуация, поэтому 3 вопроса:

1) Подскажите, пожалуйста, хорошую книгу или сайт по самообучению, или как еще можна выучить.
2) Может ли кто-нибудь дать свою аську, постараюсь сильно не докучать тупыми вопросами ?
3) В форуме можна задавать тупые вопросы ?

Заранее благодарю!
Автор: WowGun
Дата сообщения: 15.08.2008 13:10
1. Джон Уокенбах (один из ...)
2.
3. ВСЕ с ЭТОГО начинали ....

а лучше МАКРОРЕКОРДЕР в Excel .... а ПОТОМ книжки ...
Автор: SERGE_BLIZNUK
Дата сообщения: 15.08.2008 20:08
MaximuS G полностью согласен с WowGun
Записывайте код макрорекодером. Смотрите его. Обязательно читайте и разбирайте чужой код. лично я, то, что знаю и умею, процентов на 70% - это то, что "подсмотрел" в чужом коде ;-) Пробуйте писать свой код. Что не получается - спрашивайте, обязательно помогут.
По поводу книжек
- обратите внимание, в шапке есть ссылка на топик, посвящённый книгам по VBA - "Книжульки по VBA [?] - книги по программированию с использованием VBA"
в электронном виде попадались мне лично попадались: [more]
"Programming Excel with VBA and .NET [Jeff Webb, Steve Saunders]"
"Программирование на VBA Учебное пособие. [Е.Н. Горных]"
"Программирование на VBA 2002 [Кузьменко В.Г.]"
"Профессиональное программирование на VBA в Excel 2002 [Уокенбах Джон]"
"Л.А.Демидова, А.Н.Пылькин - Программирование в среде VBA"
"VBA для тех, кто любит думать [Антон Орлов]"
"VBA для `чайников` [Стив Камминг]"
"Программирование в Microsoft Office. Для пользователя"
"Освой самостоятельно программирование для Microsoft Excel 2000 за 21 день [Мэтью Харрис]"
"Использование макросов в Excel [С. Роман]"
[/more]

и ещё очень рекомендую посетить ПланетуExcel - ссылка опять таки есть в шапке
и Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.

дорогу осилит идущий..


Автор: eltqnf
Дата сообщения: 15.08.2008 21:36
Всем привет!
Хочу задать вопрос, на который ответов не нашел в т.ч. и на этом форуме. Если он глупый - будьте лояльны. Я ни разу не опытен в ВБА. Отмазка весьма слабая, но все же.
В общем суть в том, что мне нужно в n-ой ячейке видеть результат следующей математической операции (А1/2 или А1*2/3 или А1*2/5):

если А1 находится в интервале от 0 до 30, то должно выполняться первое из условий в скобках;
если А1 в интервале от 31 до 60, то второе условие из скобок;
если А1 в интервале от 61 до 100, то - третье условие.
А1 взято для примера.

Заранее всем благодарен хотя бы за то, что уже узнал на данном ресурсе!
Автор: visual73
Дата сообщения: 15.08.2008 22:38

Цитата:
. Скачал книгу


Цитата:
не нашел


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

WowGun
SERGE_BLIZNUK
а Вы товарищи ведетесь. Вы посмотрите на них, они только и регистрируются только для этого.
Как легко раскрутить нашего брата

Уж простите за офтоп.
Автор: SERGE_BLIZNUK
Дата сообщения: 15.08.2008 23:10
eltqnf
не все области заданы, что, если число меньше нуля, или больше 100??
а решается элементарно, через ЕСЛИ:

Код: =ЕСЛИ(A1<=30;A1/2;ЕСЛИ(И(A1>30;A1<=60);А1*2/3;А1*2/5))
Автор: visual73
Дата сообщения: 16.08.2008 07:44
SERGE_BLIZNUK
Все ясно. Спасибо за разъяснения! А то в голову чего только не лезет.
А ссылки то убрали
Приношу свои извинения кого обидел.
Непонятно только люди то при чем, на которых ругаются?
Автор: eltqnf
Дата сообщения: 16.08.2008 19:04
SERGE_BLIZNUK
Огромное спс)
У меня сопутствующий вопрос. Если "значение_если_ложь" больше чем 2-3 штуки как это будет выглядеть? Если тупо дописывать их в эту же форму ничего не выходит. Заранее сорри за отсутствие фантазии!

Добавлено:
SERGE_BLIZNUK


Спасибо еще раз, хороший человек! Я сам додумал))
Там просто нужно было вместо действия при результате ЛОЖЬ подставить следующий блок "ЕСЛИ(И")))Все заработало)
Автор: SERGE_BLIZNUK
Дата сообщения: 17.08.2008 13:01

Цитата:
Я сам додумал
eltqnf, вот и молодец!!!

А я просто напомню, было красивое решение от Robert

Цитата:
При большом количестве вложенных функций ЕСЛИ формула становится громоздкой, сложно понимаемой и трудно изменяемой. В этом случае лучше использовать дополнительную табличку и функцию ВПР.

подробности смотрим в оригинальном сообщении - (с) Robert - замена сложных вложенных =ЕСЛИ( на ВПР()
Автор: Shabba
Дата сообщения: 18.08.2008 16:11
Господа, подскажите пожалуйста как можно решить такую проблему:

У меня есть база .mdb в access, в ней таблица с двумя столбцами - "номер" и "название" (данные могут дублироваться).
И есть .xls книга, в кторой куча столбцов среди которых также есть - "номер" и "название", но т.к. данные заносятся вручную, то названия может не быть.

И собственно вопрос, как можно макросом сделать так, чтоб он выбрал все ячейки с номером и если в соседней ячейке нет названия, то сделал бы запрос к дб и подставил название в пустую ячейку справа, которое соответствует номеру из бд?

Заранее благодарен!
Автор: Kanev75
Дата сообщения: 19.08.2008 09:14
Как можно изменить/отредактировать файл надстройки (xla) ?
Автор: visual73
Дата сообщения: 19.08.2008 09:30
Kanev75
Входишь в редактор VBA (Alt-F11).
Если меняешь код надстройки то просто жмешь на Сохранить в VBA редакторе.
Если хочешь изменить содержание на листах: заходишь в надстройку, жмешь "ЭтаКнига", в свойствах ставишь IsAddin в False, делаешь изменения, меняешь IsAddin в True, сохраняешь.
Автор: ecolesnicov
Дата сообщения: 19.08.2008 09:52
Kanev75
Также как и обычный файл ... Открыть и изменить. Если по конкретнее - то xla-файлы отличаются от обычных тем, что не показываются в интерфейсе Excel, но при этом могут содержать листы, макросы, формы и пр. Все это видно через отдельное окно Visual Basic. Таким образом:
1) Открываете vba-файл
2) Переходите в Окно Visual Basic (через Alt+F11 или через меню).
3) Находите в Project Explorer (плавающее окошко обычно прикрепленное в правом верхнем углу окна Visual Basic) свой xla-файл. Если под-окно Project Explorer не показывается - через пункт меню View включаете его.
4) Кликаете 2 раза на вашем файле.
5) Должен открыться список объектов (листов, модулей, форм и пр.) этого файла.
6) Обычно vba-файлы не содержат на страницах какой либо информации, а только модули и формы VBA. Соответственно через окно Visual Basic и меняйте.
7) Сохранять тоже через окно VBA - просто стоя на вашем файле в project explorer нажмите пункт меню Save в окне VBA.

7) примечание1. Если при двойном клике на имени xla-файла в Project Explorer спрашивает пароль - то его надо знать!

8) примечание2. Если все же xla-файл содержит табличные страницы - то "включить" их показ (и заодно всего этого файла xla в интерфейсе Excel, а не только VBA) можно через изменение свойства IsAddin объекта всей рабочей книги (показывается в Project Explorer если "раскрыть" xla-файл). Окно свойств это отдельное под-окно VBA, где показываются все properties активного объекта из Project Explorer, расположенное в правом нижнем углу VBA-окна. Таким образом, Надстройка это или обычный файл определяется не разрешением файла, а этим свойством! После показа в интерфейсе страниц - исправьте то что вам нужно и не забудьте назад поменять свойство IsAddin перед сохранением (сохранять потом уже соответственно через окно VBA). Если же цель наоборот из xla файла сделать обычный xls - то не меняйте это свойство, а просто сохраните под нужным вам именем.
Автор: MaximuS G
Дата сообщения: 19.08.2008 11:55
Подскажите, пожалуйста, что такое FormulaR1C1... или просто R1C1 ?

Начинающий ))

Добавлено:
Опять вопрос ))

Как оператором For... Next заполнить ячейки в ряду(колонке) определенными значениями, или существует другой оператор.

Заранее спасибо!!!
Автор: SERGE_BLIZNUK
Дата сообщения: 19.08.2008 20:57
MaximuS G
что-то все молчат...
Ну ладно, тогда позвольте мне.
задаёте конкретные вопросы - получаете конкретные ответы.
Абстрактные вопросы - .... ну, Вы поняли мою мысль.


Код:
Row1 = ActiveWorkbook.ActiveSheet.UsedRange.Row
Row2 = Row1 + ThisWorkbook.ActiveSheet.UsedRange.Rows.Count - 1
Col1 = ActiveWorkbook.ActiveSheet.UsedRange.Column
Col2 = Col1 + ThisWorkbook.ActiveSheet.UsedRange.Columns.Count - 1


For j = Col1 To Col2
For i = Row1 To Row2
Cells(i, j).Value = "i=" & Str(i) & " j=" & str(j)
Next i
Next j
Автор: visual73
Дата сообщения: 20.08.2008 07:52

Цитата:
что-то все молчат...

наверное не могут простым языком объяснить, только междометиями

пардон

MaximuS G

Цитата:
что такое FormulaR1C1

Справочная система пишет:
Returns or sets the formula for the object, using R1C1-style notation in the language of the macro. Read/write Variant
а R - ряд, С - колонка т.е. R1C1 - другой формат ссылки/диапазона
Автор: MaximuS G
Дата сообщения: 20.08.2008 09:42
Спасибо за объяснение, но что-то я ничего не понял )))

Попробую по конкретней:

Есть диапазон ячеек С10:K10 - заполнить их значением 1 и выделить желтым цветом
2) Необходимо начать рассматривать ряд снизу (11) на протяжении диапазона С11:Q11
Есть условие: ячейка(С27) ниже на 16 рядов (например если необходимо заполнить С11 - то смотрим на С 27) должна быть либо >=0, либо <. Если > - то не заполняем и переходим на следующую в ряду, если <, то заполняем ее и следующие за ней 8 ячеек 1 и желтым цветом. Переходим на новый ряд...

Если написал глупость так и скажите, буду пробовать что-то другое...

Тогда буду пытаться как выделить диапазон для For i = 1я ячейка to последняя ячейка ...
Автор: visual73
Дата сообщения: 20.08.2008 11:10
Не могу понять.
На листе есть комбик.
Пишу в workbook_Open:

Dim shMain As Worksheet
Set shMain = Worksheets("List1")
shMain.cbКомбик.AddItem "1" - пишет ошибку

Если же объявить так
Dim shMain
то все нормально. Почему не понятно.

MaximuS G

Цитата:
Есть диапазон ячеек С10:K10 - заполнить их значением 1 и выделить желтым цветом

for c=3 to 11
cells(10, c).value=1
cells(10, c).Interior.Color= 65535
next

Автор: MaximuS G
Дата сообщения: 20.08.2008 12:19
visual73

Классно работает...

Почему у меня не работает? Как написать правильно?

For c = 4 To 11 ' выбираю рассм диапазон (как задать ряд??)
If ActiveCell < 0 Then 'если значение активной ячейки меньше нуля, то
ActiveCells.Offset(-1, 0) = 5 'выбираю ячейку выше активной на 1 ряд и активирую ее?
End If
Next

Все таки пытаюсь сделать то, о чем писал в прошлом сообщении

Добавлено:
Как сделать активной, сам нашел ...

ActiveCells.Offset(x, y).Select )))
Автор: visual73
Дата сообщения: 20.08.2008 13:29
MaximuS G
К сожалению то что у Вас написано в первом сообщении (как впрочем и во втором) мне непонятно - не литературным языком написано А додумывать за Вас мне лень.
Что в целом вы хотите я так и не понял.

For c = 4 To 11 ' здесь никакой диапазон не выбирается, а переменной "с" передаются циклично значения от 4 до 11. Вот и все.
If cells(10, c).value < 0 Then 'здесь мы циклично проверяем каждую ячейку в строке 10 и столбцах от 4 до 11. Ячейки активировать не нужно, это увеличивает время выполнения программы.
cells(10, c).Offset(-1, 0) = 5 'вставляем в ячейку смещенную относительно текущей (но не активной!! - это разная вещь)
End If
Next

Добавлено:
кто бы еще и мне помог ;(
Автор: MaximuS G
Дата сообщения: 20.08.2008 14:30
Спасибо, но я так понимаю мне надо что-то другое... Вот то что я начал писать... Вставьте в Excel и я думаю вы поймете что мне надо сделать... Может это конечно дурь, но как тогда учиться??... Рассматривать нуждно с метки 1...
Тоже не пойму, почему оператор Goto переводит программу на метку только после того, как закончит все до метки???...
Сори за то, что много вопросов, наверное у всех так было по началу )))


Sub tt()

Range("C10:Q24").Select
With Selection
.HorizontalAlignment = xlCenter
End With
Selection.Interior.ColorIndex = xlNone
Selection.Font.ColorIndex = 0
Selection.ClearContents

[more]
For c = 3 To 11
Cells(10, c).Value = 1
Cells(10, c).Interior.ColorIndex = 6
Next

' метка 1

Range("C11").Select
If Range("C27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("C27") < 0 Then
For c = 3 To 11
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
GoTo 59
Next
End If


Range("D11").Select
If Range("D27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("D27") < 0 Then
For c = 4 To 12
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
Next
End If


Range("E11").Select
If Range("E27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("E27") < 0 Then
For c = 5 To 13
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
Next
End If


Range("F11").Select
If Range("F27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("F27") < 0 Then
For c = 6 To 14
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
Next
End If

Range("G11").Select
If Range("G27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("G27") < 0 Then
For c = 7 To 15
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
Next
End If

59: Range("C12").Select

End Sub [/more]


Добавлено:
visual73


Цитата:
If cells(10, c).value < 0 Then 'здесь мы циклично проверяем каждую ячейку в строке 10 и столбцах от 4 до 11. Ячейки активировать не нужно, это увеличивает время выполнения программы.


... как сделать сдесь чтоб он перешел на другую операцию после того, как найдет первую нужную ячейку и выполнит операцию, не продолжая ???
Автор: ScorpionS
Дата сообщения: 20.08.2008 17:10
Надо, чтобы при нажатии кнопки происходила фильтрация по определенному столбцу по типу "содержит...". Вроде код для кнопки выглядит так:

Код: Private Sub CommandButton1_Click()
ActiveSheet.Range("$A$1:$IR$65536").AutoFilter Field:=18, Criteria1:="=*1111*", Operator:=xlAnd
End Sub
Автор: SERGE_BLIZNUK
Дата сообщения: 20.08.2008 19:04
MaximuS G
1) Более 15 строк рекомендуется скрывать за тэгом.
пожалуйста, спрячьте Ваш большой код за тэгом [no][MORE] тут ваши изыскания [/MORE][/no]

2) рекомендуется код оформлять в тэги [no]
Код: ваш код...
Автор: MaximuS G
Дата сообщения: 21.08.2008 08:39
SERGE_BLIZNUK

За тегом... если б я знал что это ))

Сейчас попробую.

[more] Range("F11").Select
If Range("F27") >= 0 Then
ActiveCell.Offset(0, 1).Select
ElseIf Range("F27") < 0 Then
For c = 6 To 14
Cells(11, c).Value = 1
Cells(11, c).Interior.ColorIndex = 6
Next
End If [/more]



Добавлено:
SERGE_BLIZNUK

Так, хоть это у меня получилось))

Теперь еще раз попробую объяснить... Что то у меня плохо получаеться...
Есть поле для деятельности С10:Q24, программа должна начать рассматривать ряд(а их 14) с первой ячейки(С10, С11, С12...), и как только она находит ячейку, для которой выполняеться условие(ячейка находящаяся под ней в 27ряду ниже нуля), происходит автозаполнение справа... получаеться в одном ряду не должно быть больше 9ти заполненных ячеек...
И еще есть сложный момент, ячейки не могут выходить за границу колонки Q, и получается что начиная с ячеек колонки J заполняться будет происходить так от минус 1 ячейка от колонки J (чтоб не выйти за границу), соответсвенно K -2, L -3 и последняя Q -9... Вообщем так, если я придумал что сложное, то сори... Скажите, буду делать что другое...


Код:
Range("C11").Select ' выбираю первую ячейку в ряду
If Range("C27") >= 0 Then ' рассматриваю условие(то о чем писал выше)
ActiveCell.Offset(0, 1).Select ' выбираю справа от нее, если больше нуля, перехожу на следующую в ряду
ElseIf Range("C27") < 0 Then ' если меньше, заполняю справа ячейки
For c = 6 To 14 '
Cells(11, c).Value = 1 '
Cells(11, c).Interior.ColorIndex = 6 '
Next
End If
Автор: SERGE_BLIZNUK
Дата сообщения: 21.08.2008 09:13
MaximuS G
Цитата:
Сейчас попробую.
спасибо. Так гораздо лучше!
Так объясните, что Вы пытаетесь указанным куском кода сделать?
по крайней мере, его лучше записать без дополнительного цикла. вот так (полностью аналогично тому, что делает Ваш код, только без циклов!

Код: If Range("F27") >= 0 Then
Range("F11").Offset(0, 1).Select 'хотя я бы лучше написал Range("F12").Select
ElseIf Range("F27") < 0 Then
With Range("F11:N11")
.Value = 1
.Interior.ColorIndex = 6
End With
End If
Автор: ScorpionS
Дата сообщения: 21.08.2008 10:00
SERGE_BLIZNUK
Спасибо, вроде работает! Но не могу понять почему он фильтрует только 57184 строк. Ведь в коде явно указано $IR$65536. В чем может быть проблема?
Автор: nopoxz
Дата сообщения: 21.08.2008 10:47
Можно ли как-то организовать проверку предидущей ячейки (по столбцу) на пустоту/наличие данных?

Пытаюсь сделать что-то такое, не получается:

If IsEmpty(ячейка выше) Then...

If NOT IsEmpty(ячейка выше) Then...
Автор: MaximuS G
Дата сообщения: 21.08.2008 11:18
SERGE_BLIZNUK

Цитата:
Очень рекомендую Вам - создайте в Excel пример, один лист заполните исходными данными, думаю пары строк будет достаточно! ( там же через "Надпись" и стрелочки укажите, что проеряется, как заполняется...) так же желательно второй лист заполнить
(так же пару строк) ЧТО должно получится после работы макроса.
полученный пример запакуйте и выложите куда-нибудь на бесплатный хостинг (rapidshare.com или ifolder.ru или zalil.ru и т.д. ) сюда ссылку для скачивания.


http://rapidshare.com/files/138938092/__1056___1072___1089___1087___1080___1089___1072___1085___1080___1077____1087___1086____1082___1072_.html
Вот сдесь этот файлик...

Там очень много условий... Поэтому если это забирет у Вас много времени, сил и т.д.,
сделайте то что достаточно просто... Это мне не обязательно надо, просто хотелось бы немного автоматизировать...


Цитата:
Кроме того, мне кажется, что Вы - НЕ ПРОГРАММИСТ... Это плохо,

Да Совсем не программист, но всегда мечтал ...

Спасибо за помощь!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.