Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Access-VBA-创建新的Excel工作簿_Vba_Ms Access - Fatal编程技术网

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

MS Access-VBA-创建新的Excel工作簿,vba,ms-access,Vba,Ms Access,我使用以下VBA函数读取Excel文件,并“创建”一个新工作簿以将其另存为CSV文件。 当我第一次运行这个函数时,它工作得很好。 我会再次运行此操作吗?它不会打开新工作簿(没有返回错误),我必须关闭MS Access,然后再次调用此函数 有人知道我做错了什么吗 public function fctImportExcel () Dim objExcel As Excel.Application Dim wbExcel As Excel.Workbook

我使用以下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

对于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

是否确实要打开名为
“文件路径”
的工作簿?请注意,大型关闭部分可以简化为
wbcv.close acSaveNo
wbecel.close acSaveNo
objExcel.Quit
,一旦超出范围,对象将被删除。按相反顺序取消设置是一种很好的做法,但应该无关紧要,因为Excel应用程序对象和工作簿彼此都有引用,并且只要不使用它,就可以引用一个已关闭的工作簿/应用程序。只有答案的第一部分是真正需要的。鹰眼徽章。:)我已经通读了代码,但没有发现一个不合格的调用。@ErikA:嗯,正如你所写的,“应该”,可能就是这样。然而,经验告诉我,不要为了节省一些琐碎的代码行而在这方面走弯路。