为什么 VarType() 对于包含长整数的 Variant 变量返回 vbString?

问题描述 投票:0回答:1

标题说的是什么。

在 Access VBA 中,我有一个函数,旨在从字段名称和值参数返回条件表达式。

这个想法是,对于字符串,标准将使用 Like 运算符来允许模式匹配,例如

Party Like '*f*'
,对于长整数,、PK 值,标准将使用相等运算符 (=), 例如
PartyID = 5822
。目前,这取决于传递的值参数的变体子类型。

函数如下,但问题是 VarType() 将包含长整数的 Variant 变量评估为字符串子类型。 I.e.,在计算包含长整数的 Variant 变量时,VarType() 返回 8(i.e.vbString),而人们期望它返回 3(i.e.vbLong)。测试表明,这种行为也存在于调用代码中,i.e.,VarType() 即使对于 ctl.Value,也会返回 8(i.e.

vbString
)。回想一下,所有访问控件的 Value 属性数据类型都是 Variant

问题是为什么会发生这种情况,特别是如何让 VarType 按照记录的方式运行。

Private Function CriterionCreate(ByVal strFieldName As String, varValue As Variant) As String
100     Dim strCriterion As String
    
200     Select Case VarType(varValue)
            Case vbLong     '=3.  For long integer PKs.
202             strCriterion = strFieldName & " = " & varValue
210         Case vbString   '=8.  For strings & text PKs.
211             strCriterion = strFieldName & mLikeThis(varValue)
220         Case vbNull     'Blank / empty record.
221             strCriterion = ""
229     End Select
    
300     CriterionCreate = strCriterion
End Function

我会注意到,调用代码会迭代 Form.Controls 并将每个控件分配给变量

ctl
(无论其类型如何),该变量被声明为
As Control
,而不是特定的控件类型。 Control 对象没有 Value 属性,尽管 ctl.Value 返回适当的值,即使 IntelliSense 不会正确自动完成属性名称。没有理由认为这会影响 VarType() 的行为或数据的字符,但数据可能以某种方式改变通过如此指定的属性传递的字符,在这种情况下,这是一个未记录的错误,除了从根本上与变体的概念。

vba string ms-access types variant
1个回答
0
投票

有趣的问题。正如评论中所指出的,

VarType
不评估变量的值,而是评估“加载”到其中的值类型。

未绑定访问文本框默认返回文本。您可以使用 Format 属性强制它们为数字,但这始终是 Double 数字。我没有找到一种方法来强制文本框返回仅包含属性的 Long Int 值。

在测试表格上,我有 3 个文本框:

  1. 绑定到 Long Int 列
  2. 无绑定,无格式
  3. 未绑定,格式“0”

此代码:

Private Sub cmdRun_Click()

    Dim ctl As Access.control
    Dim varValue As Variant
    
    For Each ctl In Me.Controls
        If TypeOf ctl Is TextBox Then
            varValue = ctl.Value
            Debug.Print ctl.Name, varValue, VarType(varValue)
        End If
    Next ctl
    
End Sub

在未绑定框中输入“1”和“2”后返回此值(ID 始终为 0):

ID                          0             3  (vbLong)
Unbound_NoFormat            1             8  (vbString)
Unbound_FormatNumber        2             5  (vbDouble)

要将 3. 强制为 vbLong,您需要 VBA:

Private Sub Unbound_FormatNumber_AfterUpdate()

    With Me.Unbound_Formatnumber
        If Not IsNull(.Value) Then
            .Value = CLng(.Value)
        End If
    End With
    
End Sub

那么它的值有 VarType = vbLong。

恕我直言,这比在代码中指定类型更费力。
在我“按搜索文本框过滤”的表单中,我这样做:

Call AddCriteria(Me, S, "Projekt_Nr", dbLong)
Call AddCriteria(Me, S, "Projekt_Name", dbText)
Call AddCriteria(Me, S, "SomeDate", dbDate)

AddCriteria 是 Application.BuildCriteria 的包装函数,它允许使用表达式(">=100”、“3 或 5”)进行过滤。

© www.soinside.com 2019 - 2024. All rights reserved.