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

» Excel VBA (часть 3)

Автор: Hugo121
Дата сообщения: 02.07.2010 22:44
Я уже сам хотел спросить, знаете ли Вы, но тут заметил, что пару постов выше всё объяснено.
Можно в модуль, можно в лист, можно кнопку поместить на лист и в неё код поместить. Если совсем не знаете, лучше почитайте хотя бы www.firststeps.ru - там, где "VBA by Step". Как раз первый урок.
Да и на этой странице - Рекомендуется к прочтению, первая строка ниже.

Добавлено:
vlth - там ведь не всё надо выделять. Надо ещё придумать, как определить, сколько символов надо, где не надо и т.д. Имхо не так просто, но пока не вникал в детали.
Автор: vlth
Дата сообщения: 02.07.2010 22:56

Цитата:
vlth - там ведь не всё надо выделять


Да? - значит я был невнимателен.

А... только имена... Понятно.

Интересно, откуда автор знает, что макрос будет "простеньким", если
Цитата:
Сама с макросами дела не имела...

Автор: Hugo121
Дата сообщения: 02.07.2010 23:03
Да в общем-то и не сложно. Даже автору понятно
Если подумать, можно наверное короче написать,тем более если кто уже такое делал.
Автор: vlth
Дата сообщения: 02.07.2010 23:17

Цитата:
Даже автору понятно
Хм... Заранее понятно?

Сложного, конечно, ничего нет, но возни...
Автор: Tambourine
Дата сообщения: 03.07.2010 01:55
vlth

Цитата:
Интересно, откуда автор знает, что макрос будет "простеньким"

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

Hugo121, Вам огромнейшая благодарность за Ваш труд. Спасибо!!! С удовольствием отблагодарю Вас в виде небольшого денежного гонорара если скажите электронные реквизиты какой-нибудь платежной системы.
Автор: oshizelly
Дата сообщения: 03.07.2010 10:56
vlth 30-06-2010 17:07

Цитата:
Выяснять цветовые индексы лучше в цикле

Код: For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Next

ColorIndex здесь будет соответствовать номеру строки залитой в 1-м столбце ячейки.
Автор: Hugo121
Дата сообщения: 03.07.2010 11:02
oshizelly Так там же рядом я дал готовый код, который всё это делает - и заливку, и шрифт: http://forum.ru-board.com/topic.cgi?forum=33&topic=10903&start=680#20
И там есть пример синтаксиса - Cells(i + 1, 2).Font.ColorIndex = i

Tambourine - я бы за такую работу не платил - жирным не выделяет, вообще не идеально... Как решить жирность - я так пока и не придумал.
Получилось макрос запустить? Я специально пример не выкладываю - лучше сами наладьте, забесплатно

Автор: oshizelly
Дата сообщения: 03.07.2010 11:04
Drazhar
Hugo121

Цитата:
Жмете Alt+F11(или сервис - Макрос- Редактор VBA)
Там заходите либо в лист либо вставляете модуль и в нем уже пишете приложение (sub/function)


Цитата:
Можно в модуль, можно в лист, можно кнопку поместить на лист и в неё код поместить.


А должна быть разница в зависимости от того, какой из этих методов использовать? Я пробовал по-всякому, но разницы не заметил: и так вроде работает, и эдак...
Автор: Hugo121
Дата сообщения: 03.07.2010 11:08
oshizelly
Разница есть, как курьёз - код из книги (ЭтаКнига) файла 2000 Экселя подвешивал Эксель2007. Долго не мог понять, в чём дело. Переложил код в модуль - заработало.
Автор: vlth
Дата сообщения: 03.07.2010 11:30
oshizelly

Цитата:
Хотел себе по аналогии сделать такой же список с образцами и номерами цветов шрифта. Для этого заменил "Interior.ColorIndex" на просто "ColorIndex". Получилось вот так:

Код:For i = 1 To 56
Cells(i, 1).ColorIndex = i
Next


А он пишет: "Run-time error '438': Object doesn't support this property or method". Короче, не вышло из меня программиста на VBA В чём ошибка, почему метод не поддерживается?


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

Нет у диапазона св-ва ColorIndex, а есть, кроме прочих, Interior (или Font), свойством которых является, в частности, ColorIndex.

Добавлено:
Для выяснения индексов цвета шрифтов не нужно писать доп. цикл - они такие же, как для заливки ячеек.
Автор: oshizelly
Дата сообщения: 03.07.2010 11:37
Hugo121
vlth

Цитата:
И там есть пример синтаксиса - Cells(i + 1, 2).Font.ColorIndex = i


Цитата:
Нет у диапазона св-ва ColorIndex, а есть Interior, свойством которого является, в частности, ColorIndex.

Но ведь и код, предложенный Hugo121, тоже не содержит указания на свойство Interior.
Кстати, он у меня пока и не работает, только я не успел разобраться в причинах.


Добавлено:
P.S.

Цитата:
Для выяснения индексов цвета шрифтов не нужно писать доп. цикл - они такие же, как для заливки ячеек.

