MS Access - VBA - 创建新的Excel工作簿

4
我使用下面这个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”的工作簿吗? - FunThomas
1个回答

5

在处理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

1
请注意,大的关闭部分可以简化为 wbCSV.Close acSaveNo wbExcel.Close acSaveNo objExcel.Quit,一旦超出范围,对象将被删除。按相反顺序取消设置是一个好习惯,但不应该有影响,因为Excel应用程序对象和工作簿彼此引用,并且只要不使用它,引用已关闭的工作簿/应用程序没有问题。只需要第一部分答案即可。 - Erik A
鹰眼徽章。 :) 我已经仔细阅读了代码,但没有发现一个不合格的调用。 - Andre
@ErikA:嗯,就像你所写的那样,“应该”是这样的,也许确实如此。然而,经验告诉我,在这方面不要为了节省几行琐碎的代码而走捷径。 - Gustav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接