Excel VBA 連接各種數據庫(一) VBA連接MySQL數據庫


本文參考【東圍居士】的cnblog博文  Excel、VBA與MySQL交互  在自己機器上調試成功,把調試中遇到的問題一並寫出了。

本文主要涉及:

  1. VBA中的MySQL環境配置
  2. VBA連接MySQL數據庫
  3. VBA讀寫MySQL數據
  4. 在Excel中連接MySQL數據庫及數據讀寫
  5. (2019.11.07更新)常見問題答疑
  6. (2019.11.11更新)常見問題答疑

系統環境:

  • Windows 7 64bit
  • Excel 2016 32bit
  • WAMP(3.0.6 32bit)集成的MySQL版本為5.7.14
  • (2019.08.02更新) 本文章在windows10 企業版 64bit下測試通過

1. VBA連接MySQL前的環境配置

如果想連接本地數據庫,必須先安裝MySQL服務。可以選擇使用官方安裝包,或者使用PHP集成環境中的數據庫都可以(windows平台上的有wamp或者phpstudy)。

我這里使用的是內網其他電腦上的MySQL數據庫,這就需要在數據庫里開啟遠程訪問。

1.1 啟用MySQL的局域網訪問

想讓局域網中的所有機器都能連接MySQL數據庫,首先要給MySQL開啟遠程連接的功能,在MySQL服務器控制台上執行MySQL命令:

1 grant all privileges on *.* to root@"%" identified by 'abc' with grant option;  
2 flush privileges;

其中上面兩行代碼的意思是給從任意ip地址連接的用戶名為root,密碼為abc的用戶賦予所有的權限。其中的"%"為任意的ip地址,如果想設為特定的值也可以設定為特定的值(以通配符%的內容增加主機/IP地址,也可以直接增加IP地址)

例如:

1 grant all privileges on *.* to root@"192.168.1.1" identified by 'abc' with grant option;  
2 flush privileges;

這里就是指 192.168.1.1這個IP的機器可以使用 root /abc 這個賬戶遠程訪問MySQL數據庫

PS:數據連接工具推薦使用Navicat,可以同時連接不同的數據庫,非常方便。

我常用的是11.0.16版本   下載地址   提取碼: s5kt

1.2 啟用腳本支持

數據庫配置好之后,在Excel這邊,需要先在VBE中啟動數據庫連接支持。按下Alt+F11打開VBE,在菜單欄選擇“工具”-“引用”,在彈出的引用窗口中,找到"Microsoft ActiveX Data Objects 6.1 Library"和"Microsoft ActiveX Data Objects Recordset 2.8 Library",把前面的框勾選上,點擊確定即可。 (如果不是這兩個版本,則選擇一個版本號最高的勾選即可)

1.3 安裝MySQLODBC 連接服務

下載地址:Download Connector/ODBC

選擇操作系統及系統版本,下載對應的MSI文件安裝即可。
這里應當注意的是,在下載安裝ODBC連接器時,要選擇和你的數據庫系統相同位數的版本,而不是系統版本,否則安裝完后依然會提示找不到數據庫驅動。
注意:在64bit的系統上裝的32bit的connector,裝完后在ODBC數據源里看不到MySQL Driver,這時需要把64位的也裝上才能看到MySQL Driver

但是!如果在64bit的系統上安裝64bit的connector,數據庫版本32bit,雖然可以看到ODBC的數據源了,但是在excel中連接還是提示找不到驅動,這時裝上32bit的connector才成功

所以說 數據庫、操作系統、連接工具這些統一用一種位數的多么重要。。。

PS:如果安裝的時候報錯,你可能需要安裝 VC++ 2015 Redistributable     微軟官方下載地址  選擇對應自己安裝的ODBC連接器版本的下載即可

1.4 添加ODBC數據源

打開“控制面板”-“管理工具”-“ODBC 數據源”

在彈出的窗口中的“用戶DSN”選項卡右側,選擇“添加”,在新數據庫源中會出現兩個MySQL驅動,分別為“MySQL ODBC 8.0 ANSI Driver”及"MySQL ODBC 8.0 Unicode Driver",

很明顯兩者的區別在於編碼標准。我選擇的是Unicode版本。選中其中一個,點完成即可。

點擊完成后彈出配置界面,關於界面的說明如下:

Data Source Name: 連接名稱,會顯示在之前的“ODBC數據源管理器“的列表中;

TCP/IP Server: 服務器地址,如果是內網/外網,需要填寫對應的IP地址。如果是本機則填寫 127.0.0.1;

User: 登錄用戶名,這里如同我在1.1中設置的,填寫 root;

Password: 登錄密碼,這里如同我在1.1中設置的,填寫 abc;

Database:這里需要選擇 數據庫(一個服務器上可能有多個數據庫),根據自己的需要選擇一個就可以。

填寫完畢后,推薦點擊【test】按鈕測試一下連接是否正常,如果有問題的話,需要重新檢查一下1.1中的局域網訪問設置,如果是本地服務器的話,可能是數據庫未啟動。

1.2和1.3的配置順序可以隨意,但1.4必須在1.3之后,否則在ODBC數據源中添加新數據源時,是找不到MySQL選項的。


2. VBA連接MySQL

在按照上述步驟配置了環境支持后,就可以在VBA中使用代碼連接MySQL了。

首先需定義連接對象:

Dim conn as ADODB.Connection
Set conn = new ADODB.Connection

這里也可以簡寫為:

Dim con As New ADODB.Connection

連接數據庫

conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1 139;DB=test;UID=root;PWD=abc;OPTION=3;"
conn.Open

連接字符串ConnectionString中的各個參數應該很明了,就不一一解釋了。最后一個OPTION,按MySQL官方的說法是用於指定ODBC Connector的工作方式的,但是在他們官方文檔中並沒有找到有哪個選項是的值對應是3的。所以這里只有照寫了。

上一段代碼也可以簡寫為

con.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.139;DB=test;UID=root;PWD=abc;OPTION=3;"

這里注意,Driver變量的值是必須要和數據源中添加的新數據源一致的,否則會提示找不到數據源。

至此,數據庫連接成功!

可以使用連接對象的State屬性和Version屬性查看數據庫狀態和版本(檢查是否連接成功)

MsgBox("連接成功!" & vbCrLf & "數據庫狀態:" & con.State & vbCrLf & "數據庫版本:" & con.Version)

最后關閉數據庫連接

con.Close
Set con = Nothing

整個過程的完整代碼如下:

Sub 連接MySQL數據庫()
'1. 引用ADO工具
'2. 創建連接對象
Dim con As New ADODB.Connection
'3. 建立數據庫的連接
con.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.139;DB=test;UID=root;PWD=abc;OPTION=3;"
con.Open
MsgBox ("連接成功!" & vbCrLf & "數據庫狀態:" & con.State & vbCrLf & "數據庫版本:" & con.Version)
con.Close
Set con = Nothing
End Sub

 


3. VBA讀寫MySQL數據表

3.1 讀取MySQL數據到Excel

代碼如下:

Sub linkMySQL()
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
'配置連接串
    conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.139;DB=test;UID=root;PWD=abc;OPTION=3;"
    conn.Open
'從test數據庫的YGXM表中取出所有數據
    rs.Open "select * from `YGXM`", conn
'設置表頭
    Range("A1:B1").Value = Array("ID", "Name")
'將數據輸出到工作表
    Range("A2").CopyFromRecordset rs
'關閉連接
    rs.Close: Set rs = Nothing
    conn.Close: Set conn = Nothing
End Sub

相比前面的代碼,以上代碼多了 ADODB.Recordset 和 rs.Open,ADODB.Recordset 用於執行SQL語句並接收查詢語句返回的結果集。

這里需要提一下的是,在VBA中執行SQL語句有兩種方式,其一是使用連接對象執行: conn.Execute ,其第一個參數就是SQL語句;另一種則使用結果集對象執行: rs.Open ,這種方式有兩個必要參數,分別是SQL語句和連接對象,如上例中的 rs.Open "select * from `test`", conn 。

接下來的兩行Range是用於把查詢結果復制到Excel表格中的。

3.2 寫入數據到MySQL

其實寫入數據,只需要把上例中的SQL語句改成 UPDATE 或者 INSERT 即可,就不多說了。


4. 在Excel中直接操作MySQL

MySQL推出了一個Excel插件,用於直接在Excel操作MySQL數據庫。

首先需要下載:Download MySQL for Excel

下載完運行安裝即可。

然后打開(重啟)Excel,打開時可能會詢問是否添加該插件。打開后,在菜單欄點開“數據”,即可在右側看到有個MySQL for Excel的東西。點開它,就會出現本地的MySQL數據庫。

MySQL for Excel

試用了一下,還算方便

 

工具推薦: VBA自動排版工具   提取碼: qjsq   安裝之后,右鍵選擇“智能排版”——》“工程智能排版” 即可

 


5. 常見問題答疑

 

Q1:我在測試的時候,運行到打開數據庫連接這一行,報自動化錯誤,這是怎么回事?如下圖

方法:同時安裝32bit和64bit的ODBC驅動

A1:這是由於ODBC數據源的問題,經過我測試,當系統64bit/excel64bit時,如果裝的odbc數據源為32bit版,就會報錯,此時安裝一個64bit版odbc驅動並設置,即可解決問題。

     PS:我發現安裝完32bit和64bit驅動后,貌似把設置好的odbc驅動刪掉仍然可以正常連接。。。太迷了

 

 

Q2:我在測試時,運行到打開數據庫連接這一行,報系統錯誤,這是啥情況?如下圖

方法:檢查服務器IP地址是否寫對

A2:這可能是由於數據庫IP地址設置錯誤導致,假如你的數據庫是在本地上的,那么在連接串中不需要輸入自己機器的IP地址,而是需要輸入127.0.0.1或者localhost

如下例所示:

 Cnstring = "Driver={MySQL ODBC 8.0 Unicode Driver};server=127.0.0.1;db=zhixiao_acct;uid=root;pwd=;option=3" 

或者

 Cnstring = "Driver={MySQL ODBC 8.0 Unicode Driver};server=localhost;db=zhixiao_acct;uid=root;pwd=;option=3" 

特別注意:

這種失誤也有可能報如Q1所說的自動化錯誤,屆時可按A1所說方法處理試試。

 

 

 

Q3:我已經按你說的設置好了一切 ,但是運行到打開數據庫連接這一行,還是報自動化錯誤,這是啥情況?

 

方法:檢查數據庫是否需要設置端口號

 

A3:這可能是由於數據庫只開放了指定端口導致,假如你的數據庫還需要設置段口號,那么在連接串中需要還需要增加 port=XXXX

 

如下例所示:

 

 Cnstring = "Driver={MySQL ODBC 8.0 Unicode Driver};server=127.0.0.1;port=3306;db=zhixiao_acct;uid=root;pwd=;option=3" 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM