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' 对吧?)
系统规格:
- Win10 64 位
- Office 2013
- 64 位 MySQL
- 服务器 5.7
- MySQL ODBC 5.2 ANSI 驱动程序
我真的很困惑,因为一切都是库存配置,我什至不知道这是 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
我只是想用 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' 对吧?)
系统规格:
- Win10 64 位
- Office 2013
- 64 位 MySQL
- 服务器 5.7
- MySQL ODBC 5.2 ANSI 驱动程序
我真的很困惑,因为一切都是库存配置,我什至不知道这是 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