【问题标题】:Using ADODB to write to Excel file使用 ADODB 写入 Excel 文件
【发布时间】:2020-06-24 03:58:02
【问题描述】:

我希望有人可以使用 ADODB 方法给我一些指导以实现我的目标。

简要说明:

目前我在 Outlook VBA 中有搜索电子邮件的代码。如果电子邮件通过条件 Outlook 宏打开 Excel 工作簿,循环通过列 A 以查看是否存在 ID 号。如果是,它会更新其他列(1 或更多列),如果不是,它会创建一个新行并将数据写入该行的 A-C 列。然后保存并关闭工作簿。

我想加快进程,限制因素是打开 excel 工作簿(位于共享驱动器上)。我使用了一个简单的 ADODB 宏来读取另一个工作簿中的数据,并且已经看到了可能的速度提高。我想在这里实现。

我已经能够从 Outlook 建立到工作簿的连接并将数据放入记录集中。但我不知道如何“循环”第一列以查看 ID 是否存在,以及如何将数据写入工作簿中的列(UPDATE SQL 命令?)。

Excel连接代码:

Public Sub ExcelConnect(msg As Outlook.MailItem, LType As String)

    Dim lngrow As Long
    Dim SourceFile As Variant   'used
    Dim SourceSheet As String   'used
    Dim SourceRange As String   'used

    SourceFile = "T:\Capstone Proj\TimeStampsOnlyTest.xlsx"
    SourceSheet = "Timestamps"
    SourceRange = "A2:F500"



    Dim rsCon As Object     'used
    Dim rsData As Object    'used
    Dim szConnect As String ' used
    Dim szSQL As String     ' used
    Dim lCount As Long

    If Val(Application.Version) < 12 Then
        szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & SourceFile & ";" & _
                        "Extended Properties=""Excel 8.0;HDR=Yes"";"
        Else
            szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source=" & SourceFile & ";" & _
                        "Extended Properties=""Excel 12.0;HDR=Yes"";"
        End If

        szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "];"

        Set rsCon = CreateObject("ADODB.Connection")
        Set rsData = CreateObject("ADODB.Recordset")

        rsCon.Open szConnect
        rsData.Open szSQL, rsCon, 0, 1, 1

    '***Need Help implementing a way to find exisiting ID numbers, or if Exisiting = 0 then INSERT new row into worksheet***'

    Select Case LType '// Choose which columns based on Type
    Case "MDIQE"
    '        If columnvalue = 0 Then
    '        Update column value
    Case "MDIQ"
    '        If columnvalue = 0 Then
    '        Update column value
    '        
    '........
    '
    Case "MDIF"
    '        If columnvalue = 0 Then
    '        Update column value
    '        
    End Select

'Error handing & success messagebox

End sub

感谢您的帮助, 瓦格纳

【问题讨论】:

    标签: excel vba outlook adodb


    【解决方案1】:

    在您的 SELECT 语句中,包含一个 WHERE 子句以在 A 列中搜索 ID,如下所示:

    SELECT COUNT(*) c
      FROM [sourceSheet$sourceRange]
     WHERE <ColumnAName> = <ID>
    

    注意,这是伪代码,您必须像将字符串分配给 szSQL

    一样正确组合语句

    然后检查您的结果集是否有 c 的值,如下所示:

    If rsData.Fields("c").value = 0 Then
      'ID was NOT found, execute SQL INSERT here
    Else
      'ID was found, execute SQL UPDATE here
    End If
    

    即,将您的 Excel 工作表视为数据库。

    当然,如果您可以将 Access 用作数据库(或 SQL Server、Oracle 或 ...)会更好,因为这就是它们的设计目的。但我明白,有时你只能顺其自然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多