有没有一种方法可以让ADODB在Excel for Mac 2011中工作?

7

我似乎无法使用ADODB代码使我的Excel工作簿与Excel Mac 2011配合使用。是否有可用的插件,即使是第三方的?有没有人使这个工作了?


@SiddharthRout,如果这确实是一个有效的标签,请找到其他可以应用它的问题。现在,它只适用于这个问题,这使它成为一个不好的标签。它涵盖了已经被现有标签充分覆盖的领域。 - Charles
1
@Charles:我建议您重新阅读一下这个链接:“http://stackoverflow.com/privileges/create-tags”。我刚刚创建了那个标签,但是没有一个标签适用于VBA EXCEL MAC。至少我搜索了一下也没找到。根据链接所说,给它6个月的时间。如果它真的是一个不好的标签,那么它将会被自动删除。 ;) - Siddharth Rout
1
经过对标签维基的审查,这个问题不需要新的标签,就这样。我不想不礼貌,但你是错的,如果我同意你,那我们两个都会错。Excel VBA for MAC与Excel VBA for Windows不同。也许这就是为什么通常会有不同的MAC和Windows论坛的原因。我正在撤销更改,因为你太固执了。请不要强迫我向管理员举报此事。 - Siddharth Rout
1
就我的经验而言,在创建原始帖子时,我搜索了“Mac上的VBA”标签,没有找到,所以我选择打上“excel”、“excel-vba”和“osx”的标签,并认为这已经覆盖了所有基础。所以,我想我当时两种方式都看到/看明白了 :) - n8gard
1
现在您有一个专门用于“Mac上的VBA”的标签 :) “osx”实际上是这个问题的错误标签。这就像使用“Window 7”或“Vista”标记您的Excel问题一样 :) - Siddharth Rout
显示剩余3条评论
3个回答

5

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

这是正确的答案;OpenLink的驱动程序也可以工作,但它们只是更昂贵。代码完美地运行并作为我的第一步;非常感谢! - Pbal

3

是否有可用的插件?即使是第三方的?

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

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


如果链接失效,请参考MSKB中的引用

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

如果您想从数据库导入数据到Excel for Mac中,您需要在Mac上安装一个开放式数据库连接(ODBC)驱动程序。您获得的驱动程序取决于您使用的Excel for Mac版本。

Excel for Mac 2011

此版本的Excel不提供ODBC驱动程序。您必须自行安装。与Excel for Mac 2011兼容的驱动程序可从以下公司获得:

OpenLink Software

Actual Technologies

Simba Technologies

安装源驱动程序后,您可以使用Microsoft Query创建新查询或刷新在其他版本的Excel中创建的现有查询,例如Excel X、Excel 2004和Excel for Windows。有关更多信息,请参见在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

实际技术

有人使它工作了吗?

很抱歉,我从未使用过它。


2
-1,链接不是答案。如果那些链接失效或服务器宕机,您的答案就变得毫无用处。 - Charles
1
请查看元问题回答只包含其他地方的链接真的是“好答案”吗?。是的,微软也会有停机时间。有时候是大规模停机,比如闰年Azure故障。 - Charles
1
不,但你应该在回答中添加一些价值,而不仅仅是链接。解释它们是什么,并给出概述或小引用,这将有助于阅读本网站的人更好地理解,而无需跟随链接。 - Charles
5
对于你倾向于帮助他人的态度表示赞赏。我不明白为什么任何人都应该被阻止以任何可能的方式进行帮助,无论是发布链接还是其他方式,特别是考虑到没有其他人尝试回答这个问题的事实。 - Pradeep Kumar
B5Fan74的结果是什么? - HaveAGuess
显示剩余3条评论

1

要让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中将无法测试

根据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://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"

以上内容在 High Sierra 操作系统和 Excel 2016 上进行了测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接