Форум программистов, компьютерный форум, киберфорум
MS Office Excel
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/146: Рейтинг темы: голосов - 146, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
1

Поиск ячейки по цвету

18.08.2014, 04:33. Показов 28143. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
такой вопрос, как можно выполнить поиск ячейки по цвету?

имеется лист на котором вразнобой есть желтые, зеленые и красные ячейки.
необходимо переместить все желтые в 9й столбец, зеленые во 11й, красные в 13й.

поиск осуществляется по строкам начиная со 2й.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2014, 04:33
Ответы с готовыми решениями:

Условие по цвету ячейки
Подскажите, можно ли сделать условие к цвету ячейки и какой формулой? Например: получить сумму...

По цвету ячейки записать ее содержимое
Здравствуйте! Такое дело, нужно записать в определенную ячейку (пометил стрелкой на скрине) то...

Объединить ячейки по цвету(параметру)
Ребят,столкнулся с проблемой. Нужно объединить текст ячеек которые одного цвета,в одну.

Присвоить значение по цвету ячейки
Здравствуйте!! Нужно на основании цвета ячейки (если ячейка выделена цветом), то на лист ведомость...

15
3919 / 2316 / 785
Регистрация: 02.11.2012
Сообщений: 6,159
18.08.2014, 09:49 2
файл приложите. вручную напишите что и где должно получиться.
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
18.08.2014, 15:38  [ТС] 3
количество желтых зеленых и красных ячеек в одной строке не всегда одинаково и может различаться.
размер файла может быть гораздо больше данного примера.
Вложения
Тип файла: xlsx исходные данные.xlsx (40.0 Кб, 34 просмотров)
Тип файла: xlsx итоговый результат.xlsx (46.1 Кб, 51 просмотров)
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
20.08.2014, 19:51  [ТС] 4
идей нет?

Добавлено через 7 минут
можно ли вообще искать ячейку по цвету или стоит пойти другим путем?

например количество непустых ячеек в строке, начиная с 7го стоолбца, делить на 3 (узнаем количество ячеек каждого цвета),
в этом случае понадобится ручная правка, но уже в гораздо меньшей степени.
0
6024 / 3216 / 720
Регистрация: 23.11.2010
Сообщений: 10,743
20.08.2014, 20:46 5
По какому принципу происходит раскраска?
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
21.08.2014, 20:29  [ТС] 6
этот файл это результат действия некой программы.
по цветам поделены фазы нагрузки сети.
по скольку ни у кого не возникло идей как определить свет ячейки, общюю дину строки делю на 3 (так как в каждой строке 3 фазы различного цвета) изходя из получаемой цифры добавляю необходимое количество строк и переношу ячейки.

Так как в VB я полный 0 =) (возможно уже не полный, 3 дня его учу )) ), то написание кода идет медленно.
Закончу , выложу на корректировку.
0
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
21.08.2014, 21:14 7
Так если строку надо делить на 3 зачем тогда цвет?
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
22.08.2014, 04:57  [ТС] 8
изначально планировал по цвету определять так как количество ячеек каждого цвета может быть разным (хотя в 90% случаев они одинаковы).
но сам не понял какой командой можно определить цвет ячейки и никто не подсказал (склоняюсь к мысли что цвет ячейки на VB определить невозможно)
поэтому, изходя из того что в большинстве случаев количество ячеек по цвету в одной строке одинаково, а цвета всего 3, то и решил делить на 3.
единственно что в этом случае результат потребует некоторой ручной правки.
Но в документе из 2х тысяч строк доправить вручную 20-30 строк это уже мелочи )

Добавлено через 7 минут
вот собствеено на какой стадии находится код в данный момент

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Sub work()
 
Dim b As Range
 
    Dim столбец As Integer ' номер столбца
    Dim строка As Integer ' номер строки
    столбец = 1
    строка = 9
    
Range("I9").Select ' выбираем 1ю ячейку с данными
 
