使用ADODB写入Excel文件

时间:2018-09-27 16:34:51

标签: excel vba excel-vba outlook-vba adodb

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

简要说明:

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

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

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

ExcelConnection代码:

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

感谢您的帮助, 瓦格纳

1 个答案:

答案 0 :(得分:0)

在您的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或...),那会更好,因为那正是他们的目的。但我知道有时候您只需要了解自己所拥有的东西即可。