Вопрос или проблема
У меня есть таблица с данными, которые мне нужно перенести, и всё работает нормально, но мне нужен контрольный проверочный механизм перед началом выполнения основного кода. Пользователь должен сам указать, хочет ли он обработать данные из конкретной строки, выбрав “обработать” в определённом столбце. Но обработка должна быть разрешена только в том случае, если движение одинаковое для каждой выбранной строки.
Например
Строка | Движение | Сумма | Действие |
---|---|---|---|
1 | Доход | 1000 | Обработать |
2 | Прочее | 500 | |
3 | Расходы | 200 | Обработать |
4 | Доход | 300 |
В этом случае должно появиться сообщение об ошибке, указывающее, что действие невозможно выполнить, так как мы выбрали “доход” в строке 1 и “расходы” в строке 3.
Моя мысль заключалась в том, чтобы сравнивать тип движения до с текущим, но это не работает, потому что движение строки 1 “уже забыто”.
Мой код был следующим:
Dim Movement As String
Dim Movement_previous as String
For i = 2 To LastRow
Movement = Range("Movement").Cells(i).Text
Movement_previous = Range("Movement").Cells(i-1).Text
If ActiveSheet.Range("Action").Cells(i).Value = "Обработать" Then
If Movement <> Movement_previous Then
MsgBox ("Вы можете выбрать только один тип движения за одну проводку.")
Exit Sub
End If
'Основной код
End If
Next i
Существует ли обходной путь, чтобы “запомнить” предыдущую переменную-строку? Или есть более хорошее решение в целом?
Установите значение в Movement_previous
только после того, как вы нажмете первую строку “Обработать”. Эта первая строка определяет, каким должен быть каждый последующий тип движения.
Dim Movement As String
Dim Movement_previous As String
For i = 2 To LastRow
Movement = Range("Movement").Cells(i).Text
If Movement_previous = "" Then
Movement_previous = Movement
End If
If ActiveSheet.Range("Action").Cells(i).Value = "Обработать" Then
If Movement <> Movement_previous Then
MsgBox ("Вы можете выбрать только один тип движения за одну проводку.")
Exit Sub
End If
'Основной код
End If
Next i
В первый раз, когда происходит If Movement <> Movement_previous
, это, очевидно, пройдет. После этого вы сравниваете динамическую переменную Movement
, которая меняется в каждой строке, со статической переменной Movement_previous
, которая устанавливается только один раз.
Ответ или решение
Вопрос, который вы подняли, связан с необходимостью контроля за обработкой данных при работе с таблицей в VBA. Для более эффективного управления движениями в выбранных строках, вам необходимо сохранять значение движения (Movement) для первого выбранного ряда и затем сравнивать его с последующими. Давайте подробно разберем, как это можно сделать.
Анализ проблемы
У вас есть таблица с несколькими строками, и каждая строка может содержать информацию о движении (Movement) и действие (Action). Вы хотите позволить пользователю обрабатывать только те строки, где выбор движений одинаков. Для этого нужно "запомнить" движение из первой строки, которую пользователь выбрал для обработки.
Решение
Вы можете использовать несколько переменных для отслеживания и проверки движения. Вот как можно переписать ваш первоначальный код:
Dim Movement As String
Dim Movement_previous As String
Dim firstProcessSelected As Boolean
firstProcessSelected = False ' Флаг для отслеживания первого процесса
For i = 2 To LastRow
Movement = Range("Movement").Cells(i).Text
' Проверяем, есть ли действие "Process" в текущей строке
If ActiveSheet.Range("Action").Cells(i).Value = "Process" Then
' Если это первый выбранный для обработки ряд
If Not firstProcessSelected Then
Movement_previous = Movement ' Запоминаем текущее движение
firstProcessSelected = True ' Устанавливаем флаг, что первый процесс выбран
Else
' Сравниваем текущее движение с запомненным движением
If Movement <> Movement_previous Then
MsgBox ("Вы можете выбирать только один тип движения для обработки.")
Exit Sub
End If
End If
' Здесь разместите ваш фактический код обработки данных
End If
Next i
Объяснение кода
-
Инициализация переменных: Создаем переменные
Movement
иMovement_previous
, а также флагfirstProcessSelected
, который отслеживает, был ли уже выбран первый ряд для обработки. -
Цикл по строкам: Обходим каждую строку таблицы, начиная со второй строки.
-
Проверка действия: Если текущая строка содержит действие "Process", мы проверяем, была ли это первая выбранная строка для обработки.
-
Запоминание движения: Если это первая строка, где пользователь выбрал "Process", мы сохраняем значение
Movement
вMovement_previous
. -
Сравнение движений: Для всех последующих строк с действием "Process" сравниваем текущее движение с запомненным. Если они отличаются, отображаем сообщение об ошибке и выходим из процедуры.
Заключение
Данный подход позволяет эффективно "запоминать" первое выбранное движение и проверять все последующие строки на соответствие. Это делает ваш код более надежным и предотвращает нежелательные ошибки во время обработки данных.
Использование такого рассказа о логике работы вашего кода не только облегчает понимание для других разработчиков, но и может оптимизировать процесс работы в будущем, делая поддержание кода более простым и понятным.