Страницы: 1
RSS
"пишем" цветами
 
Добрый день.  
Столкнулся с одной ситуацией... сейчас попроще постараюсь объяснить.  
Скажем есть три лат. буквы a,b,c.  
Эти буквы находятся в одной строке - например в самой первой.  
то есть координаты у a,b,c  - A1,A2,A3 соответственно.  
Ячейки A1,A2,A3 закрашены в А1 - в красный, А2 - в зеленый, А3 - в синий.  
Теперь в ячейке B2 находится произвольный текст - например "abccbac".  
Мне нужно чтобы на втором листе книги ячейки в первой строке закрашивались согласно этму тексту. Цвет ячейки на втором листе берется в зависимости от буквы. То есть для буквы а - это будет красный, для b - синий и для c - зеленый.  
То есть получается, что на втором листе в первой строке ячейки закрасятся следующим образом:  
красный - зеленый - синий - синий - зеленый - красный - синий  
подскажите пожалуйста как такое реализовать?
 
А при чем тут А1, В1, С1, если нужно анализировать ячейку В2?
 
Код для модуля первого листа. При изменении яч. "B2" окрашивает первую строку второго листа.  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim i As Long, SColor As Byte  
 If Target.Address = "$B$2" Then  
 Sheets(2).Rows("1:1").Interior.ColorIndex = xlNone  
   For i = 1 To Len(Target)  
     Select Case Mid(Target, i, 1)  
       Case "a": SColor = 3  
       Case "b": SColor = 10  
       Case "c": SColor = 5  
       Case Else: SColor = -4142  
     End Select  
     Sheets(2).Cells(1, i).Interior.ColorIndex = SColor  
Next: End If: End Sub
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=09.08.2008 19:06}{thema=Re: "пишем" цветами}{post}Dim i As Long, SColor As Byte{/post}{/quote}  
 
Поправка: SColor As Double
 
{quote}{login=:=]}{date=09.08.2008 04:33}{thema=}{post}А при чем тут А1, В1, С1, если нужно анализировать ячейку В2?{/post}{/quote}  
 
из этих ячеек берется какой цвет у буквы (буква - а ее цвет - бэкграунд)
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=09.08.2008 07:33}{thema=Re: "пишем" цветами}{post}{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=09.08.2008 19:06}{thema=Re: "пишем" цветами}{post}Dim i As Long, SColor As Byte{/post}{/quote}  
 
Поправка: SColor As Double{/post}{/quote}  
 
я забыл сказать что у меня русская версия MS Office 2003.  
Надеюсь этот код там сработает
 
{quote}{login=CEPBAHTEC}{date=10.08.2008 12:24}{thema=Re: Re: "пишем" цветами}{post}Я забыл сказать что у меня русская версия MS Office 2003.  
Надеюсь этот код там сработает{/post}{/quote}  
 
Этот код изначально был написан в 2004-м году для современной на тот день японоязычной версии Excel, после чего транслитерован в единый (вавилонский) язык с запасом на века, чтобы пользователь мог писать любым способом, хоть цветами :)
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=10.08.2008 12:38}{thema=Re: "пишем" цветами}{post}{quote}{login=CEPBAHTEC}{date=10.08.2008 12:24}{thema=Re: Re: "пишем" цветами}{post}Я забыл сказать что у меня русская версия MS Office 2003.  
Надеюсь этот код там сработает{/post}{/quote}  
 
чтобы пользователь мог писать любым способом, хоть цветами :){/post}{/quote}  
 
понятно. :) а ты не мог бы файл приложить с работающим вариантом?  
а то я в B2 и xyz вписывал и abc - на втором листе ничего не изменяется
 
{quote}{login=CEPBAHTEC}{date=10.08.2008 05:05}{thema=Re: Re: "пишем" цветами}А ты не мог бы файл приложить с работающим вариантом?{/post}{/quote}  
 
Щёлкаем ПКМ по ярлычку первого листа -> Исходный текст; помещаем туда код (не забыв внести поправку) и аппля!
 
