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

» Excel VBA (часть 3)

Автор: ElchinAz
Дата сообщения: 29.06.2010 23:15

Цитата:
Это не так. Используйте формулу (выбирайте в комбобоксе не 'Значение', а 'Формула').

Спасибо. Уже сделал. Получилось. Но всё же пришлось использовать побочную ячейку для подусловия. А в Формуле можно ли использовать вложенные условия?


Добавлено:
vlth
..и как вы думаете, что же всё-таки лучше использовать: идентичный макрос или эту самую функцию?
Автор: vlth
Дата сообщения: 30.06.2010 06:22

Цитата:
А в Формуле можно ли использовать вложенные условия?

Единственное ограничение, по-моему, - формула должна возвращать логическое значение
(т.е. ИСТИНА или ЛОЖЬ), а в остальном - всё так же, как в обычной формуле.

Цитата:
..и как вы думаете, что же всё-таки лучше использовать: идентичный макрос или эту самую функцию?
Если возможно, всегда лучше использовать встроенную функциональность.
К примеру, пользовательские функции: они работают медленнее "родных" функций листа.
Автор: KolyaP
Дата сообщения: 30.06.2010 10:47
При пошаговом проходе ошибка возникает в строке
Range(.Cells(2, 13), .Cells(500, 13)).ClearContents
Автор: Drazhar
Дата сообщения: 30.06.2010 10:52
точку перед range поставьте
А то он у вас на activesheet ищет
Автор: KolyaP
Дата сообщения: 30.06.2010 11:31
Drazhar
Спасибо, заработало.

Вот в Microsoft замутили. И перед Range и перед Cells нужно указывать полный путь. Зачем такая избыточность? Все равно разные пути указать нельзя, будет ошибка.
Автор: oshizelly
Дата сообщения: 30.06.2010 13:12
vlth 28-06-2010 18:55

Цитата:

Цитата: Подскажите, как решить вот такую задачу. Если очень упрощенно: в столбце числовые значения, допустим, от 1 до 9, надо, чтобы каждое число отображалось своим цветом.

For Each c In Target
With c.Font
Select Case c
Case 1: .ColorIndex = c + 2
Case 2: .ColorIndex = c + 2
....
Пояснение: здесь для каждой ячейки, содержащей натур. число от 1 до 9, задаётся индекс цвета шрифта на 2 больше содержимого.
Автор: Hugo121
Дата сообщения: 30.06.2010 15:11
Для решения таких вопросов можно использовать рекордер (это быстрее поиска в сети)

Код: With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
Автор: vlth
Дата сообщения: 30.06.2010 17:07
oshizelly
Цитата:
после этого дополнительного пояснения ясность ушла и не хочет возвращаться

Разберём "по косточкам" строку
Код: Range(Me.Cells(1, 1), Me.Cells(9, 1)))
Автор: Hugo121
Дата сообщения: 30.06.2010 17:31
Можно и так, но проще нажать на запись, залить ячейку цветом, остановить запись и посмотреть код.
А для всех цветов есть уже готовый файл в сети, вот макрос из него:

