【问题标题】:VBA: Copying data into existing listobjectVBA:将数据复制到现有的列表对象中
【发布时间】:2019-07-13 04:10:36
【问题描述】:

我收到此类错误:

我的目标是从另一个工作表(在另一个工作簿中)复制数据并将其粘贴到我的主工作簿/工作表中的现有表中。首先,我清除数据,然后插入新数据。我循环浏览的每张工作表在我的主工作簿中都有相应的工作表。每张表只有 1 个列表对象(表)。 到目前为止,实现了以下代码(这似乎与我当前的问题有关):

Option Explicit
'Declaring all public variables and constants

' Strings
Public InputPath        As String
Public OutputPath       As String
Public DataFile         As String

' Integers
Public i                As Integer
Public j                As Integer
Public k                As Integer
Public fr               As Integer
Public fc               As Integer
Public lr               As Integer
Public lc               As Integer

' Workbooks and worksheets
Public Wkb              As Workbook
Public Ws               As Worksheet
Public Tws              As Worksheet

'Objects, ranges, arrays
Public NewData          As Range
Public tbl              As ListObject

Sub main()
' This sub is used to set public variables

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

InputPath = "MyInputPath\"
OutputPath = "MyOutputPath\"
DataFile = "MyFile.xlsx"

Call UpdateData

ThisWorkbook.Sheets(1).Activate

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Sub UpdateData()
' This sub updates data (fetching new sheets from generated Excel-file)

' Updating sheets
    Application.DisplayAlerts = False
    Workbooks.Open Filename:=OutputPath & DataFile
    Set Wkb = Workbooks(DataFile)

    With Wkb
        k = .Worksheets.Count
        For i = 1 To k ' Number of default worksheets to all worksheets
            For Each Ws In ThisWorkbook.Worksheets
                If .Worksheets(i).Name = Ws.Name Then ' Finding matching worksheet
                    Set Tws = .Sheets(i)
                    Set tbl = Ws.ListObjects(1)
                        With tbl ' Deleting data from current table in the worksheet
                            If Not .DataBodyRange Is Nothing Then
                                .Rows.Delete
                            End If
                        End With
                    fr = WorksheetFunction.Match("ConsistentKeyword", Ws.Columns(1), 0) - 3 ' First row
                    fc = 1 ' First column
                    lc = Tws.Cells(fr, fc).End(xlToRight).Column ' Last column
                    lr = Tws.Cells(fr, fc).End(xlDown).Row - 3 ' Last row
                    Set NewData = Tws.Range(Tws.Cells(fr, fc), Tws.Cells(lr, lc))
                    NewData.Copy              
                    tbl.DataBodyRange.PasteSpecial xlPasteValues '<--- OBS ERROR IS IN THIS LINE
                    Application.CutCopyMode = False
                End If
            Next Ws
        Next i
        .Close SaveChanges:=False
    End With

    Application.DisplayAlerts = True

End Sub

请注意,我的错误发生在tbl.DataBodyRange.PasteSpecial xlPasteValues

编辑:我尝试添加代码:

Ws.Activate
tbl.Range(2, 1).Select
Selection.PasteSpecial xlpastevalues

而不是:

tbl.DataBodyRange(1, 1).PasteSpecial xlPasteValues

但这会产生运行时错误“1004”:为此,所有合并的单元格必须具有相同的大小。,但是我复制的所有单元格都没有被合并。由于这需要激活工作表和选择,我宁愿解决我的原始代码。

【问题讨论】:

  • 在您的问题中,您发布了错误图像,然后您说我收到错误 91 对象变量或未设置块变量。您遇到了哪个错误?哪一行会产生错误?请更具体一点。
  • 正如我在文本中提到的,我说“我想使用此代码”,这也在代码窗口中“但我收到 91 个对象错误”。我也已经在我的错误所在的代码中添加了注释。但为了你的缘故,我会更新我的正文以澄清。
  • 错误 91 很清楚,但我很困惑,因为您的第一张图片显示错误 1004,而我是 91 还是 1004?就是这样。
  • 我认为您必须在粘贴之前向表中添加一行。

标签: excel vba error-handling listobject


【解决方案1】:

我通过在with tbl 子句中添加行.ListRows.Add 并设置(以保持源格式)使我的代码工作:

                NewData.Copy
                tbl.DataBodyRange(1, 1).PasteSpecial

感谢@SJR 的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2013-02-02
    • 2021-05-31
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多