【问题标题】:Oracle SQL to Excel using VBA -Dumb data in different worksheet in the same workbookOracle SQL to Excel 使用 VBA - 同一工作簿中不同工作表中的哑数据
【发布时间】:2015-05-04 12:34:56
【问题描述】:

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

下次我再次使用命令按钮打开此 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

【问题讨论】:

  • 目前,您不会自动保存文件,因此当您重复使用按钮时,很难再次保留文件。 要添加的两个主要内容将文件保存在已知位置+名称,添加工作表(使用代码将其设置为非常隐藏)以保存参数:-boolean 如果文件已经创建(在您的代码中添加 if 以创建工作簿或添加工作表),文件名和位置,也许还有其他东西......有了它,您应该能够提出要求!跨度>
  • 我可以按照您所说的那样保存文件,这是一个安全的选项和正确的解决方案,但是我真的不确定使用此工具的这些 ppl 将具有保存权限的驱动器。所以我让这个选项保持打开状态。

标签: oracle vba excel


【解决方案1】:

一种方法是通过将 Dim xlw As New Excel.Workbook 更改为语句 Static xlw As Workbook (或使其成为模块级私有变量)来使 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 创建应用程序或使用 Application 或 Excel 前缀。
  • 如果工作簿实例的目标不再有效(文件已关闭),将出现自动化错误。要处理这个问题,唯一的选择是捕获错误并处理它,因此需要On ErrorErr.Number 检查。在这种情况下,将创建一个新的工作簿。 (更改错误处理以适合您的解决方案)。
  • 正如 R3uK 所述,更安全的解决方案是自动保存文件,在打开的文件中查找它,并在必要时打开它。

【讨论】:

  • 感谢您的回复!我一定会试试这个并告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多