【问题标题】:Copy data from different workbook and paste it to specific sheets on a report workbook从不同的工作簿复制数据并将其粘贴到报表工作簿上的特定工作表
【发布时间】:2020-05-08 02:02:29
【问题描述】:

目前我是学习 VBA 以进行报告的新手,我仍在从中学习。继续前进,我可以在这个方面寻求帮助吗? :),我的情况是这样的。

  • 我有 20 个工作簿(POLY、BAYO、PROPO、TIPAS、CITRO....等)的数据,工作表名称为 (Sheet1)
  • 我有一个包含许多工作表的摘要工作簿,其工作表名称基于 20 个工作簿文件名,但不按字母顺序排列。 (工作表名称 = CITRO、BAYO、PROPO、POLY、TIPAS....等)
  • 我想根据文件名和特定单元格(“B2:F2”)复制每个工作簿上的数据并将其粘贴到各自的工作表名称中
  • 可行吗?

这是我正在尝试处理的代码,问题是,它正在创建自己的工作表,而不是将其粘贴到我想要的工作表上。


Private Sub CommandButton1_Click()

Dim SourceBook As Workbook   
Dim CurrentBook As Workbook

application.screenupdating = false
Set CurrentBook = ThisWorkbook

Set SourceBook = Workbooks.Open("C:\CITRO.xlsx")
SourceBook.Sheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Sheets("CITRO").Range("R2:V2")

Set SourceBook = Workbooks.Open("C:\BAYO.xlsx")
SourceBook.Sheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Sheets("BAYO").Range("R2:V2")

Set SourceBook = Workbooks.Open("C:\PROPO.xlsx")
SourceBook.Sheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Sheets("PROPO").Range("R2:V2")

MsgBox "Completed"
Application.Workbooks("CITRO").Close
Application.Workbooks("BAYO").Close
Application.Workbooks("PROPO").Close
'SourceBook.Close
'Set SourceBook = Nothing
'Set CurrentBook = Nothing

'ThisWorkbook.Activate
'Application.Worksheets("Summary").Activate
'Application.Worksheets("Summary").Range("B2:F2").Select

End Sub

【问题讨论】:

  • 因为SourceBook.Sheets("Sheet1").Copy 复制了整个工作表。您只需要在一行中复制一个范围SourceBook.Sheets("Sheet1").Range("A1:B10").Copy Destination:=CurrentBook.Sheets("Summary").Range("A1")‹~~。根据需要调整范围地址。
  • 感谢输入 -Peh,现在这就是我编写的代码,因为我还不熟悉循环,(有人告诉我)。我基本上为它做手动静态代码,我也删除了 sourcebook.close 并替换为 application.workbooks("Sheets").close 原因是我不知道为什么它仍然打开数据源工作簿。

标签: excel vba


【解决方案1】:

您需要先关闭SourceBook,然后再用SourceBook.Close SaveChanges:=False打开一个新的

Private Sub CommandButton1_Click()
    Dim SourceBook As Workbook   
    Dim CurrentBook As Workbook

    Application.ScreenUpdating = False 'don't forget to activate it in the end
    Set CurrentBook = ThisWorkbook

    Set SourceBook = Workbooks.Open("C:\CITRO.xlsx")
    SourceBook.Worksheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Worksheets("CITRO").Range("R2:V2")
    SourceBook.Close SaveChanges:=False

    Set SourceBook = Workbooks.Open("C:\BAYO.xlsx")
    SourceBook.Worksheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Worksheets("BAYO").Range("R2:V2")
    SourceBook.Close SaveChanges:=False

    Set SourceBook = Workbooks.Open("C:\PROPO.xlsx")
    SourceBook.Worksheets("Sheet1").Range("B2:F2").Copy Destination:=CurrentBook.Worksheets("PROPO").Range("R2:V2")
    SourceBook.Close SaveChanges:=False

    Application.ScreenUpdating = True        
    MsgBox "Completed"
End Sub

或者,您可以使用一个过程来缩短它:

Private Sub CommandButton1_Click()        
    Application.ScreenUpdating = False 'don't forget to activate it in the end

    CopyIntoThisWorkbook "C:\CITRO.xlsx", "CITRO"
    CopyIntoThisWorkbook "C:\BAYO.xlsx", "BAYO"
    CopyIntoThisWorkbook "C:\PROPO.xlsx", "PROPO"

    Application.ScreenUpdating = True        
    MsgBox "Completed"
End Sub


Private Sub CopyIntoThisWorkbook(ByVal SourceFileName As String, ByVal DestinationSheetName As Range)
    Dim SourceBook As Workbook
    Set SourceBook = Workbooks.Open(SourceFileName)
    SourceBook.Worksheets("Sheet1").Range("B2:F2").Copy Destination:=ThisWorkbook.Worksheets(DestinationSheetName).Range("R2:V2")
    SourceBook.Close SaveChanges:=False
End Sub

如果工作表名称CITRO总是文件名CITRO.xlsx,那么您甚至可以使用带有循环的数组:

Private Sub CommandButton1_Click()        
    Application.ScreenUpdating = False 'don't forget to activate it in the end
    Dim SheetNameList() As Variant
    SheetNameList = Array("CITRO", "BAYO", "PROPO") 'easily extendable

    Dim SheetName As Variant
    For Each SheetName In SheetNameList
        CopyIntoThisWorkbook SheetName
    Next SheetName

    Application.ScreenUpdating = True        
    MsgBox "Completed"
End Sub


Private Sub CopyIntoThisWorkbook(ByVal DestinationSheetName As String)
    Dim SourceBook As Workbook
    Set SourceBook = Workbooks.Open("C:\" & DestinationSheetName & ".xlsx")
    SourceBook.Worksheets("Sheet1").Range("B2:F2").Copy Destination:=ThisWorkbook.Worksheets(DestinationSheetName).Range("R2:V2")
    SourceBook.Close SaveChanges:=False
End Sub

【讨论】:

  • 太棒了。我现在将研究循环,以便我可以最小化代码行,而不是为此做 20 行:))。谢谢你
  • @JNS 再看看我的回答。
  • 太棒了,我还没有准备好完全理解这一点,但我会尽力研究该代码。因为我实际上是一个初学者,老实说。由于庆祝我的生日,迟到了回复。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多