Остановить макрос VBA при достижении пустой строки

недавно я попытался использовать макросы для упрощения некоторых задач в Excel 2010, поскольку я работаю с огромными банками данных unfortunatey.

Я уже нашел код, который мне нужен для слияния повторяющихся строк и объединения уникальных данных/комментариев благодаря этому спасительному потоку:как объединить значения из нескольких строк в одну строку в Excel?

код был легко понять для новичка, как я (я хочу и попытаться понять, что я делаю, а не просто слепо копировать-вставить). Единственная проблема, с которой я столкнулся, заключается в том, что макрос, похоже, не останавливается на последней строке и заканчивает заполнение остальной части листа excel.

желаемый результат был получен, как показано в строке 4 до 6, но начиная строки 29...image
Однако вы можете видеть, что, начиная со строки 29, макрос сохраняет ading"; " в 10-м столбце.

вот код, который я приспособилась:

Sub merge_dupes_and_comments()
'define variables

Dim RowNum As Long, LastRow As Long

Application.ScreenUpdating = False

RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).row
Range("A2", Cells(LastRow, 10)).Select

For Each row In Selection
    With Cells
    'if OC number matches
    If Cells(RowNum, 2) = Cells(RowNum + 1, 2) Then
        'and if position and material match
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
        If Cells(RowNum, 5) = Cells(RowNum + 1, 5) Then
        'move updated comments up next to the old comment and delete empty line
            Cells(RowNum, 10) = Cells(RowNum, 10) & ";" & Cells(RowNum + 1, 10)
            Rows(RowNum + 1).EntireRow.Delete
       End If
        End If
         End If
         End With

RowNum = RowNum + 1
Next row

Application.ScreenUpdating = True

End Sub

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

Я попытался переопределить последнюю строку как:

Dim LastRow As Long

With ThisWorkbook.Worksheets("MasterData") 'enter name of the sheet you're working on
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        LastRow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).row
    Else
        LastRow = 1
    End If

но я заметил какие-то изменения.

буду благодарен за любую помощь!

большое спасибо заранее, KuroNavi

17
задан LPChip
04.02.2023 14:33 Количество просмотров материала 2505
Распечатать страницу

1 ответ

ваша последняя строка не является последней строкой таблицы, но внизу есть 3 пустые строки, которые заполняются; потому что ваш макрос содержит эту строку:

        Cells(RowNum, 10) = Cells(RowNum, 10) & ";" & Cells(RowNum + 1, 10)

эта команда в основном говорит: соедините пустую строку с пустой строкой и отделите;

но вы не хотите проверять пустые строки. Таким образом, ваш sub должен быть следующим:

Sub merge_dupes_and_comments()
    'define variables
    Dim RowNum As Integer, LastRow As Integer, EmptyCells as Integer

    Application.ScreenUpdating = False

    RowNum = 2
    LastRow = Cells.SpecialCells(xlCellTypeLastCell).row
    Range("A2", Cells(LastRow, 10)).Select

    For Each row In Selection
        'Do we have am empty row? If so exit the loop.
        'Lets count the amount of empty cells on the row.
        EmptyCells=0
        For c = 1 to 10   
            if Cells(RowNum,c) = "" then EmptyCells = EmptyCells+1
        Next c

        'If we find more than 9 empty cells, assume the row is empty, and exit the loop.
        if EmptyCells > 9 then exit for

        'Lets continue the duplicate checking
        'if OC number matches
        'and if position and material match
        If Cells(RowNum, 2) = Cells(RowNum + 1, 2) AND _
           Cells(RowNum, 4) = Cells(RowNum + 1, 4) AND _
           Cells(RowNum, 5) = Cells(RowNum + 1, 5) Then
           'move updated comments up next to the old comment and delete empty line
            Cells(RowNum, 10) = Cells(RowNum, 10) & ";" & Cells(RowNum + 1, 10)
            Rows(RowNum + 1).EntireRow.Delete
       End If

    RowNum = RowNum + 1
Next row

Application.ScreenUpdating = True

End Sub

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

0
отвечен LPChip 2023-02-05 22:21

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх