将小数传递给 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 FalseDoCmd.RunSQL StrSQL。相反,请尝试使用thisDB.Execute StrSQL, dbFailOnError 你是否在传递值之前尝试过显式转换? 【参考方案1】:

当您将光标悬停在尚未分配的变量上时。您实际上是在显示分配给 numField4 变量的最后一条记录的值。

这意味着您当前的记录集字段Field4 实际上是一个空值。要将其分配给您需要针对该条件进行捕获的数值变量。

numField4 = Nz(rs!Field4, 0)

而且您可能也应该重复 Field3 以涵盖第一种可能性

【讨论】:

以上是关于将小数传递给 vba 的问题的主要内容,如果未能解决你的问题,请参考以下文章

VBA 将日期参数传递给 SQL Server 存储过程

如何使用 vba 将参数传递给 asp.net web api?

Microsoft Access VBA 将参数传递给报表

VBA ADO 将数组参数传递给存储过程

Excel VBA:将计算结果数组作为参数传递给函数

Excel VBA - 将参数参数传递给 Sub