' Считаем количество непустых ячеек в строке
 
    Dim a As Boolean
    Dim i As Integer
    Dim j As Integer ' переменная для подсчета количества добавляемых строк
    Dim k As Integer ' переменная для подсчета строк
    Dim d As Double
    Dim c As Range
    
    k = 9
    j = 0
    i = 1
    a = True
    Set c = Range(ActiveCell.Address)
    c.Select
    d = c.Value
    c.Value = d
    While (a = True)
        ActiveCell.Offset(0, 1).Select
        If (IsEmpty(ActiveCell.Value) = False) Then
            Set c = Range(ActiveCell.Address)
            i = i + 1
            c.Select
            d = c.Value
            c.Value = d
        Else
            a = False
        End If
    Wend
    
    MsgBox i
' Считаем количество добавляемых строк
 
j = i / 3 - 1
 
' Добавляем нужное количество строк
 
While (j <> 0)
    Rows(k + 1).Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    j = j - 1
Wend
 
' Перемещаем данные
 
j = i / 3 - 2
Dim пс As Integer ' проверка строки
пс = строка
Columns("I:N").Select ' Выделяем рабочие столбцы
Set b = Selection
' координаты для сдвига активной ячейки
Dim x As Integer
Dim y As Integer
y = 0
x = 2
строка = строка + 1
Range("I9").Select
While (j <> 0)
        ActiveCell.Offset(y, x).Select
            Set c = Range(ActiveCell.Address)
            c.Select
            MsgBox "Выбрано значение"
            Selection.Cut
            b(строка, столбец).Select
            ActiveSheet.Paste
            
            If (столбец = 1) Then
            x = x + 1
            Else
            x = x - 1
            End If
            
            
            
            If (пс = строка) Then
                строка = строка + 1
                столбец = столбец - 1
                x = x + 1
            Else
                
                y = y - 1
                пс = пс + 1
                столбец = столбец + 1
            End If
                
            j = j - 1
                        
        Wend
 
MsgBox "Работа выполнена."
 
End Sub
конечно это не идеал , глобальный цикл еще не добавлен, пока что пытаюсь заставить его работать с 1й строкой.
Но при переносе ячеек столкнулся с проблемой выбора нужной ячейки из которой берется число.

Добавлено через 11 минут
есть ли возможность точного выбора ячейки по относительным координатам которые будут задаваться переменными?
или только путем сдвига от текущей?
можно ли как-то задать диапазон типа Range (переменная).Select чтоб выбрать именно ту ячейку на которую укажет эта переменная, а не пытаясь с помощью сдвига на нее выскочить?

заранее благодарен за ответ
0
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
22.08.2014, 09:05 9
Лучший ответ Сообщение было отмечено Феррим как решение

Решение

Можно и по цвету, но зачем?
Вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub tp() 'tp - подстанция (я так думаю) не путать с чем другим
    Dim a(), b()
    Dim i%, ii%, x%, part1%, part2%
    With Sheets("Лист1") 'с листом лист1
        a = .UsedRange.Value 'берём в массив рабочий диапазон (как ctr+shift+end)
    End With
    ReDim b(1 To 10000, 1 To 14) 'перезаписываем массив b() на 10000 строк например
    ii = 1 'счётчик строк массива b()
    For i = 2 To UBound(a) 'проходим по массиву а() - "строки"
        For j = 1 To 7 'идём по "колонкам" первые 7 элементов
            b(ii, j) = a(i, j) 'пишем в массив b()
        Next
        'считаем кол-во ячеек на строку начиная с 9й колонки
        x = 0 'сбрасываем счётчик кол-ва ячеек
        For j = 9 To UBound(a) 'идём по колонкам с 9 и до конца массива
            If a(i, j) = "" Then Exit For 'если дошли до пусто то выходим из цикла
            x = x + 1 'если не пусто увеличиваем счётчик на ед
        Next
        part1 = x / 3 'границы для жёлтого
        part2 = part1 * 2 'граница для красного
        If x <> 0 Then 'если была загрузка то
            For j = 9 To 9 + part1 - 1 Step 2 'идём по строке с 9 по 14 колонку с шагом 2
                'пишем в массив b()
                b(ii, 9) = a(i, j) 'жёлтый
                b(ii, 10) = a(i, j + 1) 'жёлтый + 1
                b(ii, 11) = a(i, j + part1) 'зелёный
                b(ii, 12) = a(i, j + part1 + 1) 'зелёный + 1
                b(ii, 13) = a(i, j + part2) 'красный
                b(ii, 14) = a(i, j + part2 + 1) 'красный + 1
                ii = ii + 1 'увеличиваем счётчик строк массива b()
            Next
        'если загрузки нет 0%
        Else: ii = ii + 1 'увеличиваем счётчик строк массива b()
        End If
    Next
    'выгружаем массив b() на лист 2
    Sheets("Лист2").Cells(2, 1).Resize(UBound(b), 14) = b
