我似乎无法使用ADODB代码使我的Excel工作簿与Excel Mac 2011配合使用。是否有可用的插件,即使是第三方的?有没有人使这个工作了?
我似乎无法使用ADODB代码使我的Excel工作簿与Excel Mac 2011配合使用。是否有可用的插件,即使是第三方的?有没有人使这个工作了?
ADODB在Mac Excel 2011中不受支持,但ODBC可与第三方驱动程序配合使用。
我从ActualTech获取了我的ODBC驱动程序。下载并安装他们的程序,您将拥有连接到SQL服务器和数据库所需的驱动程序(免费试用,35美元购买)。
以下代码创建到mySQL数据库的连接,并将数据库中的信息返回到单元格A1:
Dim connstring as String
Dim sqlstring as String
connstring = "ODBC;DRIVER={Actual Open Source Databases};" _
& "SERVER=<server_location>;DATABASE=<database>;" _
& "UID=<userID>;PWD=<password>;Port=3306"
sqlstring = "select * from <database_table>"
With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstring)
.BackgroundQuery = False
.Refresh
End With
是否有可用的插件?即使是第三方的?
希望这些下载链接有所帮助?
如果链接失效,请参考MSKB中的引用
与Excel for Mac兼容的ODBC驱动程序
如果您想从数据库导入数据到Excel for Mac中,您需要在Mac上安装一个开放式数据库连接(ODBC)驱动程序。您获得的驱动程序取决于您使用的Excel for Mac版本。
Excel for Mac 2011
此版本的Excel不提供ODBC驱动程序。您必须自行安装。与Excel for Mac 2011兼容的驱动程序可从以下公司获得:
安装源驱动程序后,您可以使用Microsoft Query创建新查询或刷新在其他版本的Excel中创建的现有查询,例如Excel X、Excel 2004和Excel for Windows。有关更多信息,请参见在Excel for Mac 2011中从数据库导入数据。有人使它工作了吗?
很抱歉,我从未使用过它。
要让Mac Excel查询MySQL,需要两个部分:(1)VBA和(2)ODBC驱动程序。
(1) 用VBA创建表格并通过新的查询更新它:
Option Explicit
Sub WaitQueryTableRefresh(ByVal qt As QueryTable)
While qt.Refreshing
Application.Wait (Now + TimeValue("0:00:01"))
Wend
End Sub
Sub ErrorIfQueryTableOverflowed(ByVal qt As QueryTable)
If qt.FetchedRowOverflow Then
err.Raise 5, "ErrorIfQueryTableOverflowed", _
"QueryTable '" & qt.ListObject.Name & "' returned more rows than can fit in the spreadsheet range"
End If
End Sub
' Create a table from scratch
Function CreateTableFromSql( _
ByVal table_sheet As Worksheet, _
ByVal table_range As Range, _
ByVal table_name As String, _
ByVal sql As String _
) As ListObject
' table_range is simply the top-left, corner cell for the table
'ListObject.SourceType
'https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xllistobjectsourcetype?view=excel-pia
'QueryTable.CommandType
'https://learn.microsoft.com/en-us/office/vba/api/Excel.QueryTable.CommandType
'QueryTable.BackgroundQuery
'https://learn.microsoft.com/en-us/office/vba/api/excel.querytable.backgroundquery
'QueryTable.RefreshStyle
'https://learn.microsoft.com/en-us/office/vba/api/excel.xlcellinsertionmode
'QueryTable.PreserveColumnInfo
'https://dev59.com/7Ijca4cB1Zd3GeqPrAoC#28621172
'https://learn.microsoft.com/en-us/office/vba/api/Excel.QueryTable.PreserveColumnInfo
Dim global_odbc_str As String
global_odbc_str = "ODBC;DSN=my_dsn_name;"
Dim qt As QueryTable
Set qt = table_sheet.ListObjects.Add( _
SourceType:=xlSrcExternal, _
Source:=global_odbc_str, _
Destination:=table_range _
).QueryTable
With qt
.ListObject.Name = table_name
.ListObject.DisplayName = table_name
.CommandText = sql
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.Refresh BackgroundQuery:=False
End With
Call WaitQueryTableRefresh(qt)
Call ErrorIfQueryTableOverflowed(qt)
Set CreateTableFromSql = qt.ListObject
End Function
' Update a table (columns do not have to be the same)
Sub UpdateTableFromSql( _
ByVal table As ListObject, _
ByVal sql As String _
)
Dim qt As QueryTable
Set qt = table.QueryTable
qt.CommandText = sql
qt.Refresh BackgroundQuery:=False
Call WaitQueryTableRefresh(qt)
Call ErrorIfQueryTableOverflowed(qt)
End Sub
(2) 配置MySQL ODBC驱动程序(免费)
按照MySQL文档安装:
(a) 安装(依赖项)iODBC管理器:http://www.iodbc.org/dataspace/doc/iodbc/wiki/iodbcWiki/Downloads
(b) 安装MySQL ODBC驱动程序:https://dev.mysql.com/downloads/connector/odbc/
(c) Mac要求所有应用程序(包括Excel)都被隔离到沙盒中。因此,您需要将MySQL驱动程序重新定位到Excel可以访问的位置。未能这样做的症状是DSN连接在iODBC中将测试
成功,但在Excel的ODBC中将无法测试
。
#!/bin/bash
# https://github.com/openlink/iODBC/issues/29
# https://bugs.mysql.com/bug.php?id=89931
base_src_dir="/usr/local"
mysql_odbc_name=$(ls "$base_src_dir" | grep -m 1 "mysql-connector-odbc")
odbc_dir="/Library/ODBC"
src="$base_src_dir/$mysql_odbc_name/lib"
dst="$odbc_dir/$mysql_odbc_name/lib"
echo "creating '$dst'"
sudo mkdir -p "$dst"
echo "copying '$src' to '$dst'"
sudo cp -af "$src/." "$dst"
odbc_ini_path="$odbc_dir/odbc.ini"
odbc_ini_bak_path="$odbc_ini_path.bak"
odbcinst_ini_path="$odbc_dir/odbcinst.ini"
odbcinst_ini_bak_path="$odbcinst_ini_path.bak"
echo "backing up '$odbc_ini_path' to '$odbc_ini_bak_path'"
sudo cp -f "$odbc_ini_path" "$odbc_ini_bak_path"
echo "backing up '$odbcinst_ini_path' to '$odbcinst_ini_bak_path'"
sudo cp -f "$odbcinst_ini_path" "$odbcinst_ini_bak_path"
# https://dev59.com/ul0b5IYBdhLWcg3wGN0s#29626460
function replace {
sudo sed -i '' "s/$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$1")/$(sed 's/[&/\]/\\&/g' <<< "$2")/g" "$3"
}
ansi_driver=$(ls "$dst" | grep -m 1 "^lib.*a\.so$")
unicode_driver=$(ls "$dst" | grep -m 1 "^lib.*w\.so$")
old_ansi_path="$src/$ansi_driver"
new_ansi_path="$dst/$ansi_driver"
old_unicode_path="$src/$unicode_driver"
new_unicode_path="$dst/$unicode_driver"
echo "updating '$old_ansi_path' to '$new_ansi_path' in '$odbc_ini_path'"
replace "$old_ansi_path" "$new_ansi_path" "$odbc_ini_path"
echo "updating '$old_ansi_path' to '$new_ansi_path' in '$odbcinst_ini_path'"
replace "$old_ansi_path" "$new_ansi_path" "$odbcinst_ini_path"
echo "updating '$old_unicode_path' to '$new_unicode_path' in '$odbc_ini_path'"
replace "$old_unicode_path" "$new_unicode_path" "$odbc_ini_path"
echo "updating '$old_unicode_path' to '$new_unicode_path' in '$odbcinst_ini_path'"
replace "$old_unicode_path" "$new_unicode_path" "$odbcinst_ini_path"