我希望这是一个提出这个问题的合适地方,因为我正处于疯狂的边缘。我很生疏,我对VBA没有经验(只有C ++,java)
问题: 我试图将数据从一个工作簿复制到另一个工作簿。
假设我有一个工作簿(称为DATA),其中包含几个填充数据的工作表。每列数据都有一个唯一的标题(同一行上的所有标题)。
另一方面,我有另一个工作簿(称为REPORT),其中一个工作表只包含数据的标题(在一行中)。它们的顺序与DATA工作簿中的顺序不同。例如,我在REPORT工作表中有3个标题,可以在DATA工作簿的不同工作表中找到。
我需要遍历DATA工作簿中的所有工作表,并在找到相同的标题时将整个列复制粘贴到REPORT工作表。
此图片可能有助于理解。 Explanation
提前感谢您的帮助。我已经搜索了很多这个代码,但发现了类似的东西,但没有设法理解任何。
首次尝试这样做,但收到运行时错误“1004”的错误。 有什么帮助吗?
Dim MyFile As String
Dim ws As Worksheet
''Workbook that contains one worksheet with all the headings ONLY NO DATA
Dim TargetWS As Worksheet
Set TargetWS = ActiveSheet
Dim TargetHeader As Range
''Location of Headers I want to search for in source file
Set TargetHeader = TargetWS.Range("A1:G")
''Source workbook that contains multiple sheets with data and headings _
not in same order as target file
Dim SourceWB As Workbook
Set SourceWB = Workbooks("Source.xlsx")
Dim SourceHeaderRow As Integer: SourceHeaderRow = 1
Dim SourceCell As Range
''Stores the col of the found value and the last row of data in that col
Dim RealLastRow As Long
Dim SourceCol As Integer
''Looping through all worksheets in source file, looking for the heading I want _
then copying that whole column to the target file I have
For Each ws In SourceWB.Sheets
ws.Activate
For Each Cell In TargetHeader
If Cell.Value <> "" Then
Set SourceCell = Rows(SourceHeaderRow).Find _
(Cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not SourceCell Is Nothing Then
SourceCol = SourceCell.Column
RealLastRow = Columns(SourceCol).Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
If RealLastRow > SourceHeaderRow Then
Range(Cells(SourceHeaderRow + 1, SourceCol), Cells(RealLastRow, _
SourceCol)).Copy
TargetWS.Cells(2, Cell.Column).PasteSpecial xlPasteValues
End If
End If
End If
Next
Next
答案 0 :(得分:0)
您的问题没有说明您实际上遇到的问题的哪个部分,所以我假设您不知道如何开始。请注意,此处的任何人都无法为您提供问题的完整解决方案 - 您可以自行决定。
让您开始工作的一些提示:
关于涉及多个工作簿的问题,你要问自己的第一个问题通常是 我将把我的宏附加到哪个工作簿上?
在您的情况下, REPORT 工作簿看起来像一个更健全的选项,因为您可能希望有人点击报表中的某些内容以生成它。你也可以反过来争论。
您必须使用Workbooks.Open从磁盘加载其他Excel文件,或者在Excel实例中同时打开两个工作簿,我建议您这样做,因为它更容易。在这种情况下,只需使用Workbooks对象建立引用。
Dim exampleRefToDATA As Workbook: Set exampleRefToDATA = Workbooks("data.xlsx") ' or index
使用For Each ws As WorkSheet In exampleRefToDATA.WorkSheets
之类的东西作为For Loop
For Each allName As Range In ws.Range(... for you to figure out ...)
REPORTS
表格中 For Each thisName As Range in Range(... seriously, there's enough on stackoverflow on how to properly iterate over the used range of a row ...)
请注意此Range()
来电与ActiveWorkbook.ActiveWorkSheet.Range
相同,这是您的报告表。
希望这对你有所帮助。