MySQL ODBC 在 Excel VBA 中显示小数为空

MySQL ODBC shows Decimals as Empty in Excel VBA

我只是想用 MySQL 制作一个玩具数据库,然后通过 VBA 将其导入 Excel。 当我使用 MySQL 的 Excel 插件时它很好,但是当我尝试通过 VBA 自动执行它时,它正确地导入了除小数 (65,30) 之外的所有列,在 myArray 中显示为 "empty" 值。 代码:

Sub DBUpdate()
    ThisWorkbook.Worksheets("data").Cells.ClearContents
    Dim Password As String
    Dim SQLStr As String
    Dim Server_Name As String
    Dim User_ID As String
    Dim Database_Name As String

    Set rs = CreateObject("ADODB.Recordset")        'EBGen-Daily'
    With ThisWorkbook.Worksheets("DB")
        Server_Name = .Range("IPaddress").Value
        Database_Name = .Range("DBname").Value      'Name of database'
        User_ID = .Range("userID").Value            'id user or username'
        Password = .Range("password").Value         'Password'

        SQLStr = "SELECT * FROM trade_details"
    End With

    Set Cn = CreateObject("ADODB.Connection")       'NEW STATEMENT
    Cn.Open "Driver={MySQL ODBC 5.2 ANSI Driver};Server=" & _
            Server_Name & ";Database=" & Database_Name & _
            ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    rs.Open SQLStr, Cn, adOpenStatic

    Dim myArray()

    myArray = rs.GetRows()

    nCols = UBound(myArray, 1)
    nRows = UBound(myArray, 2)

    For K = 0 To nCols ' Using For loop data are displayed
        ' header
        Range("b1").Offset(0, K).Value = rs.Fields(K).Name
        ' row data
        For R = 0 To nRows
           'Range("b2").Offset(R, K).Value = myArray(K, R)
           ThisWorkbook.Worksheets("data").Cells(R, K).Value = myArray(K, R)
        Next
    Next

    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing

End Sub

我注意到的一件事是真正的空值显示为 'NULL' 但数字显示为 'Empty',类型为'Variant/Empty'.

我还了解到 Excel 默认情况下仅扫描前 8 行以确定列类型。但是我从第一行开始填充了数据(即使是这样,也不能 'empty' 对吧?)

系统规格:

我真的很困惑,因为一切都是库存配置,我什至不知道这是 Excel/VBA 方面还是 MySQL/ODBC 方面,当我用谷歌搜索时,甚至没有一个人遇到过这个问题. 欢迎任何意见。

如评论所述,Excel 的单元格限制或界面不支持 MySQL (65,30) 的最大小数限制。在VBA中,使用Double类型可能会保持数值。但是对于电子表格的工作,请考虑减少 MySQL:

中的小数字段
ALTER TABLE `tableName` MODIFY COLUMN `largenumberfield` DECIMAL(10,7);

此外,考虑绕过 VBA 数组的需要,使用记录集作为唯一的数据容器。在 Excel 中,您可以使用范围 属性、CopyFromRecordset,您可以在其中指定数据的最左侧列。您还可以使用记录集的 Field.Name 属性 来拉入列 headers:

Sub DBUpdate()
    Dim Server_Name As String, SQLStr As String
    Dim Database_Name As String
    Dim User_ID As String, Password As String

    Dim Cn As Object, rs As Object, fld As Object
    Dim i as Integer

    Set rs = CreateObject("ADODB.Recordset")        'EBGen-Daily'
    With ThisWorkbook.Worksheets("DB")
        Server_Name = .Range("IPaddress").Value
        Database_Name = .Range("DBname").Value      'Name of database'
        User_ID = .Range("userID").Value            'id user or username'
        Password = .Range("password").Value         'Password'

        SQLStr = "SELECT * FROM trade_details"
    End With

    ' OPEN CONNECTION
    Set Cn = CreateObject("ADODB.Connection")       
    Cn.Open "Driver={MySQL ODBC 5.2 ANSI Driver};Server=" & _
            Server_Name & ";Database=" & Database_Name & _
            ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    ' OPEN RECORDSET
    rs.Open SQLStr, Cn, adOpenStatic

    ThisWorkbook.Worksheets("data").Cells.ClearContents

    ' COLUMN HEADERS
    i = 0
    ThisWorkbook.Worksheets("data").Range("A1").Activate
    For Each fld In rs.Fields
        ActiveCell.Offset(0, i) = fld.Name
        i = i + 1
    Next fld

    ' DATA ROWS
    ThisWorkbook.Worksheets("data").Range("A2").CopyFromRecordset rs

    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing

End Sub