2015-05-04 63 views
0

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

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

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 
+0

目前,您不会自动保存文件,因此当您重复使用按钮时,很难在文件上再次进行保留。 ** 2要添加的主要内容**: **将文件**保存在已知位置+名称中, **添加工作表**(将其设置为非常隐藏,并带有代码)以保存参数: -boolean if该文件已创建(如果在您的代码中添加了创建工作簿或添加工作表), 带位置的文件名,或许还有其他东西... 因此,您应该可以提出问题! – R3uK

+1

我可以保存文件,如你所说,这是一个安全的选项和正确的解决方案,但我真的不知道哪些驱动器这些工具将使用这个工具将保存权限。所以我已经打开了这个选项。 –

回答

1

一种方法是使通过改变Dim xlw As New Excel.Workbook的声明Static xlw As Workbook工作簿静态变量(或使其成为一个模块级私有变量)。然后检查xlw是否已经创建。

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创建应用程序或使用应用程序或Excel的前缀。
  • 如果工作簿实例的目标不再有效(文件已关闭),则会发生自动化错误。要处理此问题,唯一的选择是捕获错误并处理它,因此检查On ErrorErr.Number。在这种情况下,将创建一个新的工作簿。 (更改错误处理以适应您的解决方案)。
  • 正如R3uK提到的,更安全的解决方案是自动保存文件,在打开的文件中查找它,并在必要时打开它。
+0

谢谢你的回应!我一定会尝试这个,让你知道。 –

+0

这工作。非常感谢。 –

相关问题