Где я вижу повторение - это структура цикла. Я бы использовал такой код с однострочными условными выражениями, если не важно, какое условие увеличивает переменную счетчика. Вы можете добавить столько условий, сколько хотите, и код остается относительно плоским. Между прочим, хорошо использовать «явную опцию». В первой строке Workbook есть опечатка "Workbok"
Option Explicit
Sub test()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long, count As Long
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then count = count + 1
If Application.CountA(workbook1.Worksheets("Sheet" & i).Range("$C$3:$E$5")) > 0 Then count = count + 1
Next i
End Sub
РЕДАКТИРОВАТЬ:
Вместо того, чтобы использовать разные переменные подсчета, как вы прокомментировали, я бы предпочел иметь все условия счетчики в одном месте. Это можно сделать с помощью массива или словаря.
Использование массива:
Option Explicit
Sub UseOfArray()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long
Dim conditions_in_array(1 To 20) As Long
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_array(1) = conditions_in_array(1) + 1
If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_array(2) = conditions_in_array(2) + 1
Next i
Debug.Print "conditions_in_array(1): "; conditions_in_array(1); vbNewLine; "conditions_in_array(2): "; conditions_in_array(2)
End Sub
Использование словаря (я бы предпочел этот подход, так как с большим количеством условий его легче отлаживать):
Sub UseOfDictionary()
Dim i As Long
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim conditions_in_dict As Scripting.Dictionary
Set conditions_in_dict = New Scripting.Dictionary
conditions_in_dict("cell_IsEmpty") = 0
conditions_in_dict("cell_uncolored") = 0
'here you can enter more keys as conditions as above
For i = 1 To Worksheets.count
If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_dict("cell_IsEmpty") = conditions_in_dict("cell_IsEmpty") + 1
If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_dict("cell_uncolored") = conditions_in_dict("cell_uncolored") + 1
Next i
Debug.Print "conditions_in_dict(""cell_IsEmpty""): "; conditions_in_dict("cell_IsEmpty"); vbNewLine; _
"conditions_in_dict(""cell_uncolored""): "; conditions_in_dict("cell_uncolored")
End Sub
Вы могли просто использовать ручной список объектов (Скажите как простые ссылки), которые имеют JavaScript onclick поведение, которое отменяет выбор/выбирает вручную. В основном путем изменения класса CSS между двумя значениями и проверки их CSS (Или некоторый другой атрибут) во время представления для определения выборов.
Это позволило бы пользователю просто выбирать объект путем нажатия, и отмену выбора путем нажатия, а не стандартное требование Ctrl+Click.
Я предлагаю использовать два поля списков, один с доступными, и один с выбранными. Нажатие или двойной щелчок по объекту в одном из списков должны переместить объект в другой список. Для удобства я также включал бы две кнопки "Move", чтобы сделать то же. Этот подход работает удивительно хорошо со средними пользователями в веб-приложениях, а также настольных приложениях.
Поскольку нечастые пользователи, имеющие три холма отбрасывания, могли бы работать лучшее>:
<select><option>Capa Verde</option></select>
<select><option>Holiday</option></select>
<select><option>Competition</option></select>
С другой стороны, у Вас мог бы быть диапазон кнопок, которые придерживаются когда-то нажатый. Однако будет трудным затем передать ограничение до трех опций.
Если необходимо отметить каждую фотографию индивидуально и существует ограниченное количество категорий, которые Вы могли отобразить, список категорий (может быть в нескольких столбцах) прямо сверху фотографии (очевидно, необходимо было бы удостовериться объекты читаемое и указать, что они предоставляют нажатие), и позвольте пользователям выбрать и отменить выбор тегов одиночным нажатием. Это не очень дружественная клавиатура, однако его главным образом невозможное для использования сети без своего рода манипулятора. В этом случае Вы использовали бы пространственное расположение для соединения категорий и фотографий.
Существуют различные варианты с двумя грудами (доступны и выбраны) и т.д.
Можно ли сделать, по крайней мере, тестирование удобства пользования "прихожей"?
Какова фактическая задача в пользовательских терминах и кто пользователи?
Я ненавижу мультивыбор, особенно когда объект может позже быть отредактирован (если Вы нажимаете, не держа CTRL, Вы теряете то, что Вы уже выбрали). Лучшие две опции, по моему опыту:
Альтернативы, которые я использовал в прошлом:
1) Для небольшого количества объектов используют список флажка. Флажки намного более интуитивны и просты использовать, но для большого количества объектов это может, стал проблемой. Однако, когда количество объектов растет, можно добавить a:
<div style="overflow: scroll" />
с фиксированной высотой.
2) Для очень большого количества объектов становится трудным видеть то, что действительно выбрано особенно, когда существует немного объектов, на самом деле выбранных. В этом случае два списка бок о бок с возможностью переместить объекты от одного до другого являются намного лучшим подходом.
3) Когда количество объектов не является очень большим, но больше, чем некоторые, я использовал выпадающее со сборкой флажков, внутренней, который имеет преимущество занятия только небольшого места. Что-то вроде этого могло бы помочь.