End Sub
1
3919 / 2316 / 785
Регистрация: 02.11.2012
Сообщений: 6,159
22.08.2014, 09:09 10
Лучший ответ Сообщение было отмечено Феррим как решение

Решение

Цитата Сообщение от Феррим Посмотреть сообщение
командой можно определить цвет ячейки
Код
Range("A1").Interior.Color
1
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
23.08.2014, 01:56  [ТС] 11
класс! засунуть все в массив там обработать и вывести на другой лист я не додумался ).
так как массив а это рабочий диапазон, то в строке 16 пустая ячейка самой длинной строки выходит за его границу

Добавлено через 2 часа 16 минут
как сделать чтоб он, получая ошибку выхода за границы массива просто выходил из цикла и продолжал работу?
0
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
23.08.2014, 09:15 12
У меня ошибка )
Размерность не ту взял, замените строку или дописать ", 2"
Visual Basic
1
For j = 9 To UBound(a, 2) 'идём по колонкам с 9 и до конца массива
1
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
23.08.2014, 17:49  [ТС] 13
огромное спасибо!
попытаюсь терь сделать чтом массив и цвет ячейки сохранял и при переносе на новый лист восстанавливал
0
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
23.08.2014, 20:28 14
А зачем? ведь в итоге всегда 3 цветных колонки. Сразу их разрисовать и делов то.
0
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
23.08.2014, 22:33  [ТС] 15
иногда бывает что желтых в строке больше чем красных и зеленых (или наоборот), и тогда макрос неправильно разносит эту строку. В ручную это поправить не составит труда (таких строк 1 на тысячу), но без цвета (среди 5ти тысяч строк) найти это место несколько проблематично.
Как я понимаю надо сделать еще 1 массив который заполнить цветом ячеек и при заполнении второго листа из этого массива, сначала, закрашивать ячейку? Прошу просто подсказать а не писать код ) должен же я сам хоть что-то сделать ).
Спасибо.

Добавлено через 5 минут
еще вопрос, что означает знак % после переменной в 3й строке?
0
3919 / 2316 / 785
Регистрация: 02.11.2012
Сообщений: 6,159
24.08.2014, 17:36 16
Цитата Сообщение от Феррим Посмотреть сообщение
что означает знак % после переменной в 3й строке?
Символ определения типа
0
24.08.2014, 17:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2014, 17:36
Помогаю со студенческими работами здесь

Присвоить значение по цвету ячейки
Здравствуйте!! Нужно согласно цвету ячейки определить какая смена у человека,в файле оранжевая-это...

Автоматическое суммирование по цвету ячейки
Здравствуйте. Помогите в решении задачи. Требуется чтобы суммы в ячейках выделенных цветом,...

Как заставить макрос передавать текущий цвет УФ - реальному цвету ячейки
Здравствуйте. Помогите решить техническую задачу. На листе находится диапазон с условным...

Сложить ячейки в столбце отвечающие определенному цвету с учетом определенной иерархии
Друзья помогите пожалуйста в решении следующей задачи: 1. есть повторяющаяся цветовая иерархия;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru