关闭用户从Access VBA打开的特定Excel文件
我看到了如何使用的版本关闭用户从Access VBA打开的特定Excel文件,excel,ms-access,vba,Excel,Ms Access,Vba,我看到了如何使用的版本 Dim ran as Excel.Applcation 但是我使用的Access版本没有Excel.Application作为选项 我已经编写了以下运行的代码,但没有关闭该文件 Dim Path1 as String Dim objXL As Object Dim xlWB As Object Path1 = "C:/....." Set objXL = CreateObject("Excel.Application") Set xlWB = objXL.Workbo
Dim ran as Excel.Applcation
但是我使用的Access版本没有Excel.Application作为选项
我已经编写了以下运行的代码,但没有关闭该文件
Dim Path1 as String
Dim objXL As Object
Dim xlWB As Object
Path1 = "C:/....."
Set objXL = CreateObject("Excel.Application")
Set xlWB = objXL.Workbooks.Open(Path1)
xlWB.Close False
Set xlWB = Nothing
objXL.Quit
Set objXL = Nothing
您可以使用以下代码关闭所有Excel文件(已发布):
Public Sub CloseAllExcel()
作为对象的Dim obj
关于GoTo ExitSub错误
作为整数的Dim i
“运行Excel应用程序的数量不应超过10000个
'虽然也可以使用,但无限循环的风险很小
对于i=0到10000
Set obj=GetObject(,“Excel.Application”)
退出
接下来我
进出口银行:
端接头
但是,如果我们要关闭一个特定的,我们需要一些我不能做的Win32魔法,但是,如果你不能做什么,你可以在StackOverflow上找到它。
弗洛伦特B发现的大多数代码
首先,声明我们的Win32函数
#如果是VBA7,则
私有声明PtrSafe函数AccessibleObjectFromWindow库“oleacc”(_
ByVal hwnd作为LongPtr,ByVal dwId作为Long,riid作为Any,ppvObject作为Object)作为Long
私有声明PtrSafe函数FindWindowExA Lib“user32”(_
ByVal hwndParent作为LongPtr,ByVal hwndChildAfter作为LongPtr_
ByVal LPSZ类作为字符串,ByVal LPSZ窗口作为字符串)作为长PTR
#否则
私有声明函数AccessibleObjectFromWindow库“oleacc”(_
ByVal hwnd为Long,ByVal dwId为Long,riid为Any,ppvObject为Object)为Long
私有声明函数FindWindowExA Lib“user32”(_
ByVal hwndParent尽可能长,ByVal hwndChildAfter尽可能长_
ByVal LPSZ类作为字符串,ByVal LPSZ窗口作为字符串)一样长
#如果结束
然后使用它们获取所有正在运行的Excel应用程序对象
公共函数GetExcelInstances()作为集合
Dim guid&(0到3),acc作为对象,hwnd,hwnd2,hwnd3
guid(0)=&H20400
guid(1)=&H0
guid(2)=&HC0
guid(3)=&H46000000
Set GetExcelInstances=新集合
做
hwnd=FindWindowExA(0,hwnd,“XLMAIN”,vbNullString)
如果hwnd=0,则退出Do
hwnd2=FindWindowExA(hwnd,0,“XLDESK”,vbNullString)
hwnd3=FindWindowExA(hwnd2,0,“EXCEL7”,vbNullString)
如果AccessibleObjectFromWindow(hwnd3和HFFFFF0,guid(0),acc)=0,则
GetExcelInstances.Add acc.应用程序
如果结束
环
端函数
然后使用该集合,以便我们可以检查哪个集合打开并关闭工作簿
Public Sub-close工作簿(工作簿路径为字符串)
将实例作为集合
Set-excelInstances=GetExcelInstances
将应用程序作为对象
将工作簿设置为对象
对于excelInstances中的每个excelApp
对于Excel App.工作簿中的每个Excel工作簿
如果excelWorkbook.FullName=workbookPath,则
Excel工作簿。关闭False
如果结束
下一个Excel工作簿
如果excelApp.Workbooks.Count=0,则
退出
如果结束
下一个excelApp
端接头
然后,实现关闭功能
Dim Path1作为字符串
Path1=“C:/…”
关闭工作簿路径1
您可以使用以下代码关闭所有Excel文件(已发布):
Public Sub CloseAllExcel()
作为对象的Dim obj
关于GoTo ExitSub错误
作为整数的Dim i
“运行Excel应用程序的数量不应超过10000个
'虽然也可以使用,但无限循环的风险很小
对于i=0到10000
Set obj=GetObject(,“Excel.Application”)
退出
接下来我
进出口银行:
端接头
但是,如果我们要关闭一个特定的,我们需要一些我不能做的Win32魔法,但是,如果你不能做什么,你可以在StackOverflow上找到它。
弗洛伦特B发现的大多数代码
首先,声明我们的Win32函数
#如果是VBA7,则
私有声明PtrSafe函数AccessibleObjectFromWindow库“oleacc”(_
ByVal hwnd作为LongPtr,ByVal dwId作为Long,riid作为Any,ppvObject作为Object)作为Long
私有声明PtrSafe函数FindWindowExA Lib“user32”(_
ByVal hwndParent作为LongPtr,ByVal hwndChildAfter作为LongPtr_
ByVal LPSZ类作为字符串,ByVal LPSZ窗口作为字符串)作为长PTR
#否则
私有声明函数AccessibleObjectFromWindow库“oleacc”(_
ByVal hwnd为Long,ByVal dwId为Long,riid为Any,ppvObject为Object)为Long
私有声明函数FindWindowExA Lib“user32”(_
ByVal hwndParent尽可能长,ByVal hwndChildAfter尽可能长_
ByVal LPSZ类作为字符串,ByVal LPSZ窗口作为字符串)一样长
#如果结束
然后使用它们获取所有正在运行的Excel应用程序对象
公共函数GetExcelInstances()作为集合
Dim guid&(0到3),acc作为对象,hwnd,hwnd2,hwnd3
guid(0)=&H20400
guid(1)=&H0
guid(2)=&HC0
guid(3)=&H46000000
Set GetExcelInstances=新集合
做
hwnd=FindWindowExA(0,hwnd,“XLMAIN”,vbNullString)
如果hwnd=0,则退出Do
hwnd2=FindWindowExA(hwnd,0,“XLDESK”,vbNullString)
hwnd3=FindWindowExA(hwnd2,0,“EXCEL7”,vbNullString)
如果AccessibleObjectFromWindow(hwnd3和HFFFFF0,guid(0),acc)=0,则
GetExcelInstances.Add acc.应用程序
如果结束
环
端函数
然后使用该集合,以便我们可以检查哪个集合打开并关闭工作簿
Public Sub-close工作簿(工作簿路径为字符串)
将实例作为集合
Set-excelInstances=GetExcelInstances
将应用程序作为对象
将工作簿设置为对象
对于excelInstances中的每个excelApp
对于Excel App.工作簿中的每个Excel工作簿
如果excelWorkbook.FullName=workbookPath,则
Excel工作簿。关闭False
如果结束
下一个Excel工作簿
如果excelApp.Workbooks.Count=0,则
退出
如果结束
下一个excelApp
端接头
然后,实现关闭功能
Dim Path1作为字符串
Path1=“C:/…”
closeWor