【发布时间】: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