【问题标题】:MySQL ODBC shows Decimals as Empty in Excel VBAMySQL ODBC 在 Excel VBA 中将小数显示为空
【发布时间】:2016-06-22 08:33:41
【问题描述】:

我只是想用 MySQL 制作一个玩具数据库并通过 VBA 将其导入 Excel。 当我使用 MySQL 的 Excel 插件时很好,但是当我尝试通过 VBA 自动化它时,它正确导入了除 Decimal(65,30) 之外的所有列,这些列在 myArray 中显示为“空”值。 代码:

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',类型为 '变体/空'.

我还读到 Excel 默认只扫描前 8 行以确定列类型。但是我从第一行开始填充数据(即使是这种情况,它也不能是“空的”对吗?)

系统规格:

  • Win10 64位
  • Office 2013
  • 64 位 MySQL
  • 服务器 5.7
  • MySQL ODBC 5.2 ANSI 驱动程序

我真的很困惑,因为一切都是库存配置,我什至知道这是来自 Excel/VBA 端还是 MySQL/ODBC 端,当我用谷歌搜索时,甚至没有一个人遇到这个问题。 任何意见表示赞赏。

【问题讨论】:

  • 为什么要使用数组?考虑CopyFromRecordset?
  • 此外,该列类型非常大 - max of MySQL:最多 65 位和最多 30 个小数点位。尝试使用 double type 定义数组以适应。整数或长类型太有限了。
  • 我能够重现您的错误并通过将小数调整为 (10,7) 来解决。您是否有理由在 MySQL 的最大值下需要如此高的整数值和小数精度?
  • 非常感谢冻糕!我想我也会采用那个解决方案。

标签: mysql excel vba odbc decimal


【解决方案1】:

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

ALTER TABLE `tableName` MODIFY COLUMN `largenumberfield` DECIMAL(10,7);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多