【问题标题】:Copy workbooks from the link addresses and paste it in to the range address从链接地址复制工作簿并将其粘贴到范围地址
【发布时间】:2020-08-18 18:34:53
【问题描述】:

我正在尝试编写代码,该代码将根据我的主工作簿中的链接地址从另一个工作簿中复制特定工作表的内容。然后,它应该将其粘贴到我的主工作簿中的工作表范围,该工作表也作为范围地址提供。这必须在循环中执行,因为我想对存储在不同链接下的另外 2 个工作簿重复它。存储在不同链接下的所有这 3 个工作簿都有名为“数据”的工作表,必须将其粘贴到我的主工作簿中。

这是我在执行此代码时始终打开的主要工作簿。在工作表“开始”中,我有一个表格,指定 1) 链接到应从中复制数据的工作簿 (col A),2) 应在此主工作簿中粘贴数据的工作表范围地址 (col B)。

在我的代码中,除了将提供的链接中的所有 3 个工作簿的内容都粘贴到“Sheet1”!A1 之外,其他所有操作都可以。我尝试 F8 代码,看起来代码在 B 列中没有正确循环。

Sub Copy_Paste()

Dim Ws_MainWS As Worksheet
Dim intFirstRow_Ws2 As Integer
Dim intLastCol_Ws2 As Integer
Dim ActiveWs As Variant
Dim Var_Ws2Link As Variant
Dim intListRow As Integer
Dim intListRow_Paste As Integer
Dim objTable As Excel.ListObject
Dim objRange As Excel.Range
Dim intLastRow_Ws1Tbl As Integer

Set Ws_MainWS = ThisWorkbook.Sheets("Start")
Set ActiveWs = ActiveWorkbook
Set objTable = Ws_MainWS.ListObjects("tblStart")

intLastRow_Ws1Tbl = Ws_MainWS.Cells(Rows.Count, 1).End(xlUp).row
intFirstRow_Ws2 = 1
Const ColumnStart As Integer = 1

On Error GoTo ErrorHandler

'Copy and Paste into provided sheet range address
    'Loop through Links to other workbooks
    For intListRow = 3 To intLastRow_Ws1Tbl
        Set Var_Ws2Link = Ws_MainWS.Cells(intListRow, 1)

            With objTable
                'Loop through pasting range addresses and paste
                For intListRow_Paste = 1 To .DataBodyRange.Rows.Count
                    Set objRange = Excel.Range(.DataBodyRange(intListRow_Paste, .ListColumns("Sheet Range address").Index).Value)
                         Workbooks.Open Var_Ws2Link, local:=True
                         intLastCol_Ws2 = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column
                        With Worksheets("Data")
                            .Range(.Cells(intFirstRow_Ws2, ColumnStart), .Cells(.Rows.Count, intLastCol_Ws2)).Copy
                            objRange.PasteSpecial xlPasteValues
                            Application.CutCopyMode = False
                            Set objRange = Nothing
                            ActiveWorkbook.Close
                        End With

                    Exit For

                Next intListRow_Paste
            End With

            Set objTable = Nothing

    Next intListRow

MsgBox "Done"


Exit Sub
ErrorHandler:

Set objTable = Nothing

End Sub

为了循环粘贴范围地址,我使用对象表。 如果能提供任何帮助,我将不胜感激!

【问题讨论】:

  • 为什么你的循环中间有Exit For?我想我不明白为什么你同时拥有intListRow 循环和intListRow_Paste 循环。
  • 我有 Exit For,因为循环没有结束(我可以想象它不正确)。我也有 2 个循环,因为带有 intListRow_Paste 的循环用于在表中循环,而我无法使其与第一个 intListRow 一起使用。
  • 我发现的另一件事是,我只能使用指向表 A 列中其他工作簿的链接作为 Variant 来打开它们并复制内容,而对于 B 列中的范围地址我必须将表用作 Excel.Range 以便代码将它们视为地址引用并粘贴到 Sheet1 或 2 或 3 中。
  • 你需要一个循环,循环遍历表格中的每一行,打开第一列的工作簿并将内容粘贴到第二列的单元格中。你能用它吗?
  • 我尝试了一个循环。但问题是第一列(指向其他工作簿的链接)被定义为变体,第二列(粘贴内容的范围地址)被定义为 Excel 范围。因此,我无法使这个循环工作,因为我需要将第一列更改为 Excel.Range - 这不起作用,因为其他工作簿未打开,或者我需要将第二列更改为变体 - 这也不适用于之后粘贴。所以,我不知道如何继续:(

标签: excel vba copy-paste


【解决方案1】:

如果我有一个像你这样的两列表格,这对我有用。

Split 将您的地址分成两部分,即 ! 之前的位。 (表格)和(单元格地址)之后的位,如果地址不是这种形式,则会崩溃。

Sub x()

Dim r As Range, t As ListObject, wb As Workbook, v As Variant

Set t = Worksheets(1).ListObjects("Table1")

For Each r In t.ListColumns(1).DataBodyRange 'loop through column 1
    Set wb = Workbooks.Open(r.Value)         'open workbook
    v = Split(r.Offset(, 1).Value, "!")      'split cell in 2nd column
    wb.Worksheets(1).Range("A1").Copy ThisWorkbook.Worksheets(replace(v(0),"'","")).Range(v(1))        'paste
    wb.Close False
Next r

End Sub

【讨论】:

  • 感谢您的帖子。不幸的是,粘贴不起作用。我收到错误 9 下标超出范围。
  • v(0) = "Sheet1" 和 v(1) = "A1"
  • 如有必要,您是否调整了工作表参考等?您是否粘贴到包含代码的工作簿?它真的有效吗?你走过了吗?
  • 是的,我做了所有的调整。我可以看到它在阅读 v(0) 和 v(1) 时存在问题。在主工作簿范围的 B 列中,地址被写入这样的单元格: ''Sheet1'!A1 。随着 v(0) 读取 "'Sheet1'" 和 v(1) 读取 "A1" 。如您所见,它在引号中之前读取带有撇号的 Sheet1。我尝试更改范围地址“Sheet1”的方式!A1 写入单元格但没有任何效果
  • 完美!谢谢你:)
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多