【问题标题】:MS Access - VBA - create new Excel workbookMS Access - VBA - 创建新的 Excel 工作簿
【发布时间】:2020-02-12 20:41:45
【问题描述】:

我使用以下 VBA 函数来读取 Excel 文件并“创建”一个新工作簿以将其保存为 CSV 文件。 当我第一次运行此功能时,这工作正常。 我会再次运行它,它不会打开一个新的工作簿(没有返回错误),我必须关闭 MS Access,然后我再次调用这个函数。

有人知道我做错了什么吗?

   public function fctImportExcel ()  

      Dim objExcel As Excel.Application
      Dim wbExcel As Excel.Workbook
      Dim wbCSV As Excel.Workbook
      Dim wsExcel As Excel.Worksheet
      Dim wsCSV As Excel.Worksheet

      Set objExcel = New Excel.Application
      Set wbExcel = objExcel.Workbooks.Open("filepath")
      Set wsExcel = wbExcel.Sheets("sheet1")
      objExcel.Visible = True

      objExcel.DisplayAlerts = False

      wsExcel.Range(wsExcel.Cells(i, 7), wsExcel.Cells(i, 25).End(xlDown)).Copy

      Set wbCSV = Workbooks.Add
      Set wsCSV = wbCSV.Sheets("sheet")

      wsCSV.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
      objExcel.CutCopyMode = False

      wbCSV.SaveAs FileName:="workbook.csv", FileFormat:=xlCSV, CreateBackup:=False

      wbCSV.Close acSaveNo
      Set wsCSV = Nothing
      Set wbCSV = Nothing

      objExcel.DisplayAlerts = True

      wbExcel.Close acSaveNo
      objExcel.CutCopyMode = False
      objExcel.Quit

      Set wsExcel = Nothing
      Set wbExcel = Nothing
      Set objExcel = Nothing

     End Function

【问题讨论】:

  • 您确定要打开名为"filepath" 的工作簿吗?

标签: vba ms-access


【解决方案1】:

您必须始终对 Excel 对象非常具体。所以试试:

Set wbCSV = objExcel.Workbooks.Add

并小心以相反的顺序关闭:

  wbCSV.Close acSaveNo
  Set wsCSV = Nothing
  Set wbCSV = Nothing

  wbExcel.Close acSaveNo
  Set wsExcel = Nothing
  Set wbExcel = Nothing

  objExcel.DisplayAlerts = True
  objExcel.CutCopyMode = False
  objExcel.Quit

  Set objExcel = Nothing

【讨论】:

  • 请注意,大的关闭部分可以简化为wbCSV.Close acSaveNowbExcel.Close acSaveNoobjExcel.Quit,一旦超出范围,对象将被删除。以相反的顺序取消设置是一种很好的做法,但应该没关系,因为 Excel 应用程序对象和工作簿相互引用,并且只要您不使用它,对已关闭的工作簿/应用程序的引用就没有问题.只有答案的第一部分是真正需要的。
  • 鹰眼徽章。 :) 我通读了代码,但没有发现一个不合格的调用。
  • @ErikA:嗯,“应该”就像你写的那样,可能就是这样。然而,经验告诉我不要为了节省一些琐碎的代码行而在这方面偷工减料。
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2018-12-29
相关资源
最近更新 更多