【问题标题】:Excel VBA: How to combine specific worksheets from different workbooks?Excel VBA:如何组合来自不同工作簿的特定工作表?
【发布时间】:2017-06-14 03:25:04
【问题描述】:

我对 VBA 还是很陌生,我正在尝试组合来自不同工作簿的某些工作表。

例如:

  • 我有一个名为“One”的工作簿,其中包含多个工作表(A、B、C、D)。
  • 我有另一个名为“Two”的工作簿,其中包含多个工作表(E、F、G、H)。

我想从工作簿一中取出工作表 A,从工作簿二中取出工作表 F 和 G。我希望将这些不同的工作表放在一个名为“三”的新工作簿中。

我的工作表 A 和 F 中的字段格式完全相同,因此我也希望将这两个工作表合并,并在包含 A 数据的单元格完成后将 F 数据放在 A 数据下的相同字段中。

有人可以帮我处理这段代码吗??
如果有人也为初学者提供任何指向 VBA 的链接,我们将不胜感激。

【问题讨论】:

  • 本网站广泛介绍了这一点。但是,您可以在谷歌上搜索一些可以帮助您拼凑起来的东西。 1) 如何打开工作簿 2) 如何在工作表之间移动内容 3) 如何引用工作表对象和工作簿对象。这应该可以让你到达那里
  • 您也可以在Excel中录制宏,它会为您编写代码。这是学习一些基础知识的好方法。
  • 作为初学者,您也可以阅读VBA Best Practices,这样您就可以开始正确地做事,而不会遇到许多初学者会遇到的所有问题。如果您遇到问题,请返回您的代码和详细的错误描述,以便在您提出足够具体的好问题时人们可以提供帮助。

标签: vba excel worksheet hssfworkbook


【解决方案1】:

看例子:

'enforce declaration of variables 
Option Explicit

Sub CombineWorkbooks()
Dim sWbkOne As String, sWbkTwo As String
Dim wbkOne As Workbook, wbkTwo As Workbook, wbkThree As Workbook
Dim wshSrc As Worksheet, wshDst As Worksheet

On Error GoTo Err_CombineWorkbooks

'get the path
sWbkOne = GetWbkPath("Open workbook 'One'")
sWbkTwo = GetWbkPath("Open workbook 'Two'")
'in case of "Cancel"
If sWbkOne = "" Or sWbkTwo = "" Then
    MsgBox "You have to open two workbooks to be able to continue...", vbInformation, "Information"
    GoTo Exit_CombineWorkbooks
End If

'open workbooks: 'One' and 'Two'
Set wbkOne = Workbooks.Open(sWbkOne)
Set wbkTwo = Workbooks.Open(sWbkTwo)
'create new one - destination workbook
Set wbkThree = Workbooks.Add

'define destination worksheet
Set wshDst = wbkThree.Worksheets(1)

'start copying worksheets
'A
Set wshSrc = wbkOne.Worksheets("A")
wshSrc.UsedRange.Copy wshDst.Range("A1")
'F
Set wshSrc = wbkTwo.Worksheets("F")
wshSrc.UsedRange.Copy wshDst.Range("A1").End(xlDown)
'G
Set wshSrc = wbkTwo.Worksheets("G")
wshSrc.UsedRange.Copy wshDst.Range("A1").End(xlDown)

'done!

Exit_CombineWorkbooks:
    On Error Resume Next
    Set wbkThree = Nothing
    If Not wbkTwo Is Nothing Then wbkTwo.Close SaveChanges:=False
    Set wbkTwo = Nothing
    If Not wbkOne Is Nothing Then wbkOne.Close SaveChanges:=False
    Set wbkOne = Nothing
    Set wshDst = Nothing
    Set wshSrc = Nothing
    Exit Sub

Err_CombineWorkbooks:
    MsgBox Err.Description, vbExclamation, Err.Number
    Resume Exit_CombineWorkbooks


End Sub


Function GetWbkPath(ByVal initialTitle) As String
Dim retVal As Variant

retVal = Application.GetOpenFilename("Excel files(*.xlsx),*.xlsx", 0, initialTitle, , False)
If CStr(retVal) = CStr(False) Then retVal = ""

GetWbkPath = retVal

End Function

注意:以上代码是临时编写的,所以可能并不完美。

[EDIT2] 如果您想将数据复制到不同的工作表中,请将相应代码替换为以下代码,但首先删除这些行:

'define destination worksheet
Set wshDst = wbkThree.Worksheets(1)

稍后:

'start copying data 
'A
Set wshDst = wbkThree.Worksheets.Add(After:=wbkThree.Worksheets(wbkThree.Worksheets.Count))
wshDst.Name = "A"
Set wshSrc = wbkOne.Worksheets("A")
wshSrc.UsedRange.Copy wshDst.Range("A1")
'F
Set wshSrc = wbkTwo.Worksheets("F")
Set wshDst = wbkThree.Worksheets.Add(After:=wbkThree.Worksheets(wbkThree.Worksheets.Count))
wshDst.Name = "F"
wshSrc.UsedRange.Copy wshDst.Range("A1")
'G
Set wshSrc = wbkTwo.Worksheets("G")
Set wshDst = wbkThree.Worksheets.Add(After:=wbkThree.Worksheets(wbkThree.Worksheets.Count))
wshDst.Name = "G"
wshSrc.UsedRange.Copy wshDst.Range("A1")

祝你好运!

【讨论】:

  • 您好,感谢您的帮助!当我运行它时它说错误:未定义变量.. 当您尝试定义目标工作表时它突出显示“dstwsh”
  • 将其更改为wshDst,因为它已在Dim ... 部分中声明。检查更新的解决方案。如果有帮助,请采纳。
  • 好的,我们已经很接近了。这行得通,但它把所有东西都放在同一张纸上,看起来很混乱。你能帮我把所有的东西放在不同的纸上吗?
  • 完成!检查EDIT2部分。
  • 让我们继续讨论here。您将能够插入您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多