Условно добавить несовпадающие строки в конец таблицы и работать с пробелами, используя VBA в Excel - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать модуль VBA в Excel, который сравнивает два столбца номеров свойств (мастер: столбец A, лист1, место назначения: столбец A, лист2) и возвращает все несоответствующие значения из мастера (т.е. присутствует вмастер, но не в месте назначения) в конец таблицы назначения (т. е. первая пустая строка в конце таблицы назначения).Пока что у меня есть кое-что, что работает довольно хорошо, но я обнаружил несколько ошибок при тестировании.

Код:

Sub MergeData()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim recRow As Long
Dim lastRow As Long
Dim fCell As Range
Dim i As Long

'Define our worksheets
Set wsSource = Worksheets("Sheet1")
Set wsDest = Worksheets("Sheet2")

Application.ScreenUpdating = False

recRow = 1

With wsSource
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        'See if item is in Master sheet
        Set fCell = wsDest.Range("A:A").Find(what:=.Cells(i, "A").Value, lookat:=xlWhole, MatchCase:=False)

        If Not fCell Is Nothing Then
            'Record is already in master sheet
            recRow = fCell.Row
        Else
            'Need to move this to master sheet after last found record
            .Cells(i, "A").Cells.Copy
            wsDest.Cells(lastRow, "A").Cells.Insert
            recRow = recRow
        End If
    Next i

Одна проблема, которую я заметил, была, когда в таблицах назначения есть пробелыполучить немного шаткий (пример):

Перед запуском модуля:

  M|D

  1|1

  2|     

  3|3

После:

M|D

1|1

2| 

3|2

 |3

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

M|D

1|1

2| 

3|3

 |2

Желаемый результат сохраняет порядок, а также пробел (которого не должно быть в основных данных, но я готовлюсь к наихудшим сценариям, поскольку я неDBA для мастер-таблицы).Неполучение желаемого результата в этом случае проблематично, поскольку целевой лист должен быть «статичным» (т.е. сохранять порядок строк).Рядом со столбцом A на листе назначения будут столбцы, в которые несколько пользователей будут вводить комментарии, и если таблица назначения смещается (за исключением добавления строк в конце) или комментарии переупорядочения будут отделяться от своего исходного номера соответствующего свойства.Появляется хаос и т. Д.

Я очень зелен с VBA, поэтому я не могу понять ошибки моих путей (может быть больше ошибок, но мне еще предстоит обнаружить что-то еще при тестированиипоэтому, указывая на них, будет принята с благодарностью).Кроме того, если эта информация уместна, главный список является таблицей, связанной с SQL, которая будет периодически обновляться (поэтому процесс будет обновлять мастер (динамический, т. Е. Порядок строк может изменяться и изменяется), запускать модуль для возврата новых номеров свойств ввнизу листа назначения, пользователи добавляют комментарии и фильтруют лист назначения в Excel (статический, то есть порядок строк не изменяется, за исключением случаев, когда все столбцы одновременно фильтруются или сортируются). Спасибо всем заранее. Это сообщество помогло мне прорваться через очень многоконтрольно-пропускные пункты, надеюсь, это будет еще одна история успеха.

1 Ответ

0 голосов
/ 03 января 2019

попробуйте использовать что-то более похожее на:

dim i as long, dim lrs as long, lrd as long
with sheets(1)
    lrs = .cells(.rows.count,1).end(xlup).row
    for i = 2 to lrs 'assumes header in row 1
        if application.iferror(application.match(.cells(i,1),sheets(2).columns(1),0),0)=0 then
            lrd = sheets(2).cells(sheets(2).rows.count,1).end(xlup).row
            sheets(2).cells(lrd+1,1).value = .cells(i,1).value
        end if
    next i
end with

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...