有没有办法让ADODB使用Mac 2011版的Excel?

有没有办法让ADODB使用Mac 2011版的Excel?,excel,vba,macos,ado,Excel,Vba,Macos,Ado,我似乎无法使我的Excel工作簿(使用ADODB)与Excel Mac 2011一起工作。我正在使用ADODB代码。是否有可用的加载项?甚至来自第三方?有人用过这个吗 是否有可用的加载项?甚至来自第三方 希望这些下载链接有帮助 从MSKB中引用,以防链接失效 与Excel for Mac兼容的ODBC驱动程序 如果要从数据库将数据导入Excel for Mac,则需要在Mac上安装开放式数据库连接(ODBC)驱动程序。您获得的驱动程序取决于您使用的Excel for Mac的版本 Excel

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

是否有可用的加载项?甚至来自第三方

希望这些下载链接有帮助


从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 2016 for Mac

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

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

有人用过这个吗


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

Mac Excel 2011不支持ADODB,但ODBC与第三方驱动程序配合使用

我的ODBC驱动程序来自。下载并安装他们的程序,您将拥有连接SQL Server和数据库所需的驱动程序(免费试用,购买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
将字符串设置为字符串
将sqlstring设置为字符串
connstring=“ODBC;驱动程序={实际的开源数据库};”_
&“服务器=;数据库=;”_
&“UID=;PWD=;端口=3306”
sqlstring=“选择*自”
使用ActiveSheet.QueryTables.Add(连接:=connstring,目标:=Range(“A1”),Sql:=sqlstring)
.BackgroundQuery=False
刷新
以

让Mac Excel查询MySQL有两个步骤:(1)VBA和(2)ODBC驱动程序


(1)用于从查询创建表(并使用新查询更新表)的VBA:


(2)配置MySQL ODBC驱动程序(免费)

安装依据:

(a)安装(依赖项)iODBC管理员:

(b)安装MySQL 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-m1“mysql连接器odbc”)
odbc_dir=“/Library/odbc”
src=“$base\u src\u dir/$mysql\u odbc\u name/lib”
dst=“$odbc_dir/$mysql_odbc_name/lib”
回显“正在创建“$dst”
sudo mkdir-p“$dst”
回显“将“$src”复制到“$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“将“$odbc\u ini\u path”备份到“$odbc\u ini\u bak\u path”
sudo cp-f“$odbc_ini_path”$odbc_ini_bak_path”
echo“将“$odbcinst_ini_path”备份到“$odbcinst_ini_bak_path”
sudo cp-f“$odbcinst_ini_path”$odbcinst_ini_bak_path”
# https://stackoverflow.com/a/29626460
功能替换{

sudo sed-i''s/$(sed's/[^^]/[&]/g、 s/\^/\\^/g'-1,链接不是答案。如果这些链接失效或服务器宕机,您的答案将变得毫无用处。请查看元问题。是的,Microsoft有宕机。有时会出现大的宕机,比如链接的闰年Azure glitchThanks。我将尝试一下,并将在未来24-48小时内发布我的结果。否,但你应该在链接之外为你的答案增加一些价值。解释它们是什么,并对内容进行概述或小引用,这将有助于阅读本网站的人在不必遵循链接的情况下理解更多内容。+1表示帮助他人的倾向。我不明白为什么任何人都不应该被劝阻以任何方式提供帮助很可能,不管这意味着发布链接还是其他,尤其是考虑到没有其他人试图回答这个问题。@Charles:我回滚了您对我的编辑所做的更改。请注意excel vba mac现在是一个有效的标记。@Charles:我建议您重新阅读此内容“我刚刚创建了该标记,但没有适用于VBA EXCEL MAC的标记。至少我搜索了它,但找不到。根据链接,给它6个月的时间。如果它确实是一个坏标记,那么它将被自动删除。;)>>>“查看标记Wiki后,此问题不需要新标记,句号。”我不想失礼,但你错了,如果我同意你的观点,那么我们都错了。MAC版的Excel VBA与Windows版的Excel VBA不同。这可能就是为什么MAC版和Windows版通常有不同论坛的原因。我很高兴
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://stackoverflow.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
#!/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://stackoverflow.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"