Код: Sub colors56()
'57 colors, 0 to 56
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual 'pre XL97 xlManual
Dim i As Long
Dim str0 As String, str As String
For i = 0 To 56
Cells(i + 1, 1).Interior.ColorIndex = i
Cells(i + 1, 1).Value = "[Color " & i & "]"
Cells(i + 1, 2).Font.ColorIndex = i
Cells(i + 1, 2).Value = "[Color " & i & "]"
str0 = Right("000000" & Hex(Cells(i + 1, 1).Interior.Color), 6)
'Excel shows nibbles in reverse order so make it as RGB
str = Right(str0, 2) & Mid(str0, 3, 2) & Left(str0, 2)
'generating 2 columns in the HTML table
Cells(i + 1, 3) = "#" & str & "#" & str & ""
Cells(i + 1, 4).Formula = "=Hex2dec(""" & Right(str0, 2) & """)"
Cells(i + 1, 5).Formula = "=Hex2dec(""" & Mid(str0, 3, 2) & """)"
Cells(i + 1, 6).Formula = "=Hex2dec(""" & Left(str0, 2) & """)"
Cells(i + 1, 7) = "[Color " & i & ")"
Next i
done:
Application.Calculation = xlCalculationAutomatic 'pre XL97 xlAutomatic
Application.ScreenUpdating = True
End Sub
Автор: vlth
Дата сообщения: 30.06.2010 17:42
KolyaP, Drazhar, Johnson Finger



Цитата:
Вот в Microsoft замутили. И перед Range и перед Cells нужно указывать полный путь. Зачем такая избыточность? Все равно разные пути указать нельзя, будет ошибка.


Да... почему-то при указании книги, Range можно использовать только как св-во...

А вот так работает... Range как объект...


Код: With Worksheets("Товары")
Range(.Cells(2, 13), .Cells(500, 13)).ClearContents
End With
Автор: ElchinAz
Дата сообщения: 30.06.2010 20:33
vlth
Спасибо за совет. )
Автор: KolyaP
Дата сообщения: 30.06.2010 21:24
Кто-нибудь сталкивался со следующим.

Создаем на листе Поле со списком (он же Combobox), заполняем в свойствах ListFillRange диапозоном ячеек (например A10:A15), закрывая сохраняем книгу.

Тут же открываем ее же, ничего не меняем, тут же закрываем. Выдается запрос на сохранение изменений, хотя ничего не меняли.

Почему выдается запрос и как с этим бороться?
Автор: vlth
Дата сообщения: 30.06.2010 22:06
KolyaP
Почему? - наверное, заполняется комбобокс... Хотя, запрос на сохранение происходит даже при отключенных макросах.

Как бороться
Код: ThisWorkbook.Close False
Автор: oshizelly
Дата сообщения: 01.07.2010 11:09
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
Автор: Drazhar
Дата сообщения: 01.07.2010 12:12
oshizelly
А в чем проблема-то?
Если нужны интервалы,то никто не мешает использовать
case 1 to 100:Действие 1
case 101 to 200:Действие 2 и так далее
С датами, просто натравливайте case на функцию Month от значения(от 1 до 12)
С яблокмии
Select Case instr(c,яблоки)
case 0: ничего не делаем
case else:действие по яблокам
end select
и так по каждому фрукту
Автор: KolyaP
Дата сообщения: 01.07.2010 12:33
vlth


Цитата:
Как бороться
Код:ThisWorkbook.Close False
или
Код:Application.DisplayAlerts=false
ThisWorkbook.Close


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

Сейчас он выдается всегда.
Автор: vlth
Дата сообщения: 01.07.2010 16:19
Drazhar

Цитата:
oshizelly
А в чем проблема-то?
Проблема в том, что oshizelly не программирует в VBA.

oshizelly, я ведь писал, что выложил пример, требующий доводки под задачу.
Согласитесь, условий Вашей задачи я знать не мог

В рабочем коде, кстати, фрагмент
Код: .ColorIndex = c + 2
Автор: Drazhar
Дата сообщения: 01.07.2010 17:00
vlth
пардон)))
Автор: Tambourine
Дата сообщения: 02.07.2010 06:35
Помогите с простеньким макросом под excel

Необходим макрос для вставки примечаний.

То есть, в excel-книге 2 листа - в одном подготовленные примечания (в виде обычного текста), а в другой лист эти примечания нужно вставить.
Формат исходных данных (примечаний) примерно такой:

Петр Сергеевич
[1:7] Москва
[1:7] Брянс
[1:7] Санкт-Петербург
Катерина Анатольнва
[1:7] Кишинев
[1:7] Урюпинск
[1:7] Владимир

Святослав
[23:4] Ростов на Дону
[23:4] Альметьевск
[23:4] Сызрань

Егорьев Николай Ефимович
[19:100] Иркутстк
[19:100] Ижевск
[19:100] Ставрополь
Маргарита
[19:100] Москва
Оленька
[19:100] Санкт-Петербург

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

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

в ячейку R1C7 втсавить такое примечание:
Петр Сергеевич
[1:7] Москва
[1:7] Брянс
[1:7] Санкт-Петербург
Катерина Анатольнва
[1:7] Кишинев
[1:7] Урюпинск
[1:7] Владимир

в ячейку R23C4 втсавить такое примечание:
Святослав
[23:4] Ростов на Дону
[23:4] Альметьевск
[23:4] Сызрань

в ячейку R19C100 втсавить такое примечание:
Егорьев Николай Ефимович
[19:100] Иркутстк
[19:100] Ижевск
[19:100] Ставрополь
Маргарита
[19:100] Москва
Оленька
[19:100] Санкт-Петербург

Было бы совсем здорово, если бы еще имена форматировались жирным (в примечании).

то есть ячейка выбирается в соответствии с координатой вида [X:Y].

Буду очень признательна за любую помощь. Сама с макросами дела не имела к сожалению.
Автор: oshizelly
Дата сообщения: 02.07.2010 10:32
Drazhar 12:12 01-07-2010

Цитата:

Цитата: И то же самое с датами, там опять-таки 12 интервалов (по числу месяцев), и надо, чтобы форматирование дат одного месяца отличалось от дат остальных месяцев.

С датами, просто натравливайте case на функцию Month от значения(от 1 до 12)
Автор: Drazhar
Дата сообщения: 02.07.2010 12:18
oshizelly
1)select case month(c)
case 1:'январь
case 2:'февраль
end select

2)Select Case instr(c,"яблоки")
case 0: ничего не делаем
case else:действие по яблокам
end select
Функция Instr возвращает позицию вхождения одной строки в другу, то есть да, сработает для любой строки в которой будет "яблоки"(но например для "яблоко" не сработает)
Автор: oshizelly
Дата сообщения: 02.07.2010 12:53
Drazhar

Цитата:
select case month(c)
case 1:'январь
case 2:'февраль
end select

Извиняюсь, не понял А где в этом примере задаётся действие, например, чтобы в столбце с датами все ячейки со значениями в интервале от 01/01/2010 до 31/01/2010 окрасились в красный цвет?

Кстати, функция month, как я понял, применима только к целым месяцам. А что надо использовать, чтобы задать произвольный интервал, скажем, от 27/01/2010 до 13/02/2010?
Автор: Drazhar
Дата сообщения: 02.07.2010 13:11
oshizelly
гм. Изначально говорилось о 12 интервалах, сейчас их стало больше.
тогда
Причем C - строго дата
Select Case C
Case CDate("27.01.2009") To CDate("27.01.2011"): 'действие1
Case Else: 'Действие2
End Select
А вообще рекомендую вам почитать Ссылка
Автор: oshizelly
Дата сообщения: 02.07.2010 15:11
Drazhar
Спасибо! Особенно за ссылку.
Кстати, еще маленький вопрос: а как лучше корректно встраивать все эти коды? Я нашел один способ методом тыка, но что-то он слишком сложный, наверняка, по уму это должно делаться другим способом.
И ещё, если встроить эти коды в документ Personal.XLS, то они будут автоматически работать для всех открываемых документов, включая и ранее созданные тоже?
Автор: Drazhar
Дата сообщения: 02.07.2010 15:22
oshizelly
Жмете Alt+F11(или сервис - Макрос- Редактор VBA)
Там заходите либо в лист либо вставляете модуль и в нем уже пишете приложение(sub/function)
Автор: Tambourine
Дата сообщения: 02.07.2010 17:44

Цитата:
Помогите с простеньким макросом под excel

Необходим макрос для вставки примечаний.

То есть, в excel-книге 2 листа - в одном подготовленные примечания (в виде обычного текста), а в другой лист эти примечания нужно вставить.
Формат исходных данных (примечаний) примерно такой:

Петр Сергеевич
[1:7] Москва
[1:7] Брянс
[1:7] Санкт-Петербург
Катерина Анатольнва
[1:7] Кишинев
[1:7] Урюпинск
[1:7] Владимир

Святослав
[23:4] Ростов на Дону
[23:4] Альметьевск
[23:4] Сызрань

Егорьев Николай Ефимович
[19:100] Иркутстк
[19:100] Ижевск
[19:100] Ставрополь
Маргарита
[19:100] Москва
Оленька
[19:100] Санкт-Петербург

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

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

в ячейку R1C7 втсавить такое примечание:
Петр Сергеевич
[1:7] Москва
[1:7] Брянс
[1:7] Санкт-Петербург
Катерина Анатольнва
[1:7] Кишинев
[1:7] Урюпинск
[1:7] Владимир

в ячейку R23C4 втсавить такое примечание:
Святослав
[23:4] Ростов на Дону
[23:4] Альметьевск
[23:4] Сызрань

в ячейку R19C100 втсавить такое примечание:
Егорьев Николай Ефимович
[19:100] Иркутстк
[19:100] Ижевск
[19:100] Ставрополь
Маргарита
[19:100] Москва
Оленька
[19:100] Санкт-Петербург

Было бы совсем здорово, если бы еще имена форматировались жирным (в примечании).

то есть ячейка выбирается в соответствии с координатой вида [X:Y].

Буду очень признательна за любую помощь. Сама с макросами дела не имела к сожалению.

Или хоть подскажите куда обратиться можно за помощью?
Автор: vlth
Дата сообщения: 02.07.2010 21:26
oshizelly
Цитата:
Это-то я понял, что цифры условные. Только вот не понял, буква "c" в данном условном примере - это необходимая часть формулы или просто условное обозначение?

В этом коде 'с' - объектная переменная типа 'диапазон' - ссылка на ячейку.
Иначе можно было бы записать c.Value + 2 (свойство диапазона Value - свойство по умолчанию, поэтому 'Value' допустимо опускать)
Двойка здесь добавлена для смещения цветовых индексов на 2 относ. содержимого ячеек, чтобы попасть в более "приличный" цветовой диапазон, исключающий белый цвет (ColorIndex = 2)
Автор: Hugo121
Дата сообщения: 02.07.2010 22:09
Tambourine
Я тут ради интереса ещё закрытую стал решать, в надежде, что может пригодится...
Код работает, но есть недоделки:
Во-первых, код можно чуть упростить, но думать устал...
Во-вторых, жирным не выделяет, по той же причине.
В-третьих, повторно не работает, пока уже сделанные комменты не удалите.
Может завтра продолжу, ну или другие варианты напишут...
[more=Здесь код]

Код: Option Explicit

Sub tt()
Dim flag As Boolean
Dim i As Long, x As Long, y As Long, z As Long
Dim sep_ As Long, start_ As Long, end_ As Long
Dim str_ As String

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row + 1
If flag = False Then
If Cells(i, 1).Value <> "" Then flag = True: x = i
ElseIf flag Then
If IsNumeric(Mid(Cells(i, 1).Value, 2, 1)) Then 'вот это можно делать один раз по группе, но лениво искать решение
sep_ = InStr(Cells(i, 1).Value, ":")
start_ = InStr(Cells(i, 1).Value, "[") + 1
end_ = InStr(Cells(i, 1).Value, "]") - 1
End If
If Cells(i, 1).Value = "" Then
flag = False: y = i - 1 ': Debug.Print "x= " & x & " y= " & y & " start= " & start_ & " end= " & end_ & " sep= " & sep_
With Sheets(2).Cells(Int(Mid(Cells(i - 1, 1).Value, start_, sep_ - start_)), Int(Mid(Cells(i - 1, 1).Value, sep_ + 1, end_ - sep_)))
For z = x To y
str_ = str_ & Cells(z, 1).Value & Chr(10)
Next
str_ = Left(str_, Len(str_) - 1)
.AddComment
.Comment.Visible = False
.Comment.Text Text:=str_
.Comment.Shape.TextFrame.AutoSize = True
str_ = ""
End With
End If
End If
Next
End Sub
Автор: Tambourine
Дата сообщения: 02.07.2010 22:33
Hugo121
Спасибо что откликнулись, не знаю даже как Вас благодарить!!
Буду очень признательна, если объясните в двух словах как им пользоваться. В excel вообще у меня опыт большой, но с макросами еще не приходилось сталкиваться.
Автор: vlth
Дата сообщения: 02.07.2010 22:44
Hugo121

Цитата:
Во-вторых, жирным не выделяет, по той же причине.


Tambourine

Код: .Comment.Shape.TextFrame.Characters.Font.Bold = True

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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