Мне нужна помощь с циклом для подсчета всех цветных вкладок в книге. У меня есть 4 разных цвета, я хотел бы суммировать данные на первой вкладке книги, показывая, сколько зеленых, желтых... и т. д.
Public Sub
For Each mysheet in ActiveWorkbook.sheets
If mysheet.tab.color = RGB(255,0,0) then
mysheet.tab.count
End If
Next mysheet
End Sub
Этот код представляет собой эксперимент с использованием кода другого макроса. Это неработающий код. Я думал о цикле do while со счетчиком?
НОВЫЙ КОД:
Public Sub TabCount()
Dim x As Long, y As Long, z As Long, i As Long, O As Long
x = 0
y = 0
z = 0
i = 0
O = 0
For Each mysheet In ActiveWorkbook.Sheets
If mysheet.Tab.Color = RGB(0, 255, 0) Then
x = x + 1
ElseIf mysheet.Tab.Color = RGB(255, 255, 0) Then
y = y + 1
ElseIf mysheet.Tab.Color = RGB(255, 165, 0) Then
z = z + 1
ElseIf mysheet.Tab.Color = RGB(255, 0, 0) Then
i = i + 1
ElseIf mysheet.Tab.Color = RGB(0, 0, 255) Then
O = O + 1
End If
Next mysheet
«Нужна помощь с вставкой данных.
End Sub
Если бы количество цветов было неизвестно, это был бы хороший вариант использования Scripting.Dictionary
. В противном случае просто используйте 4 переменные.
@BigBen Я все еще думаю, что это будет хороший вариант использования. Я полагаю, что в конечном итоге будет подсчитан каждый из цветов и сообщен об общем количестве для каждого, а не привязываться к конкретному цвету, а вместо этого посмотреть, какие цвета используются, подсчитать каждый и показать. Однако это может быть личным недостатком, поскольку я не особо знаком со скриптовым словарем.
Вам нужно использовать переменную, для которой установлено значение 0 вне вашего цикла. Тогда вместо того, чтобы просто считать табуляцию (которая всегда будет равна 1 или 0, как вы это написали), вам нужно добавить 1 к переменной. Затем, проходя по всем вашим листам, переменная будет изменена на количество листов, которые вызывают TRUE для вашего условия IF.
Итак, чтобы уточнить: сначала вы говорите x = 0, затем начинаете перебирать свои листы, и каждый раз, когда он видит вкладку с этим цветом, он переопределяет x как x + 1, в противном случае оно останется предыдущим значением. Затем, после прохождения, он эффективно подсчитает все цветные вкладки и выдаст вам счетчик в ближайшем окне окна VBA. Вы можете изменить его на поле сообщения или значение ячейки.
Dim x as Long
x = 0
For Each mysheet in ActiveWorkbook.sheets
If mysheet.tab.color = RGB(255,0,0) then
x = x + 1
End If
Next mysheet
Debug.Print x
End Sub
Если вам нужно сделать это для более чем одного цвета, вы можете добавить новый блок, используя новую переменную или даже ту же переменную, если вы сбросите значение обратно на 0 и напечатаете где-нибудь предыдущий счетчик (в противном случае вы бы не сделали этого). знать счет).
Dim x as Long, y as long, z as long
x = 0
For Each mysheet in ActiveWorkbook.sheets
If mysheet.tab.color = RGB(255,0,0) then
x = x + 1
End If
Next mysheet
y = 0
For Each mysheet in ActiveWorkbook.sheets
If mysheet.tab.color = RGB(255,255,0) then
y = y + 1
End If
Next mysheet
Debug.Print x
End Sub
В качестве альтернативы вы можете создать условие ELSEIF для обработки его с помощью единой логики. Это то, что я бы рекомендовал, если вы знаете, какими будут ваши цвета, и они не будут меняться, в противном случае вам может потребоваться отредактировать это в этом случае. возможно, стоит создать переменную для разных цветов в одном месте, чтобы вы могли легко ее поддерживать или использовать где-то ссылку для дальнейшей автоматизации:
Dim x as Long, y as long, z as long
x = 0
y = 0
z = 0
For Each mysheet in ActiveWorkbook.sheets
If mysheet.tab.color = RGB(255,0,0) then
x = x + 1
ElseIf mysheet.tab.color = RGB(255,255,0) then
y = y + 1
ElseIf mysheet.tab.color = RGB(0,255,0) then
z = z + 1
End If
Next mysheet
'Print x, y, & z somewhere for results
End Sub
Public Sub TabCount() Dim x As Long Dim i As Long Dim O As Long Dim P As Long x = 0 i = 0 O = 0 P = 0 Для каждого листа в ActiveWorkbook.Sheets Если mysheet.Tab.Color = RGB(255) , 0, 0) Тогда x = x + 1 End If If mysheet.Tab.Color = RGB(0, 255, 0) Тогда i = i + 1 End If If mysheet.Tab.Color = RGB(255, 255, 0) ) Тогда O = O + 1 End If Next mysheet Debug.Print x 'Это будет вставлено в ячейки здесь? Debug.Print i Debug.Print O Debug.Print P End Sub 'просто нужно вставить конец.
@SkyeOlsavsky Я не уверен, о чем вы здесь спрашиваете, поскольку форматирование немного потерялось. Вы пытаетесь понять, как сделать это для нескольких цветов одновременно?
@SkyeOlsavsky, понимая, что это то, что вы хотели, я изменил код, чтобы показать два способа его масштабирования. Я бы порекомендовал подход ElseIf, если у вас ограниченное фиксированное количество цветов, которыми могут быть вкладки.
Правильно, у меня есть цвета зеленый, желтый, оранжевый, красный и синий. Итак, 5 цветов, прошу прощения за эту дезинформацию. Я хотел бы, чтобы код подсчитывал каждый цвет и сохранял эти данные, а затем вставлял их в первую вкладку «REF» в 4 разных ячейках. Таким образом, сгруппированная логика не будет тем, что мне нужно. Мне пришлось бы разделить это с помощью блоков (показано выше). Спасибо, чем больше я спрашиваю, тем больше я учусь. Я попробую отдельные блоки и посмотрю.
@SkyeOlsavsky Попробуйте метод ElseIf, измените коды и добавьте больше переменных по мере необходимости, но это должно показать вам общую настройку, просто нужно больше ElseIf. Затем в исх. просто назначьте несколько ячеек со значением и меткой рядом с ним, чтобы вы знали, что есть что. Метод elseif должен быть немного быстрее, поскольку он проходит через вкладки один раз, тогда как каждый раз через него будут проходить отдельные блоки.
Просто возникли проблемы с вызовом того, какой «Объект» нужно вставить подсчитанные значения. @Марк С. вы упомянули о назначении ячеек что-то на моей ссылочной странице? Буду ли я иметь ячейки, равные переменной? Я, наверное, слишком много об этом думаю.
Да, именно так, это будет выглядеть примерно так: Thisworkbook.Sheets("Sheet1").Cells(1,1).value = x
, затем следующее: Thisworkbook.Sheets("Sheet1").Cells(2,1).value = y
Предположим, вам нужны числа в первом столбце. Аналогично, вы можете добавить туда идентификатор цвета и поместить значения в столбец, изменив второе значение на 2, чтобы он отображал код цвета, а затем счетчик рядом с ним.
Марк, большое спасибо за помощь/обучение меня этому вопросу. Я назначу пасту для каждой переменной.
Однако выбранный вами ответ должен учитывать все это, это просто способ изменить то, что у меня есть.
Я запускаю макрос, похоже, он работает только для цветов: желтого и красного. Я дважды проверил коды RGB, чтобы убедиться, что цвета совпадают. EX RGB(0,255,0). Зеленый (первый цвет (переменная X) не будет заполняться, а первые 20 вкладок будут зелеными.
Поэтому используйте устройство записи макросов, чтобы получить код зеленого цвета.
"Sheet1"
) вместо индекса (1
) при ссылке на него (dws
).Sub ListTabColors()
Dim Headers() As Variant:
Headers = VBA.Array("ID", "ColorNum", "Color", "Count")
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim dws As Worksheet: Set dws = wb.Worksheets(1) ' improve!
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim ssh As Object, Color As Long
For Each ssh In wb.Sheets
Color = ssh.Tab.Color
dict(Color) = dict(Color) + 1
Next ssh
Dim drCount As Long: drCount = dict.Count + 1
Dim dcCount As Long: dcCount = UBound(Headers) + 1
Dim drg As Range: Set drg = dws.Range("A2").Resize(drCount, dcCount)
Dim Data() As Variant: ReDim Data(1 To drCount, 1 To dcCount)
Dim r As Long: r = 1
dws.UsedRange.Clear
Dim Key As Variant, c As Long
For c = 1 To dcCount
Data(1, c) = Headers(c - 1)
Next c
For Each Key In dict.Keys
r = r + 1
Data(r, 1) = r - 1
Data(r, 2) = Key
drg.Cells(r, 3).Interior.Color = Key
Data(r, 4) = dict(Key)
Next Key
With drg
.Value = Data
.Rows(1).Font.Bold = True
.EntireColumn.AutoFit
End With
With dws.Range("A1")
.Value = "Tab Colors"
With .Font
.Bold = True
.Size = 14
End With
End With
MsgBox "Tab colors count listed.", vbInformation
End Sub
Это более динамичное решение, но для начинающего пользователя оно может оказаться загадочным. Примечание перед каждым подразделом, объясняющее, чего он добивается, вероятно, будет иметь большое значение, если его потребуется скорректировать или переназначить. Хотя это потрясающе.
Если вы запустите этот код на листе, который содержит что-то, удалите содержимое листа без какого-либо предупреждения. Я думаю, что это не удобное решение.
Цвет листа Tab
может иметь числовое значение, ссылающееся на фактический цвет вкладки, или логическое значение, которое указывает, что индекс цвета установлен на xlColorIndexNone
.
Sub tab_color()
For each ws in Worksheets
if TypeName(ws.Tab.Color) = "Boolean" then
nocolor=nocolor+1
end if
next ws
Msgbox "Count of no colored tabs: " & nocolor
End Sub
Это странность Excel. Хорошо знать
вам понадобится переменная для каждого счетчика и используйте elseif для изменения цвета.