Имеется задача : на 1м листе есть выпадающие списки со своим названием "главы", внутри которых свой перечень информации. на 2м листе этот перечень инфо из всех выпадающих списков прописывается в столбце А, а в столбцах В1,С1,D1 и тд названия этих глав.
Нужно чтобы при написании на листе 2 в столбец А одного из перечня этих инфо- он сравнивал в какой это главе имеется и ставил "х". Проблема в том, что главы эти на разные кол-ва строк и так понимаю, что для каждой главы видимо придётся указывать промежуток полагаю... Возможно были уже такие темы, но не увидел. Заранее спасибо.
Что-то написался я сегодня макросов на работе, поэтому просто от чистого сердца, простыми словами как это можно сделать без макросов 1. Нажмите на маленький квадратик с циферкой "1" в левом верхнем углу, см рисунок 1; 2. В ячейку B2 запишите формулу =A2 и копируем её, см. рисунок 2; 3. На вкладке ГЛАВНАЯ --> Найти и выделить --> Выделить группу ячеек... --> Только видимые --> ОК, см. рисунок 3; 4. Enter, у Вас должны вставиться формулы в эти ячейки; 5. Нажмите на маленький квадратик с циферкой "2" в левом верхнем углу 6. Выделяем данные таблицы, повторяем действия п.3, только вместо "Только видимые" выбираем "Пустые ячейки" 7. Жмём на "=" и потом стрелочку вверх, в верхней ячейке (В3) должна появиться формула =В2, после чего зажимаем CTRL + ENTER 8. На листе СВОД в ячейке B2 пишем формулу и протягиваем вправо и вниз
Private Sub Worksheet_Activate()
Range("A1").Value = Range("A1").Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column = 1 Then
Static dic As Object
Dim yy As Long
If Target.Address(0, 0) = "A1" Or dic Is Nothing Then
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
With Sheets("Список")
yy = .Cells(.Rows.Count, 1).End(xlUp).Row
If yy > 1 Then
Dim arr As Variant
arr = .Cells(1, 1).Resize(yy)
Dim vv As Variant
For yy = 1 To UBound(arr, 1)
If .Rows(yy).OutlineLevel = 1 Then vv = arr(yy, 1)
dic.Item(arr(yy, 1)) = vv
Next
End If
End With
End If
If dic.Exists(Target.Value) Then
yy = 0
On Error Resume Next
yy = WorksheetFunction.Match(dic.Item(Target.Value), Rows(1), 0)
On Error GoTo 0
If yy > 1 Then
Application.EnableEvents = False
Cells(Target.Row, yy).Value = "х"
Application.EnableEvents = True
End If
End If
End If
End Sub
Некритичные замечания. Вы неправильно используете термин "выпадающие списки". И в примере bbb на листе Свод относится к 1, а на листе Список находится под 3.
МатросНаЗебре, Спасибо! Единственное- можно попросить объяснить логику действий макроса? он останавливается на моменте "If Target.Cells.Count > 1 Then Exit Sub" при его активации, не разберусь почему...
В таком варианте будет работать и для более чем одной ячейки.
Код
Private Sub Worksheet_Activate()
Range("A1").Value = Range("A1").Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rr As Range
On Error Resume Next
Set rr = Intersect(Target, ActiveSheet.UsedRange, Columns(1))
On Error GoTo 0
If Not rr Is Nothing Then
Dim rTarget As Range
Static dic As Object
Dim yy As Long
Dim arr As Variant
Dim vv As Variant
For Each rTarget In rr
If rTarget.Address(0, 0) = "A1" Or dic Is Nothing Then
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
With Sheets("Список")
yy = .Cells(.Rows.Count, 1).End(xlUp).Row
If yy > 1 Then
arr = .Cells(1, 1).Resize(yy)
For yy = 1 To UBound(arr, 1)
If .Rows(yy).OutlineLevel = 1 Then vv = arr(yy, 1)
dic.Item(arr(yy, 1)) = vv
Next
End If
End With
End If
If dic.Exists(rTarget.Value) Then
yy = 0
On Error Resume Next
yy = WorksheetFunction.Match(dic.Item(rTarget.Value), Rows(1), 0)
On Error GoTo 0
If yy > 1 Then
Application.EnableEvents = False
Cells(rTarget.Row, yy).Value = "х"
Application.EnableEvents = True
End If
End If
Next
End If
End Sub
МатросНаЗебре, Спасибо. Но без понимания алгоритма действий он у меня криво работает, заменяя на 2м листе данные в столбце А и не проставляет иксы при схожести в столбцах В,С и тд. Буду искать разбор действий.
МатросНаЗебре, можно попросить Вас объяснить принцип его действий? я видимо рукожоп и у меня первая часть только работает макроса, а остальная для простановки "х" не работает... он же сверяет данные с 2х листов для простановки "х" в столбцах В,С и т.д.?
Работает так. Вводите значение в первый столбец в строку больше 1. Макрос ищет вводимое значение на листе Список. Вверх от найденного значения ищет итоговою строку по группе. Запоминаем это значение. Ищем это значение в первой строке на листе Свод. В столбец, в котором нашли это значение, ставим x.