Запомнить старую строку во время цикла

Вопрос или проблема

У меня есть таблица с данными, которые мне нужно перенести, и всё работает нормально, но мне нужен контрольный проверочный механизм перед началом выполнения основного кода. Пользователь должен сам указать, хочет ли он обработать данные из конкретной строки, выбрав “обработать” в определённом столбце. Но обработка должна быть разрешена только в том случае, если движение одинаковое для каждой выбранной строки.

Например

Строка Движение Сумма Действие
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

Объяснение кода

  1. Инициализация переменных: Создаем переменные Movement и Movement_previous, а также флаг firstProcessSelected, который отслеживает, был ли уже выбран первый ряд для обработки.

  2. Цикл по строкам: Обходим каждую строку таблицы, начиная со второй строки.

  3. Проверка действия: Если текущая строка содержит действие "Process", мы проверяем, была ли это первая выбранная строка для обработки.

  4. Запоминание движения: Если это первая строка, где пользователь выбрал "Process", мы сохраняем значение Movement в Movement_previous.

  5. Сравнение движений: Для всех последующих строк с действием "Process" сравниваем текущее движение с запомненным. Если они отличаются, отображаем сообщение об ошибке и выходим из процедуры.

Заключение

Данный подход позволяет эффективно "запоминать" первое выбранное движение и проверять все последующие строки на соответствие. Это делает ваш код более надежным и предотвращает нежелательные ошибки во время обработки данных.

Использование такого рассказа о логике работы вашего кода не только облегчает понимание для других разработчиков, но и может оптимизировать процесс работы в будущем, делая поддержание кода более простым и понятным.

Оцените материал
Добавить комментарий

Капча загружается...