До этого я и сам додумался, как ни странно Цель в основном была другая: посмотреть, как будут выглядеть шрифты разных цветов на экране.
Автор: vlth
Дата сообщения: 03.07.2010 11:47

Цитата:
Но ведь и код, предложенный Hugo121, тоже не содержит указания на свойство Interior.

Я уже подправил свой предыдущий ответ.

Прошу прощения, не сразу понял суть вопроса: тобы посмотреть цвета шрифта, нужно 'Interior' заменить на 'Font'.
Автор: Hugo121
Дата сообщения: 03.07.2010 11:48

Цитата:
Кстати, он у меня пока и не работает

Похоже, что это из-за использования в коде
str0 = Right("000000" & Hex(C
и
.Formula = "=Hex2dec("
Выход - установить надстройку "Пакет Анализа" или просто удалить эти строки кода - у Вас не будет в ячейках раскладки цветов в RGB.

Р.S. - я проверил код из форума - у меня работает, надстройка установлена.
Автор: vlth
Дата сообщения: 03.07.2010 12:12
Tambourine

Цитата:
Hugo121
Получилось макрос запустить?


Вот это ожидаемый вопрос: Tambourine, Вы предоставили минимум информации о задаче, так что нам
можно только строить предположения, что там, да как - и с данными, и с их расположением на листе...

Было бы лучше пример файла куда-нибудь выложить.
Автор: Hugo121
Дата сообщения: 03.07.2010 12:24
Tambourine
Да, как я представляю - есть файл, куда надо добавить комментарии, и есть список комментариев. Так вот, совсем не обязательно писать этот список в целевой файл. Список может быть в любом другом файле. Макросу нужно указать, где что брать и куда помещать. Т.е. готовите файл со списком, можете в него поместить макрос, или вообще из любого другого файла его выполнять, и кодом открываете целевой файл. В итоге в целевом файле не будет лишнего списка и макроса, в нём всего лишь добавятся комментарии и всё.
Имхо я бы делал так.
Но это всё надо делать по месту - надо знать детали.
Так что изучайте VBA - и работать будет легче.
Автор: oshizelly
Дата сообщения: 03.07.2010 12:43
vlth 28-06-2010 18:55


Цитата:

Цитата: Если очень упрощенно: в столбце числовые значения, допустим, от 1 до 9, надо, чтобы каждое число отображалось своим цветом.
Первая мысль, конечно, условное форматирование, но Excel 2003 не позволяет задать более 3-х условий, а в этом примере их нужно 9.

В модуле листа:

Код: Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Not Intersect(Target, Range(Me.Cells(1, 1), Me.Cells(9, 1))) Is Nothing Then
For Each c In Target
With c.Font
Select Case c
Case 1: .ColorIndex = c + 2
Case 2: .ColorIndex = c + 2
Case 3: .ColorIndex = c + 2
Case 4: .ColorIndex = c + 2
Case 5: .ColorIndex = c + 2
Case 6: .ColorIndex = c + 2
Case 7: .ColorIndex = c + 2
Case 8: .ColorIndex = c + 2
Case 9: .ColorIndex = c + 2
Case Else: .ColorIndex = xlAutomatic
End Select
End With
Next
End If
End Sub
Автор: vlth
Дата сообщения: 03.07.2010 12:45

Цитата:
надо присвоить красный цвет (желательно, с болдом)

Красный цвет - шрифта или заливки?
Автор: Hugo121
Дата сообщения: 03.07.2010 13:03
Tambourine
Есть подвижка с жирностью - если нашли помощников на месте, работает такой код:

Код: Sub ttt()
With Sheets(2).Cells(1, 7).Comment.Shape.TextFrame
With .Characters(Start:=3, Length:=4).Font
.Name = "Arial Cyr"
.FontStyle = "полужирный"
.Size = 10
End With
End With
End Sub
Автор: oshizelly
Дата сообщения: 03.07.2010 13:08
vlth

Цитата:
Красный цвет - шрифта или заливки?

Я имел в виду, что шрифта... Но можно и заливки.
Автор: vlth
Дата сообщения: 03.07.2010 13:23
oshizelly

Код: Sub example()
Dim oRange As Range, oCell As Range

Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
Set oRange = Union(oRange, Range(Cells(2, 3), Cells(100, 3)))

For Each oCell In oRange
If oCell > -1 And oCell < 15000 And oCell <> "" Then
With oCell.Font
.Bold = True
.ColorIndex = 3
End With
End If
Next oCell
End Sub
Автор: Hugo121
Дата сообщения: 03.07.2010 13:54
[more=To Off]Электрокосилкой - самое то сухое косить. Но соседи отвлекли - идём купаться, вот только забежал форумы глянуть [/more]
Автор: oshizelly
Дата сообщения: 03.07.2010 14:29
vlth 03-07-2010 13:23
Спасибо, но не работает Что я делаю неправильно?




И ещё одна просьба. Здесь использован совсем другой синтаксис, чем в предыдущем примере Case 1: .ColorIndex = c + 2 . Понятно, что задачу обычно можно решить несколькими альтернативными способами, но для не так наглядно, как при повторении тех же конструкций. Нельзя ли для сравнения привести код с решением по аналогии с Case 1: .ColorIndex = c + 2 ?
А то в первой части, где задаётся диапазон ячеек, много загадочного и таинственного. Пытался, но не смог разобраться, что в синтаксисе вот этих выражений:
- Range(Cells(1, 4)
- Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
- Union(oRange, Range(Cells(2, 3), Cells(100, 3)))

Спасибо!
Автор: vlth
Дата сообщения: 03.07.2010 15:09

Цитата:
Что я делаю неправильно?

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


Цитата:
Здесь использован совсем другой синтаксис, чем в предыдущем примере Case 1: .ColorIndex = c + 2

Потому что условие - одно, а Select Case предполагает их множество.
Никто так не пишет:

Код: Select Case oCell
Case 0 To 14999
If oCell<>0 then
With oCell.Font
.Bold = True
.ColorIndex = 3
End With
End If
End Select
Автор: Hugo121
Дата сообщения: 03.07.2010 15:40
oshizelly
Нормально код отработал, правда я с картинки набирал, не нашёл оригинала в текстовом виде, так что может у Вас где-то символы русские проскочили.
Ну а чтоб понятнее - прогоните этот же код пошагово, я там лишних селектов добавил для понятности:

[more=Тут код]

Код: Option Explicit

Sub example()
Dim oRange As Range, oCell As Range
Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
oRange.Select
Range(Cells(2, 3), Cells(100, 3)).Select
Set oRange = Union(oRange, Range(Cells(2, 3), Cells(100, 3)))
oRange.Select
For Each oCell In oRange
If oCell > -1 And oCell < 15000 And oCell <> "" Then
With oCell.Font
.Bold = True
.ColorIndex = 3
End With
End If
Next oCell

End Sub
Автор: oshizelly
Дата сообщения: 03.07.2010 17:07
vlth
Hugo121

Ага, нашёл причину ошибки, действительно, была глупейшая очепятка. Теперь всё работает, как часы.

Однако всё равно никак не могу понять, какие именно символы в этом коде указывают на столбец D Вероятно, одна из "4" в первой строке, но какая именно? Экспериментальным путём этого пока установить не удалось.

Код: Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
Set oRange = Union(oRange, Range(Cells(2, 3), Cells(100, 3)))
Автор: Hugo121
Дата сообщения: 03.07.2010 17:12
oshizelly
Т.е. пошагово не прогонял?
Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
oRange.Select
Это не анализировал, почему выделяет именно это?

А изменения, внесённые макросом, назад не вернуть. Разве что предварительно делать копию листа, или запоминать параметры изменяемого в переменные, но это малореально.
Автор: oshizelly
Дата сообщения: 03.07.2010 17:16
Hugo121

Цитата:
Т.е. пошагово не прогонял?

Не успел, так как отпала необходимость. Начал с того, что по совету умных людей ещё раз перепроверил свой вариант кода, и быстро обнаружил опечатку.
Но если бы даже и прогонял, то все равно это не помогло бы. И так понятно, что эта строка определяет диапазон. Но какое именно выражение в этой строке указывает на столбец D ?
Автор: Hugo121
Дата сообщения: 03.07.2010 17:20
Четвёрка , и именно все.
Автор: oshizelly
Дата сообщения: 03.07.2010 18:47

Цитата:
Четвёрка , и именно все.


Всё равно не понимаю Вот в этой строке
Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
в начале указана первая ячейка Cells(1, 4).
Выражение End(xlUp).Row, 4) в конце строки указывает, что надо включить все ячейки до конца столбца, так?
А для чего нужно выражение (ActiveSheet.Rows.Count, 4) в середине строки?

Автор: Hugo121
Дата сообщения: 03.07.2010 20:11
Как в школе уравнения решали? Правда может сейчас иначе...
Set oRange = Range(Cells(1, 4), Cells(Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row, 4))
Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row = 10 (правда я сейчас пример не помню, может там не 10)
Set oRange = Range("D1",Cells(10, 4))
Set oRange = Range("D1","D10")
Set oRange = Range("D1:D10")

А вот это
Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row
означает последний заполненный ряд в 4-ом столбце, если искать снизу.

Часто применяют в коде
iLastRow = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row + 1
Вот в Cells(iLastRow,1) можно копировать новые данные.
Вроде всё.
Нет, ещё пример из рабочего кода:

Код: With .Worksheets("тест_лист") 'с конкретным листом в открытой книге
'номер последней заполенной строки
iLastRowTempWb = .Cells(Rows.Count, 1).End(xlUp).Row
'последняя строка в итоговом файле на листе
iLastRowBaza = BazaSht.Cells(Rows.Count, 1).End(xlUp).Row + 1
'копируем диапазон с открытой книги в заданный лист
.Range(.Cells(2, 1), .Cells(iLastRowTempWb, 27)).Copy Destination:=BazaSht.Cells(iLastRowBaza, 1)
End With

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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