【问题标题】:Copy sheet from excel workbook to another workbook将工作表从 Excel 工作簿复制到另一个工作簿
【发布时间】:2018-03-27 16:25:35
【问题描述】:

下面是我从一个工作簿复制到另一个工作簿的代码。 我查找了很多类似的问题,但无法正常工作。 当我运行它时,这两个文件打开,然后我得到第三个名为 book1 的所有结果。然后我得到一个错误“工作表类的复制方法失败”。 我想要做的是将一般报告表从 o.Book 复制到 xBook。 我想暂时让这些书保持打开状态,直到这是正确的,但我稍后会使用 Xbook。 请问我可以得到帮助吗?

Private Sub Button1_Click(sender As Object, e As EventArgs) 处理 Button1.Click

    Dim oExcel As Excel.ApplicationClass
    Dim oBook As Excel.WorkbookClass
    Dim oBooks As Excel.Workbooks

    Dim xExcel As Excel.ApplicationClass
    Dim xBook As Excel.WorkbookClass
    Dim xBooks As Excel.Workbooks

    Dim user As String
    Dim opath As String
    Dim opathS As String
    Dim timeStamp As DateTime = DateTime.Now
    Dim path2 As String


    Label1.Text = "Working..."

    'Get the current system user user and set path to file
    user = Environment.UserName
    opath = "C:\Users\" + user + "\Downloads\ADC Open.xls"
    path2 = "C:\Users\" + user + "\Downloads\Personal.xlsm"
    opathS = "C:\Users\" + user + "\Desktop\Report.xls"

    'Create first object
    oExcel = CreateObject("Excel.Application")
    oExcel.DisplayAlerts = False
    oExcel.Visible = True
    oBooks = oExcel.Workbooks

    'Create second object
    xExcel = CreateObject("Excel.Application")
    xExcel.DisplayAlerts = False
    xExcel.Visible = True
    xBooks = xExcel.Workbooks

     'open first book 
    oBook = oBooks.Open(opath)

    'open second book
    xBook = xBooks.Open(path2)

    oBook.Worksheets("general_report").Copy(After:=xBook.Worksheets("general_report"))
    'Run the subroutine.
    'xExcel.Run("Execute")

    'xExcel.DisplayAlerts = False

    'Delete sheet not needed any more
    'xBook.Sheets("general_report").Delete

    'xExcel.DisplayAlerts = False

    'Save results to new file
    xBook.SaveAs(opathS)

    Label1.Text = "File saved at: " + opathS
    'Close the workbook and quit Excel.
    oBook.Close(False)

    System.Runtime.InteropServices.Marshal.
       ReleaseComObject(oBook)
    oBook = Nothing
    System.Runtime.InteropServices.Marshal.
       ReleaseComObject(oBooks)
    oBooks = Nothing
    oExcel.Quit()
    System.Runtime.InteropServices.Marshal.
       ReleaseComObject(oExcel)
    oExcel = Nothing

    'Delete  original file after finished with it 
    'System.IO.File.Delete(opath)
End Sub

【问题讨论】:

  • 乍一看,您正在创建两个 Excel 实例,打开每个实例中的工作簿(因此每个实例都有一个打开的工作簿),然后在第一个实例中您打算将工作表复制到另一个工作簿,在该实例中 已关闭 并标记为只读,因为它已在其他位置(在 Excel 的另一个实例中)打开。对吗?
  • 没错,不幸的是我不明白如何解决这个实例问题。
  • 合并oExcelxExcel?
  • 我想将工作表从 oExcel 复制到 xExcel 中,然后想删除 oExcel
  • 还想在 xExcel 中复制的数据上运行宏

标签: excel visual-studio-2017 vba


【解决方案1】:

还不能加注释,但是如果VB在所有平台上都是一样的,你不应该Set声明后的变量吗?

Set MyObject = YourObject ' Assign object reference. 
Set MyObject = Nothing ' Discontinue association. 

【讨论】:

  • 我的猜测是 OP 使用的是 VB.net(没有完全意识到 VB.net 和 VBA 之间存在差异);然后that question 解释了Set 的命运。
  • @AntoineL 我假设 OP 没有使用 Excel VBA,否则没有必要创建 Excel 对象,但从我过去的错误来看,忘记Set 变量导致Copy method of Worksheet class failed。跨度>
  • @CCM 当我尝试使用 Set 来设置对象时,我收到一个错误,即不再支持 Set 赋值语句
【解决方案2】:

在收到所有回复后,我开始研究这些对象设置并找到有助于解释的代码,我重构了我以前的版本,这就是我想出的。它现在就像一个魅力。感谢大家的帮助和cmets。

Private Sub Button1_Click(sender As Object, e As EventArgs) 处理 Button1.Click

    Dim xlApp As Excel.Application = New Excel.Application

    Dim user As String
    Dim sourcePath As String
    Dim targetPath As String
    Dim savePath As String


    Label1.Text = "Working..."
    user = Environment.UserName
    sourcePath = "C:\Users\" + user + "\Desktop\Report\ADC Open (Dell GTIE JIRA).xls"
    targetPath = "C:\Users\" + user + "\Desktop\Report\Personal1.xlsm"
    savePath = "C:\Users\" + user + "\Desktop\Report\Report" & Format(Now(), "DD-MMM-YYYY") & ".xlsm"

    Dim wbSourceBook As Excel.Workbook = xlApp.Workbooks.Open _
        (sourcePath, ReadOnly:=False)
    Dim wbTargetBook As Excel.Workbook = xlApp.Workbooks.Open _
        (targetPath, ReadOnly:=False)

    'Excel expects to receive an array of objects that
    'represent the worksheets to be copied or moved.
    Dim oSheetsList() As Object = {"general_report"}

    wbSourceBook.Sheets(oSheetsList).Copy(Before:=wbTargetBook.Worksheets(1))

    wbSourceBook.Close(True)

【讨论】:

    最近更新 更多