动态修改Excel数据表的数据来源

Excel有一个很有用的功能是直接导入外部数据库或者使用外部数据源建立数据透视表和数据透视图。但比较可惜的是,这个数据源的查询语句是静态的,它无法根据日期自动修改(比如在应用中,我们希望每天获取的外部数据都是当天最新的数据),下面两个函数是修改外部数据源的VBA代码,调用它们就可以建立动态的数据源。

' 更改数据表的来源
' wb:工作表对象
' connectionName:数据来源连接名称
' strSQL:新查询语句(修改SQL的查询代码)
' strSQLConnection:新连接语句(修改来源数据库,在对DBF数据库操作时非常有用)
' author: zhang@zhiqiang.org, 2010
Public Sub ChangeODBCConnection(wb As Excel.Workbook, connectionName As String, _
        Optional strSQL As String = "", Optional strSQLConnection As String = "")

    With wb.Connections(connectionName).ODBCConnection
        If Len(strSQLConnection) Then .CommandText = SplitString(strSQLConnection)
        If Len(strSQL) Then .Connection = SplitString(strSQL)
    End With
    wb.Connections(connectionName).Refresh
End Sub

' 更改数据表的来源
' pc:数据透视表的PivotCache对象 (例如:ActiveSheet.PivotTables(1).PivotCache)
' connectionName:数据来源连接名称
' strSQL:新查询语句(修改SQL的查询代码)
' strSQLConnection:新连接语句(修改来源数据库,在对DBF数据库操作时非常有用)
' author: zhang@zhiqiang.org, 2010
Public Sub ChangePivotConnection(pc As Excel.PivotCache, Optional strSQLConnect, _
        Optional strSQL As String = "")
    Dim blnODBCConnect As Boolean

    With pc
        If .QueryType = xlODBCQuery Then
            blnODBCConnect = True
            If Len(strSQLConnect) = 0 Then strSQLConnect = .Connection
            strSQLConnect = Replace(strSQLConnect, "ODBC;DSN", "OLEDB;DSN", 1, 1, vbTextCompare)
        End If

        If StrComp(.Connection, strSQLConnect, vbTextCompare) <> 0 And Len(strSQLConnect) Then
            .Connection = strSQLConnect
        End If

        If StrComp(.CommandText, strSQL, vbTextCompare) <> 0 And Len(strSQL) Then
            .CommandText = (strSQL)
        End If

        If blnODBCConnect = True Then
            .Connection = Replace(.Connection, "OLEDB;DSN", "ODBC;DSN", 1, 1, vbTextCompare)
        End If

        .Refresh
    End With
End Sub

' 将字符串分割成短字符串的数组
Private Function SplitString(ByVal s As String) As Variant
    Dim ss() As Variant
    Dim i As Long

    ReDim ss(0 To Len(s) \ 200) ' note: it is not 256
    For i = 0 To UBound(ss)
        ss(i) = Array(Mid(s, i * 200 + 1, 200))
    Next i

    SplitString = ss
End Function

以上代码在Office 2007版通过测试,其余版本未知。

  • VBA中的Date类型的匹配问题 VBA的Date类型比较奇怪。 测试: 1. 新建一个空白的Excel文档,在A1单元格输入2009-11-12。 2. 打开VBA编辑器,插入模块,增加下面这个宏 Sub test() MsgBo...
  • VB中后台打开Excel文件 某些时候需要打开Excel文件来获取或者写入数据,但又不希望跳出打开的Excel文件窗口,可以用下面的代码: Dim eb As New excel.Application, wb as excel.Workbo...
  • 为Excel自定义函数添加帮助信息 函数列表界面显示选中函数的说明信息 效果图: 实现方式: Application.MacroOptions(Macro:="UDFtest"...
  • 自动保存Outlook邮件的附件 在工作中定期或不定期会收到一些数据文件,然后要将它们的附件保存到自己的电脑上,下面演示如何让Outlook自动做这件事情。 首先,下面的SaveAttach...
  • VBA中引用WorkSheet的新方法 最近学到一招,效果不错~ 在写VBA中常需要引用某个WorkSheet对象,一般通过工作表名 Dim ws As Worksheet    Set ws = ThisWorkbook.Worksheets("Sheet2Name") 或...
  • 搞定乱码,WordPress搬家到dreamhost 两个月前一时冲动,花了大约80大洋买了一年的dreamhost主机。刚买的时候就试图把Blog搬到它上面去,不过由于数据库的乱码原因,一直没有成功。最近...
  • 数据库查询是NP-Hard问题 问题来自美人他爹和Wangjianshuo's blog 一个查询的例子:NOT (AND ((C1>5), OR ((C2<6),(C3<>9)))) 问题1:给出两个这样的查询Q1和Q2,如何确定Q1的结果是...
  • 加速blog:监测和优化WordPress数据库 在WordPress生成页面时,最消耗时间的便是数据库查询了。 监测WordPress的数据库查询 WordPress内置了数据库缓存系统,安装插件WordPress Cache Inspect,它会...
  • Outlook中实现Gmail中的存档功能 时间管理中有重要的一条,保持你的收件箱整洁、干净。Gmail一个重要的创新就是Archive(存档),选中邮件后点下“archive”按钮或者按一下快捷键y,...
  • At 2010.01.19 15:04, sunmoon88 said:

    好东西。有空了试一下。。谢谢楼主

    (Required)
    (Required, not published)

      B | I | U | D | 添加链接 | 插入引用 | 插入代码 | 插入表情 | | + | ?
    guest | 注册 | BBS | 管理 | English | 繁體 | https

    阅微堂

    zhiqiang's personal blog
    Loading...
    Loading...
    Loading...