Копировать ячейки, если они не найдены на другом листе - PullRequest
0 голосов
/ 11 января 2019

Я пишу функцию VBA для копирования данных из листа буфера, если их нет на листе базы данных. Он сравнивает идентификатор (в столбце D / 4) из текущей строки буфера ("Tampon QE") и добавляет его в конец листа базы данных ("BD QE"), если его нет, с массивом идентификаторов из лист базы данных.
Я не могу заставить его работать, в чем проблемы?
Спасибо в аванс.

Function danstableau(tableau, arechercher)
    danstableau = False
    For i = LBound(tableau) To UBound(tableau)        
        If tableau(i) = arechercher Then
            danstableau = True
            Exit For
        End If
    Next
End Function

Sub copieBDQE()
    Dim i As Integer
    Dim nblignetampon As Integer
    Dim nbligneBD As Integer
    Dim tableauref As Variant
    Dim msgString As String
    Dim var As Variant

    nblignetampon = Worksheets("Tampon QE").Cells(Rows.Count, 1).End(xlUp).Row
    nbligneBD = Worksheets("BD QE").Cells(Rows.Count, 1).End(xlUp).Row
    tableauref = Application.Transpose(Worksheets("BD QE").range(Worksheets("BD QE").Cells(1, 4), Worksheets("BD QE").Cells(nbligneBD, 4)))

    For i = 1 To nblignetampon + 1
    var = Worksheets("Tampon QE").Cells(i, 4).Value
        If danstableau(tableauref, var) Then
            i = i + 1
        Else
            nbligneBD = nbligneBD + 1
            Worksheets("tampon QE").range(Cells(i, 1), Cells(i, 22)).Copy Destination:=Worksheets("BD QE").range(Cells(nbligneBD, 1), Cells(nbligneBD, 22))
        End If
    Next i
End Sub

Ответы [ 2 ]

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

Тебе следует учесть очки Вариата.

Ваша конкретная ошибка, вероятно, связана с отсутствием ссылок на листы. В зависимости от того, какой лист активен при запуске кода, ваш диапазон может быть разбит на два листа, что приведет к ошибке. Полностью квалифицируйте все Range / Cells, а именно:

With Worksheets("tampon QE")
    .Range(.Cells(i, 1), .Cells(i, 22)).Copy Destination:=Worksheets("BD QE").Cells(nbligneBD, 1)
End With
0 голосов
/ 11 января 2019

Я подозреваю, что ваша проблема может быть связана с количеством записей, которые вы обрабатываете. i - целое число, ограничивающее его до 32000 макс Ваш цикл для i = 1 К nblignetampon + 1 добавляет i = i + 1 всякий раз, когда ссылка не найдена, плюс снова на Next i . Так что я бы вырос в два раза быстрее, чем вы ожидаете, и, возможно, превысил бы максимально допустимое для целого числа. Вот почему строки и столбцы всегда должны быть объявлены как Long. В вашем коде есть дополнительная ошибка, потому что он проверяет только все остальные строки. Кстати, tableauref , кажется, дал вам проблему.

tableauref = Worksheets("BD QE").Range(Worksheets("BD QE").Cells(1, 4), Worksheets("BD QE").Cells(nbligneBD, 4)).Value

даст вам 2-мерный массив (на основе 1), то есть он имеет nbligneBD строк и 1 столбец. Поэтому значение ячейки D1 ​​будет в tableauref (1,1), D2 = tableauref (2,1), D [nbligneBD] = tableauref (Ubound (tableauref), 1) Другая вещь, которая меня поразила, заключается в том, что вам не нужно определять полный диапазон Destination в функции Copy . Достаточно определить первую ячейку. Конечно, первая ячейка - Worksheets("BD QE").Cells(Worksheets("BD QE").Rows.Count, "A").End(XlUp) Итак, ваш подсчет nbligneBD кажется излишним. Надеюсь, я правильно определил проблему. Это предположение.

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