将小数传递给 vba 的问题
Posted
技术标签:
【中文标题】将小数传递给 vba 的问题【英文标题】:Problems with passing decimals to vba 【发布时间】:2016-08-31 10:35:46 【问题描述】:我在将十进制数从访问字段(使用 DAO 记录集)传递到 vba 变量时遇到了一些问题。我曾尝试更改 access 和 vba(单一/货币)中的数据类型,但同一行在调试器中一直突出显示,运行时错误 94“无效使用 null”。 让我感到困惑的是,当我将光标悬停在调试器中的变量上时; quickinfo 显示变量持有正确的值,但记录集字段为空。这只发生在小数字段,其他字段(字符串/整数)不会突出显示。
在调试器中突出显示的行是 'Start Loop 块中的 rs!Field4。奇怪的是 rs.Field3 很好地设置了 numField3 变量。两者之间的唯一区别是字段 3 包含整数,字段 4 包含小数。两者都是 msAccess 号码,但在问题解决期间我已更改为货币。 任何反馈都会很好 谢谢
Private Sub Command1_Click()
'Set Database and Recordset variables
Dim thisDB As DAO.Database
Dim rs As DAO.Recordset
Set thisDB = CurrentDb
Set rs = thisDB.OpenRecordset("tblTable1")
'Declare and set recordset variables variables
Dim strField1 As String
Dim strField2 As String
Dim numField3 As Currency
Dim numField4 As Currency
Dim dtField5 As Date
Dim dtField6 As Date
'Declare dynamic variables
Dim dtVar1 As Date
Dim intVar2 As Integer
Dim dtVar3 As Date
'DecalreSQL Variables
Dim num1 As Currency
Dim num2 As Currency
Dim num3 As Currency
Dim StrSQL As String
Dim strValues As String
'Start Loop
Do While Not rs.EOF
strField1 = rs!Field1
strField2 = rs!Field2
numField3 = rs!Field3
numField4 = rs!Field4
dtField5 = rs!Field5
dtField6 = rs!Field6
If strField1 = "This" And strField2 = "That" Then
'Perform calculations
dtVar1 = 0
dtVar3 = 0
num3 = 0
Do While dtVar3 < dtField6
If ’Something’ Then
This calculation sets variables
ElseIf ‘SomethingElse’ Then
This calculation sets variables
Else
This calculation sets variables
End If
'Build SQL Query and apprend to table
strValues = dtVar1& "," & num1 & "," &num2 & "," & num3
StrSQL = "INSERT INTO tblTable2 (Field1, Field2, Field3, Field4 );"
StrSQL = StrSQL & "VALUES ('" & strValues & "')"
DoCmd.SetWarnings False
DoCmd.RunSQL StrSQL
DoCmd.SetWarnings True
dtVar3 = dtVar1
Loop
End If
rs.MoveNext
Loop
rs.Close
End Sub
【问题讨论】:
如果您向我们展示一些代码可能会有所帮助***.com/help/mcve 要存储小数点,您需要使用Variant
数据类型。
Remi,我在 Ryan Wildry 上面添加了一些代码,我尝试了变体数据类型,但代码什么也没做。
不要使用DoCmd.SetWarnings False
和DoCmd.RunSQL StrSQL
。相反,请尝试使用thisDB.Execute StrSQL, dbFailOnError
。
你是否在传递值之前尝试过显式转换?
【参考方案1】:
当您将光标悬停在尚未分配的变量上时。您实际上是在显示分配给 numField4
变量的最后一条记录的值。
这意味着您当前的记录集字段Field4
实际上是一个空值。要将其分配给您需要针对该条件进行捕获的数值变量。
numField4 = Nz(rs!Field4, 0)
而且您可能也应该重复 Field3 以涵盖第一种可能性
【讨论】:
以上是关于将小数传递给 vba 的问题的主要内容,如果未能解决你的问题,请参考以下文章