видишь я может не так как то думаю..  
в общем я файл приложил.  
суть в том что в B2 текст - xyzzyx  
так вот алгоритм такой - берем этот текст из B2 и посимвольно его парсим.  
То есть первый символ у нас x. Ищем этот символ в range01 - и когда находим, то смотрим какого цвета бэкграунд в ячейке, где находится этот символ.  
Бэкграунд у x у нас красный, значит на втором листе A1 закрашиваем в красный
 
{quote}{login=CEPBAHTEC}{date=10.08.2008 05:13}{thema=Re: Re: Re: "пишем" цветами}{post}видишь я может не так как то думаю..{/post}{/quote}  
 
Действительно, я брал предопределённые цвета; к тому же в твоём примере ключи для цвета в яч. A1, B1 и C1, а не A1, A2, A3. Чтобы подхватить цвета, поменяем три строчки:    
 
Case [A1]: SColor = [A1].Interior.ColorIndex
Case [B1]: SColor = [B1].Interior.ColorIndex
Case [C1]: SColor = [C1].Interior.ColorIndex
 
PS: Ещё раз (третий) напомню, что код должен быть в модуле листа.  
PPS: Если ячейки первого листа проименовать, то можно воспользоваться условным форматированием, вместо кода.
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=10.08.2008 05:34}{thema=Re: "пишем" цветом}{post}{quote}{login=CEPBAHTEC}{date=10.08.2008 05:13}{thema=Re: Re: Re: "пишем" цветами}{post}видишь я может не так как то думаю..{/post}{/quote}  
 
PS: Ещё раз (третий) напомню, что код должен быть в модуле листа.  
PPS: Если ячейки первого листа проименовать, то можно воспользоваться условным форматированием, вместо кода.{/post}{/quote}  
 
спасибо!  
я вообще то и в первый раз понял где код писать :)  
обычно я через Alt F11 туда заходил, буду теперь и так как посоветовали.  
сейчас как нужно работает, просто режим безопасности был высокий... вот собака :)
 
{quote}{login=CEPBAHTEC}{date=10.08.2008 06:40}{thema=Re: Re: "пишем" цветом}{post}Спасибо! Я, вообще-то, и в первый раз понял где код писать :){/post}{/quote}  
 
Пожалуйста! Кстати, вначале Вы поместили код в обычный модуль (Insert -> Module). Не знаю как гласит теория, но я классифицирую размещение кода в след. местах:  
- в модуле приложения;  
- в модуле книги;  
- в модуле листа;  
- в имени диапазона (для VB4);  
- на листе (для Excel'97).
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=10.08.2008 06:52}{thema=Re: "пишем" цветом}{post}{quote}{login=CEPBAHTEC}{date=10.08.2008 06:40}{thema=Re: Re: "пишем" цветом}{post}Спасибо! Я, вообще-то, и в первый раз понял где код писать :){/post}{/quote}  
 
Пожалуйста! Кстати, вначале Вы поместили код в обычный модуль (Insert -> Module). Не знаю как гласит теория, но я классифицирую размещение кода в след. местах:  
- в модуле приложения;  
- в модуле книги;  
- в модуле листа;  
- в имени диапазона (для VB4);  
- на листе (для Excel'97).{/post}{/quote}  
 
Скажите, пожалуйста, а это как то будет влиять на то сработает код или нет? например, если я размещу его на первом листе и попытаюсь выполнить макрос во втором - значит ли это, что макрос не сработает?  
А насчет теории - у меня есть книги по Excel, но в них как назло именно эта часть - программирование на VBA злостно обходится стороной... или ей уделяется совсем мало места, да и то про то как записать простые макросы. :)  
 
Потому хотел спросить - не подскажете ли Вы где можно найти соответствие цветов и их кодов? Я понял что 3 - красный, 10 - зелёный, 5 - синий. А остальная таблица цветов есть где?
 
{quote}{login=CEPBAHTEC}{date=10.08.2008 07:25}{thema=Re: Re: "пишем" цветом}{post}А это как то будет влиять на то сработает код или нет?{/post}{/quote}  
 
