Cin*_*tyk 5 excel ms-access vba
我在 Windows 10 上的 MS Access 2013 中工作,我只是想编写一个 Sub 来打开磁盘上的 Excel 文件,更改列格式和一些列,保存并退出。Sub 运行并按预期执行,但问题是即使在 .Quit 命令之后,“EXCEL.EXE”也会继续运行,随后对该 Sub 的调用将导致运行时错误。如果我在运行子程序后关闭 Access,任务管理器上的“EXCEL.EXE”会消失,但如果我执行“压缩和修复”数据库,则不会。
我已经完成了另一个 Sub ,它只是在磁盘上打开一个 Excel 文件并将所有列的宽度更改为“自动宽度”,然后关闭,它工作正常并且不会让“EXCEL.EXE”运行。
我究竟做错了什么?是否可以在 VBA 中确保“EXCEL.EXE”正确退出?
我在 Dims 和 Sets to Nothing、Workbook Closes 等上尝试了很多不同的行顺序。 另外,我在这里和其他网站上搜索了如何解决这个问题,但 2 小时后我看到的唯一建议是使用 VBA ThisWorkbook.Saved = True 之类的东西,但我在 .Quit 之前和之后都尝试过,但没有效果。除此之外,我只找到 VB.NET 或其他我不使用的环境的解决方案,现在几乎没有。
感谢您阅读本文。
代码如下:
Sub changeXLcolumnFormatting()
Dim XL As Object
Set XL = CreateObject("Excel.Application")
XL.Visible = False
XL.DisplayAlerts = False
XL.Workbooks.Open "C:\Users\640344\Desktop\rawDataTest.XLSX"
Dim sht As Worksheet
With XL
Set sht = ActiveWorkbook.Worksheets(1)
Dim rng As Range
Dim i As Integer, j As Integer
field_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|")
sht.Select
end_of_table = sht.UsedRange.Columns.Count
For j = 0 To UBound(field_names)
For i = 1 To end_of_table
Set rng = sht.Cells(1, i)
If InStr(rng.Text, field_names(j)) > 0 Then
sht.Columns(i).NumberFormat = "yyyy-mm-dd HH:MM:ss"
End If
Next i
Next j
End With
Set rng = Nothing
Set sht = Nothing
XL.ActiveWorkbook.Close (True)
XL.Quit
Set XL = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
声明并使用特定的Workbook对象 - 就像对Worksheet和Range所做的那样,如下所示:
\n\n Dim xls \xc2\xa0 \xc2\xa0 As Excel.Application\n\xc2\xa0 \xc2\xa0 Dim wkb \xc2\xa0 \xc2\xa0 As Excel.Workbook\n\xc2\xa0 \xc2\xa0 Dim wks \xc2\xa0 \xc2\xa0 As Excel.Worksheet\n Dim rng As Range\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 Set xls = New Excel.Application\n\xc2\xa0 \xc2\xa0 Set wkb = xls.Workbooks.Open("c:\\test\\workbook1.xlsx")\n\xc2\xa0 \xc2\xa0 Set wks = wkb.Worksheets(1)\n Set rng = wks.Range(<something>)\n\xc2\xa0 \xc2\xa0 \n \' Do stuff.\n\xc2\xa0 \xc2\xa0 wks.Name = "My New Name"\n With rng\n \' Do more.\n End With\n\n\xc2\xa0 \xc2\xa0 wkb.Close True\n\xc2\xa0 \xc2\xa0 \n Set rng = Nothing\n\xc2\xa0 \xc2\xa0 Set wks = Nothing\n\xc2\xa0 \xc2\xa0 Set wkb = Nothing\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 xls.Quit\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 Set xls = Nothing\nRun Code Online (Sandbox Code Playgroud)\n\n另外,不要使用“选择”,它仅供可见使用。而是定义范围。
\n\nCinetyk 的编辑:
\n\n使用@Gustav \的指示,执行我想要的操作并解决问题的代码是:
\n\nSub changeXLcolumnFormatting()\n\nDim XL As Excel.Application\nDim sht As Excel.Worksheet\nDim wkb As Excel.Workbook\nDim rng As Range\n\nSet XL = New Excel.Application\nXL.Visible = False\nXL.DisplayAlerts = False\n\nSet wkb = XL.Workbooks.Open("C:\\Users\\640344\\Desktop\\rawDataTest.XLSX")\nSet sht = wkb.Worksheets(1)\n\nDim i As Integer, j As Integer\n\nfield_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|")\nend_of_table = sht.UsedRange.Columns.Count\n\nFor j = 0 To UBound(field_names)\n For i = 1 To end_of_table\n Set rng = sht.Cells(1, i)\n If InStr(rng.Text, field_names(j)) > 0 Then\n sht.Columns(i).NumberFormat = "yyyy-mm-dd HH:MM:ss"\n End If\n Next i\nNext j\n\nwkb.Close (True)\nSet rng = Nothing\nSet sht = Nothing\n\nXL.Quit\nSet XL = Nothing\n\nEnd Sub\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
13610 次 |
| 最近记录: |