在同一工作簿中使用不同工作表中的VBA -Dumb数据的Oracle SQL到Excel

我有一个报告来生成sheet1中的命令button。 我已经写了一些VB代码来创build一个新的Excel工作簿,每次点击button,然后在那里转储SQL查询结果。 然而,我的经理想要的是,我第一次单击button时,应该通过打开一个新的工作簿来转储数据,但连续的点击应该将数据转储到同一工作簿中,而不是新的工作表。 这应该发生,直到我用命令buttonclosuresExcel表。

再次下次我用commandbutton打开这个excel时,数据应该在第一次点击时转储到一个新的工作簿中,但是对于连续的点击,数据应该被导出到新的工作表中。 请在这里find我的代码:

Option Explicit Option Base 1 Private Sub CommandButton1_Click() Call Ora_connection ThisWorkbook.Activate End Sub Public Sub Ora_connection() Dim oconn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strSQL As String Dim i As Integer Dim xla As New Excel.Application Dim xlw As New Excel.Workbook Dim xlws As Excel.Worksheet strSQL = ' SQL SELECT here1 Set oconn = New ADODB.Connection oconn.Open "Provider=OraOLEDB.Oracle;Data Source=" & Sheet1.TextBox3.Text & ";User Id=" & Sheet1.TextBox4.Text & ";Password=" & Sheet1.TextBox5.Text & ";" '----------------------------------------------------------------------------------- 'Open the recordset rs.CursorType = adOpenStatic rs.CursorLocation = adUseClient rs.LockType = adLockOptimistic rs.Open strSQL, oconn, adOpenStatic 'open new workbook and export the data Set xla = New Excel.Application xla.Visible = True Set xlw = xla.Workbooks.Add xlw.Activate Set xlws = xlw.ActiveSheet 'to copy the header of the table With xlws.Range("A2") For i = 0 To rs.Fields.Count - 1 xlws.Cells(1, i + 1) = rs.Fields(i).Name Next i '.ClearContents .CopyFromRecordset rs End With On Error Resume Next rs.Close oconn.Close If Not rs Is Nothing Then Set rs = Nothing If Not oconn Is Nothing Then Set oconn = Nothing On Error GoTo 0 End Sub 

一种方法是通过将Dim xlw As New Excel.Workbook更改为语句Static xlw As Workbook Dim xlw As New Excel.Workbook Static xlw As Workbook (或使其成为模块级别的专用variables),使Workbookvariables成为静态。 然后检查xlw是否已经创build。

 Static xlw As Workbook Dim xlws As Worksheet If xlw Is Nothing Then 'New instance' Set xlw = Workbooks.Add Set xlws = xlw.ActiveSheet Else 'Workbook instance present' On Error Resume Next Set xlws = xlw.Worksheets.Add If Err.Number <> 0 Then 'The target of xlw no longer references a valid object.' Set xlw = Workbooks.Add Set xlws = xlw.ActiveSheet End If On Error GoTo 0 'Or your error handler' End If 
  • 如果您已经在Excel VBA中,则不需要使用New Excel.Application创build应用程序,也不需要使用Application或Excel的前缀。
  • 如果工作簿实例的目标不再有效(文件已closures),则会发生自动化错误。 为了处理这个问题,唯一的办法就是捕获错误并处理,从而进行On ErrorErr.Number检查。 在这种情况下,将创build一个新的工作簿。 (更改error handling以适合您的解决scheme)。
  • 正如R3uK提到的,一个更安全的解决scheme是自动保存文件,在打开的文件中查找,并在必要时打开它。