使用MS Access在Excel VBA中运行代码

我使用访问前端closuresSQL Server查询。 然后将logging集导出到新的Excel工作簿。 我想然后使用Excel来运行我在Access中的代码。 它只是循环遍历单元格,并添加格式并检查一定的值。 我可以从访问它将有工作簿打开循环通过罚款。 然而,这是痛苦的缓慢。

如果我进入excel并粘贴访问正在运行的格式和检查代码。 它在几秒钟内运行。 但从访问运行需要10多分钟。

任何人有任何想法,如果这可以做到?

我已经把这个代码放在Excel中的“ThisWorkbook”对象中:

Public Sub TestScript() Debug.Print "Hello" End Sub 

然后使用表单上的button成功从Access调用它:

 Private Sub cmdRunExcel_Click() Dim xl As Excel.Application Set xl = CreateObject("Excel.Application") xl.Visible = True xl.Workbooks.Open "C:/Your/FolderPath/And/FileName.xlsx", True, False xl.Run "ThisWorkbook.TestScript" Set xl = Nothing End Sub 

诚然,我没有给它很多的代码来运行,但是这里的代码至less在Excel上运行, 从Excel …这必须比试图从Excel上运行Excel的代码更好。

更新 :看看你是否可以创build模块从Access到Excel通过testing(我无法正确testing,因为我使用的是工作电脑,似乎不让我运行这种types的代码,由于安全设置)

 Private Sub cmdRunExcel_Click() Dim xl As Excel.Application Dim myWrkBk As Excel.Workbook Dim myModule As VBComponent Dim strVb As String Set xl = CreateObject("Excel.Application") xl.Visible = True xl.Workbooks.Open "C:/Your/FolderPath/And/FileName.xlsx", True, False Set myWrkBk = xl.Workbooks.Add Set myModule = myWrkBk.VBProject.VBComponents.Add(vbext_ct_StdModule) strVb = "Public Sub TestScript()" & vbCrLf _ & "Debug.Print 'Hello'" _ & "End Sub" myModule.CodeModule.AddFromString strVb ' xl.Run "ThisWorkbook.TestScript" Set myModule = Nothing Set myWrkBk = Nothing Set xl = Nothing End Sub 

如果我正确地理解了你,你从Access复制到Excel的代码,并在Excel中运行相同的代码,在这两种情况下,代码操纵电子表格,而在Excel中的一个是快速的,另一个在Access是慢的,你可以尝试以下方法:

  • 隐藏Excel窗口( ActiveWorkbook.Windows(1).Visible = False ),也请点击这里
  • 停止重新计算工作表 – 检查这个
  • 在Excel工作表(作为模板文件)中写入相同的function,并只从Access运行它

我希望这有帮助。

通常,自动化比macros(vba代码)慢得多。 这同样适用于其他应用程序,例如。 MS Word。

如果您希望在Excel中运行的代码始终是相同的,则打开一个Excel模板,附带一个包含代码的macros工作簿。 然后,从Access中,您可以运行一系列macros,当然,如果只有一个macros被传递给参数数组,则只能运行一个macros:

 Function RunExcelMacros( _ ByVal strFileName As String, _ ParamArray avarMacros()) As Boolean Debug.Print "xl ini", Time On Error GoTo Err_RunExcelMacros Static xlApp As Excel.Application Dim xlWkb As Excel.Workbook Dim varMacro As Variant Dim booSuccess As Boolean Dim booTerminate As Boolean If Len(strFileName) = 0 Then ' Excel shall be closed. booTerminate = True End If If xlApp Is Nothing Then If booTerminate = False Then Set xlApp = New Excel.Application End If ElseIf booTerminate = True Then xlApp.Quit Set xlApp = Nothing End If If booTerminate = False Then Set xlWkb = xlApp.Workbooks.Open(FileName:=strFileName, UpdateLinks:=0, ReadOnly:=True) ' Make Excel visible (for troubleshooting only) or not. xlApp.Visible = False 'True For Each varMacro In avarMacros() If Not Len(varMacro) = 0 Then Debug.Print "xl run", Time, varMacro booSuccess = xlApp.Run(varMacro) End If Next varMacro Else booSuccess = True End If RunExcelMacros = booSuccess Exit_RunExcelMacros: On Error Resume Next If booTerminate = False Then xlWkb.Close SaveChanges:=False Set xlWkb = Nothing End If Debug.Print "xl end", Time Exit Function Err_RunExcelMacros: Select Case Err Case 0 'insert Errors you wish to ignore here Resume Next Case Else 'All other errors will trap Beep MsgBox "Error: " & Err & ". " & Err.Description, vbCritical + vbOKOnly, "Error, macro " & varMacro Resume Exit_RunExcelMacros End Select End Function 

此外,请注意,您 – 如上所示 – 必须非常严格的打开,使用和closuresExcel对象,并按正确的顺序。 没有ActiveWorkbook之类的。