Копирование и вставка значений из одной таблицы в другую с использованием VBA и ListObjects - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь сравнить данные о расходах из двух источников: ручной ввод данных от пользователей и автоматическое извлечение данных для разных бизнес-единиц. Общими данными из обоих источников является идентификатор расходов.

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

В этой таблице я буду «удваивать» общие расходы для каждого идентификатора, но затем я могу создать сводную таблицу, в которой я буду четко сравнивать вводимые пользователем данные с автоматическим извлечением для каждого идентификатора.

Я выделил важные поля, которые мне нужно скопировать и вставить. [! [PGIvsManual] [3]] [3]

Мой код следующий

Sub PGIvsManualInput()

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set PGIvsManualTable = Worksheets("PGI vs Dépenses (Auto)").ListObjects("PGIvsManualInputAuto")
    Set PGITable = Worksheets("PGI Clean").ListObjects("PGIExtract")
    Set ManualInputTable = Worksheets("Dépenses").ListObjects("Dépenses")

    'Cleaning the table
    With Worksheets("PGI vs Dépenses (Auto)").Range("PGIvsManualInputAuto")
        .ClearContents
        .Borders(xlInsideHorizontal).LineStyle = xlNone
    End With

    With PGIvsManualTable
        If .ListRows.Count >= 1 Then
            .DataBodyRange.Rows.Delete
        End If
    End With

    'Copy the data
    PGITable.ListColumns(1).DataBodyRange.Resize(, 2).Copy Destination:= _
    PGIvsManualTable

Муравей вот где все становится грязно. Я даже не могу получить первую партию данных для правильного импорта! Я пытаюсь скопировать 2 первых столбца из PGITable и вставить их в 2 первых столбца PGIvsManualTable. Ранее это работало без определения какого-либо столбца назначения в моем первом примере, хотя во входной и целевой таблицах не было одинакового количества столбцов

Но в этом случае это расширяет вставку на все столбцы моей таблицы назначения! Я не понимаю этого компорта, так как он не встречается в моем предыдущем примере с в основном тем же кодом !!

Я пытался установить пункт назначения следующим образом, но всегда получал ошибки:

PGIvsManualTable.ListColumns(1).DataBodyRange.Resize(, 2) ==> Error 91

PGIvsManualTable.DataBodyRange(1,1) ==> Error 438

PGIvsManualTable.ListColumns(1).Resize(, 2) ==> Error 438

И несколько других, но это никогда не работало должным образом.

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

Полагаю, что если мне удастся заставить этот первый импорт работать, все остальные будут работать на том же шаблоне, но в то же время мой код работает на предыдущем примере.

1 Ответ

0 голосов
/ 04 апреля 2019

Удаление DataBodyRange.Rows вызовет проблему, если вы попытаетесь вставить в DataBodyRange.

В качестве обходного пути вы можете удалить все строки после первой, что-то вроде этого примера:

Sub Test()
    Dim firstTbl As ListObject, secondTbl As ListObject
    Set firstTbl = Sheet1.ListObjects("Table1")
    Set secondTbl = Sheet1.ListObjects("Table2")

    With secondTbl
        .DataBodyRange.Clear

        If .ListRows.Count > 1 Then
            .DataBodyRange.Offset(1).Resize(.ListRows.Count - 1).Rows.Delete
        End If   
    End With

    firstTbl.ListColumns(1).DataBodyRange.Resize(, 2).Copy secondTbl.DataBodyRange(1, 1)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...