excel 2000作為一個電子表格軟件,它不僅有強大的數據處理能力,而且它的報表功能也是十分強大。因而常常用excel 2000去調用access、sql server、oracle、db2等數據庫軟件建立的大型數據庫的內容。用戶可以在工作表中對這些數據進行篩選、排序、查詢、編輯和打印報表,十分方便,這也是大多數人都熟悉的。但如何去調用這數據呢?本人在這里提供4種方法。
    下面四種方法必須要先創建一個數據源,我們以sql server7.0內的樣本數據庫pubs為例。在控制面板/odbc數據源/系統dsn,單擊增加按紐,選取sql server驅動程序,建立一個與pubs數據庫連接的叫pubs名稱數據源。
           方法一:
    在excel 2000中,選擇 數據/獲取外部數據/新建數據庫查詢,然后按向導的提示一步一步做,最后將數據返回excel 2000中就行了
    這種方法是大家常用的,也是最方便的。但這種方法只能對遠程數據進行查詢,不能對遠程數據進行增加和修改。
    方法二:
    這種方法需要vba編程(方法三、方法四也一樣),在visual basic編程中,我們經常用ado來訪問數據。ado是microsoft提供的針對各種各樣數據源的新型高級編程接口。它支持大多數據庫操作,在excel 2000中應用ado來訪問數據,是十分理想的方法。看看下面一個實例:
    sub opendb()
    dim cn as adodb.connection
    dim rs as adodb.recordset
    set cn = new adodb.connection
    set rs = new adodb.recordset
    cn.open "provider=msdasql.1;persist security info=false;data source=pubs"
    rs.open "select * from authors", cn
     range("a1").copyfromrecordset rs
     rs.close
    cn.close
    end sub
    宏中第一、二句定義了一個ado 的connection對象和一個recordset對象,第三、四句創建了一個ado 的connection對象和一個recordset對象。第五句連接到前面我們建立的數據源pubs數據庫。第六句是ado 的recordset對象執行一條sql里select語句。在這也可以執行insert,update等等sql語句的。第七句是將rs里的記錄返回當前表里。第八、九句是關閉連接。運行前要在excel 2000工具/引用中引用ado的庫文件。
           在excel 2000中應用ado對象,不僅可以對數據庫進行查詢,而且可以作增加,修改數據庫的記錄,甚至可以調用sql server7.0的存儲過程,加強excel 2000對數據庫處理能力。
    方法三:
    excel 2000的功能是十分強大的,它自帶了一個odbc加載宏,我們在excel 2000中引用這個宏文件xlodbc.xla,就可以通過下面的方法去訪問我們建立的數據源了
    sub opendb()
        dim id as integer
        id = sqlopen(“dsn=pubs”)
        sqlexecquery id, “select * from authors”
        set output = worksheets("sheet1").range("a1")
        sqlretrieve id, output, , ,
        true sqlclose id        
    end sub
    第二句是調用xlodbc.xla宏中的sqlopen函數建立一個對數據庫pubs連接,第三句是sqlexecquery函數執行了一條select語句,id是由 sqlopen 函數返回的唯一連接標識,第四句是sqlretrieve函數將sqlexecquery函數執行的查詢的結果返回到excel 2000中。
           這種編程方法可以說來的容易,用得方便。也是一種好的訪問遠程數據方法。
    方法四:
    這種方法是使用api方法,下面是一個實例
        '分配環境句柄
    res = sqlallochandle(sql_handle_env, sql_null_henv, henv)  
    '設置環境屬性
        res = sqlsetenvattr(henv, sql_attr_odbc_version, sql_ov_odbc3, 0)
        '分配數據庫連接句柄
        res = sqlallochandle(sql_handle_dbc, henv, hsvr) 
    '連接到數據源
    sconnect=“dsn=pubs;database=pubs“
    res=sqldriverconnect(hsvr,byval,0&,sconnect,len(sconnect),sconnout, len(sconnout), _ nconnoutlen, 0)
    ssql =“select * from authors“
    res = sqlexecdirect(hsel, ssql, len(ssql))
    '將記錄返回當前表里
    res=sqlnumresultcols(hsel, nc)
    do while (sqlfetch(hsel) <> sql_no_data_found)
    j=j+1
    for i=1 to nc
       res = sqlgetdata(hsel, i, sql_c_char, tmp, 512, pl)
       cells(j, i) =tmp
    next i
    loop
    '釋放數據庫連接句柄
          res = sqlallochandle(sql_handle_stmt, hsvr, hsel)
    '釋放數據庫連接句柄
          ret = sqlfreehandle(sql_handle_env, henv)
    這種方法比較復雜,調試也比較困難,但運行速度快,在進行大量查詢數據和自己在api調用方面比較熟時,可以用這個方法。在用上面的實例時,要做api聲明和常量的定義。