Разумеется будет. Есть код (в модуле приложения), который запускается через Alt+F8 или через Call (или Application.Run) в другом коде и есть код, который запускается на событие (как наш). Обратите внимание на заголовок (то, что между Sub и ()) – он выбран не случайно: происходит рекция на событие изменения значения ячейки листа (Change), в то время как "обычным" модулям на это плевать, если это в них явно не прописано.  
 
PS: Таблицу цветов Вы можете получить экспериментируя с макрорекордером.
 
{quote}{login=** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU* ==============}{date=10.08.2008 08:47}{thema=Re: "пишем" цветом}{post}{quote}{login=CEPBAHTEC}{date=10.08.2008 07:25}{thema=Re: Re: "пишем" цветом}{post}А это как то будет влиять на то сработает код или нет?{/post}{/quote}  
Обратите внимание на заголовок (то, что между Sub и ()) – он выбран не случайно: происходит рекция на событие изменения значения ячейки листа (Change), в то время как "обычным" модулям на это плевать, если это в них явно не прописано.  
{/post}{/quote}  
 
Обратил. Я попытался переделать этот код под свой макрос, чтобы не событийно происходило, а именно по явному вызову.  
В итоге вот что получилось:  
Sub Макрос1()  
Dim i, j, k As Long, SColor As Double  
   j = 1  
   k = 1  
   With Selection  
   If Selection.Address = "$B$2" Then  
       Sheets(2).Range("$A$1:$AA$100").Interior.ColorIndex = xlNone  
       For i = 1 To Len(Selection)  
           Select Case Mid(Selection, i, 1)  
               Case "a": SColor = 3  
               Case "b": SColor = 10  
               Case "c": SColor = 5  
               Case Else: SColor = -4142  
           End Select  
           Sheets(2).Cells(j, k).Interior.ColorIndex = SColor  
           k = k + 1  
           If k > 5 Then  
               j = j + 1  
               k = 1  
           End If:  
       Next:  
   End If:  
   End With  
End Sub  
 
здесь модификация в том, что при достижении столбца Е раскрашивание начинается со следующей строки.  
 
{quote}  
PS: Таблицу цветов Вы можете получить экспериментируя с макрорекордером.{/quote}  
 
Действительно :) Спасибо за совет
 
Пожалуй, прокомментирую получившийся код:  
 
Переменные i и j у Вас объявлены как Variant, надо:  
Dim i as Long, j as Long, k as Long  
 
Конструкция With-End With используется для сокращения записи параметров, например:  
With Selection  
If .Address = "$B$2" Then  
 
Зачем ориентироваться на Selection, тем более проверять не выделена ли яч. [B2], когда мы сами нажимаем на запуск макроса? Т.е. условие можно убрать, а Selection заменить на [B2]
 
В вашем конечном варианте так и используются абсолютные значения цветов, чтобы их брать из ячеек, нужно поменять три Case, например:  
Case Sheets(1).[A1]: SColor = Sheets(1).Interior.ColorIndex
О чём я писал ранее. Вот здесь, как раз, чтобы не писать Sheets(1) пригодится With-End With.  
 
Знак двоеточия – разделитель строк, т.е.:  
Sub Test(): MsgBox 123: End Sub
 
{quote}{login=CEPBAHTEC}{date=09.08.2008 04:21}{thema="пишем" цветами}{post}Добрый день.  
Столкнулся с одной ситуацией... сейчас попроще постараюсь объяснить.  
Скажем есть три лат. буквы a,b,c.  
Эти буквы находятся в одной строке - например в самой первой.  
то есть координаты у a,b,c  - A1,A2,A3 соответственно.  
Ячейки A1,A2,A3 закрашены в А1 - в красный, А2 - в зеленый, А3 - в синий.  
Теперь в ячейке B2 находится произвольный текст - например "abccbac".  
Мне нужно чтобы на втором листе книги ячейки в первой строке закрашивались согласно этму тексту. Цвет ячейки на втором листе берется в зависимости от буквы. То есть для буквы а - это будет красный, для b - синий и для c - зеленый.  
То есть получается, что на втором листе в первой строке ячейки закрасятся следующим образом:  
красный - зеленый - синий - синий - зеленый - красный - синий  
подскажите пожалуйста как такое реализовать?{/post}{/quote}
Страницы: 1
Читают тему
Наверх