标题说的是什么。
在 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() 的行为或数据的字符,但数据可能以某种方式改变通过如此指定的属性传递的字符,在这种情况下,这是一个未记录的错误,除了从根本上与变体的概念。
有趣的问题。正如评论中所指出的,
VarType
不评估变量的值,而是评估“加载”到其中的值类型。
未绑定访问文本框默认返回文本。您可以使用 Format 属性强制它们为数字,但这始终是 Double 数字。我没有找到一种方法来强制文本框返回仅包含属性的 Long Int 值。
在测试表格上,我有 3 个文本框:
此代码:
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”)进行过滤。