Вкладка «Рабочая книга» Цикл подсчета цветов

Мне нужна помощь с циклом для подсчета всех цветных вкладок в книге. У меня есть 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

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

Nathan_Sav 25.07.2024 16:30

Если бы количество цветов было неизвестно, это был бы хороший вариант использования Scripting.Dictionary. В противном случае просто используйте 4 переменные.

BigBen 25.07.2024 16:40

@BigBen Я все еще думаю, что это будет хороший вариант использования. Я полагаю, что в конечном итоге будет подсчитан каждый из цветов и сообщен об общем количестве для каждого, а не привязываться к конкретному цвету, а вместо этого посмотреть, какие цвета используются, подсчитать каждый и показать. Однако это может быть личным недостатком, поскольку я не особо знаком со скриптовым словарем.

Mark S. 25.07.2024 16:53
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
3
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно использовать переменную, для которой установлено значение 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 'просто нужно вставить конец.

Skye Olsavsky 25.07.2024 18:31

@SkyeOlsavsky Я не уверен, о чем вы здесь спрашиваете, поскольку форматирование немного потерялось. Вы пытаетесь понять, как сделать это для нескольких цветов одновременно?

Mark S. 25.07.2024 19:05

@SkyeOlsavsky, понимая, что это то, что вы хотели, я изменил код, чтобы показать два способа его масштабирования. Я бы порекомендовал подход ElseIf, если у вас ограниченное фиксированное количество цветов, которыми могут быть вкладки.

Mark S. 25.07.2024 19:13

Правильно, у меня есть цвета зеленый, желтый, оранжевый, красный и синий. Итак, 5 цветов, прошу прощения за эту дезинформацию. Я хотел бы, чтобы код подсчитывал каждый цвет и сохранял эти данные, а затем вставлял их в первую вкладку «REF» в 4 разных ячейках. Таким образом, сгруппированная логика не будет тем, что мне нужно. Мне пришлось бы разделить это с помощью блоков (показано выше). Спасибо, чем больше я спрашиваю, тем больше я учусь. Я попробую отдельные блоки и посмотрю.

Skye Olsavsky 25.07.2024 20:02

@SkyeOlsavsky Попробуйте метод ElseIf, измените коды и добавьте больше переменных по мере необходимости, но это должно показать вам общую настройку, просто нужно больше ElseIf. Затем в исх. просто назначьте несколько ячеек со значением и меткой рядом с ним, чтобы вы знали, что есть что. Метод elseif должен быть немного быстрее, поскольку он проходит через вкладки один раз, тогда как каждый раз через него будут проходить отдельные блоки.

Mark S. 25.07.2024 20:09

Просто возникли проблемы с вызовом того, какой «Объект» нужно вставить подсчитанные значения. @Марк С. вы упомянули о назначении ячеек что-то на моей ссылочной странице? Буду ли я иметь ячейки, равные переменной? Я, наверное, слишком много об этом думаю.

Skye Olsavsky 25.07.2024 21:33

Да, именно так, это будет выглядеть примерно так: Thisworkbook.Sheets("Sheet1").Cells(1,1).value = x, затем следующее: Thisworkbook.Sheets("Sheet1").Cells(2,1).value = y Предположим, вам нужны числа в первом столбце. Аналогично, вы можете добавить туда идентификатор цвета и поместить значения в столбец, изменив второе значение на 2, чтобы он отображал код цвета, а затем счетчик рядом с ним.

Mark S. 25.07.2024 21:36

Марк, большое спасибо за помощь/обучение меня этому вопросу. Я назначу пасту для каждой переменной.

Skye Olsavsky 25.07.2024 21:42

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

Mark S. 25.07.2024 21:44

Я запускаю макрос, похоже, он работает только для цветов: желтого и красного. Я дважды проверил коды RGB, чтобы убедиться, что цвета совпадают. EX RGB(0,255,0). Зеленый (первый цвет (переменная X) не будет заполняться, а первые 20 вкладок будут зелеными.

Skye Olsavsky 25.07.2024 23:24

Поэтому используйте устройство записи макросов, чтобы получить код зеленого цвета.

Mark S. 26.07.2024 15:10
Ответ принят как подходящий

Количество цветов вкладки списка

  • Лучше всего проверить копию своей рабочей тетради, прежде чем знакомиться с ней. Он будет записывать на первый (самый левый) лист. Лучше используйте имя (например, "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

Это более динамичное решение, но для начинающего пользователя оно может оказаться загадочным. Примечание перед каждым подразделом, объясняющее, чего он добивается, вероятно, будет иметь большое значение, если его потребуется скорректировать или переназначить. Хотя это потрясающе.

Mark S. 25.07.2024 17:44

Если вы запустите этот код на листе, который содержит что-то, удалите содержимое листа без какого-либо предупреждения. Я думаю, что это не удобное решение.

Black cat 25.07.2024 18:07

Цвет листа 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. Хорошо знать

Balázs 25.07.2024 17:42

Другие вопросы по теме