【问题标题】:Is there a way to get ADODB to work with Excel for Mac 2011?有没有办法让 ADODB 与 Excel for Mac 2011 一起使用?
【发布时间】:2025-12-20 23:15:06
【问题描述】:

我似乎无法让我的 Excel 工作簿(使用 ADODB)与 Excel Mac 2011 一起使用。我正在使用 ADODB 代码。有可用的加载项吗?甚至来自第三方?有人让这个工作吗?

【问题讨论】:

  • @Charles:我回滚了你对我的编辑所做的更改。请注意,excel-vba-mac 现在是一个有效的标签。
  • @Charles:我建议您重新阅读此内容。 “*.com/privileges/create-tags”我刚刚创建了那个标签,没有适用于 VBA EXCEL MAC 的标签。至少我搜索了它并找不到它。根据链接,给它6个月。如果它真的是一个坏标签,那么它将被自动删除。 ;)
  • >>> "在查看标签 wiki 后,此问题无需新标签,句号。"我不想失礼,但你错了,如果我同意你的观点,那么我们都错了。 Mac 的 Excel VBA 与 Windows 的 Excel VBA 不同。可能这就是为什么您通常拥有不同的 MAC 和 Windows 论坛的原因。我正在回滚更改,因为您只是固执。请不要强迫我向版主举报。
  • FWIW,在创建原始帖子时,我寻找了一个“Mac 上的 VBA”标签,但没有看到,我选择了标签“excel”和“excel-vba”和“osx”和认为这涵盖了所有基础。所以,我想我看到/看到了两种方式。 :)
  • 现在你有一个“Mac 上的 VBA”的专属标签 :) “osx”实际上是这个问题的错误标签。这就像用“Window 7”或“Vista”标记您的 Excel 问题:)

标签: excel vba macos ado


【解决方案1】:

ADODB 在 Mac Excel 2011 中不受支持,但 ODBC 可与第 3 方驱动程序结合使用。

我从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

【讨论】:

  • 这是正确答案; OpenLink 的驱动程序也可以使用,但它们只是更昂贵。该代码运行良好,是我的第一步;非常感谢!
【解决方案2】:

是否有可用的插件?甚至来自第三方?

希望这些下载链接有帮助吗?

ODBC drivers that are compatible with Excel for Mac


引用自 MSKB 以防链接失效

与 Excel for Mac 兼容的 ODBC 驱动程序

如果您想将数据从数据库导入 Excel for Mac,您需要在您的 Mac 上安装 Open Database Connectivity (ODBC) 驱动程序。您获得的驱动程序取决于您拥有的 Excel for Mac 版本。

Excel for Mac 2011

此版本的 Excel 不提供 ODBC 驱动程序。您必须自己安装。这些公司提供与 Excel for Mac 2011 兼容的驱动程序:

OpenLink Software

Actual Technologies

Simba Technologies

为您的源安装驱动程序后,您可以使用 Microsoft Query 创建新查询或刷新在 Excel X、Excel 2004 和 Excel for Windows 等其他版本的 Excel 中创建的现有查询。如需更多信息,请参阅Import data from a database in Excel for Mac 2011

Excel 2016 for Mac

此版本的 Excel 确实提供了用于连接到 SQL Server 数据库的 ODBC 驱动程序。在数据选项卡上,单击新建数据库查询 > SQL Server ODBC。然后使用对话框导入数据。

如果您要连接到其他 ODBC 数据源(例如 FileMaker Pro),则需要在 Mac 上为数据源安装 ODBC 驱动程序。这些公司提供与 Excel for Mac 兼容的驱动程序:

OpenLink Software

Actual Technologies

有人让这个工作吗?

对不起,我没用过。

【讨论】:

  • -1,链接不是答案。如果这些链接失效或服务器出现故障,您的答案将变得毫无用处。
  • 请参阅元问题Are answers that just contain links elsewhere really “good answers”?。是的,微软有停机时间。有时会停机,比如闰年 Azure 故障
  • 感谢您的链接。我将尝试一下,并将在接下来的 24-48 小时内发布我的结果。
  • 否,但您应该在链接之外的答案中添加一些价值。解释它们是什么,并从内容中提供概述或简短引述,这将有助于阅读本网站的人了解更多信息,而无需点击链接。
  • +1 表示愿意帮助他人。我不明白为什么不鼓励任何人以任何可能的方式提供帮助,无论是发布链接还是其他方式,尤其是考虑到没有其他人甚至试图回答这个问题的事实。
【解决方案3】:

让 Mac Excel 查询 MySQL 有 2 个部分:(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://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xllistobjectsourcetype?view=excel-pia

    'QueryTable.CommandType
        'https://docs.microsoft.com/en-us/office/vba/api/Excel.QueryTable.CommandType

    'QueryTable.BackgroundQuery
        'https://docs.microsoft.com/en-us/office/vba/api/excel.querytable.backgroundquery

    'QueryTable.RefreshStyle
        'https://docs.microsoft.com/en-us/office/vba/api/excel.xlcellinsertionmode

    'QueryTable.PreserveColumnInfo
        'https://*.com/a/28621172
        'https://docs.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 docs安装:

(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中成功Test,但在Excel的ODBC中将失败Test

根据this重定位驱动:

#!/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://*.com/a/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"

以上内容在 High Sierra 上使用 Excel 2016 进行了测试。

【讨论】:

    最近更新 更多