检查文本框是否存在vba(使用名称)

Geo*_*rge 5 vba

我正在使用 Ms-Access,并创建了一个用户表单,其中有许多文本框。这些盒子被命名为:Box1、Box2、Box3 ...

我需要遍历所有盒子,但我不知道哪一个是最后一个。为了避免循环遍历所有用户窗体控件,我想尝试以下操作:

For i =1 To 20

If Me.Controls("Box" & i).value = MyCondition Then
    'do stuff
End If

Next i
Run Code Online (Sandbox Code Playgroud)

此错误出现在 Box6 处,这是第一个未找到的框。有没有办法捕获此错误并在发生时退出循环。

我知道我可以使用On Error,但我宁愿用代码捕获这个特定的实例。

谢谢,乔治

Com*_*nse 5

集合Controls是控件的简化集合(显然),并且与控件的放置顺序共享相同的顺序。

首先,即使是可创建的集合对象也缺少诸如Exists或 之类的方法Contains,因此您需要一个具有错误处理功能的函数来从集合中检查/提取小部件。

Public Function ExistsWidget(ByVal Name As String) As Boolean
    On Error Resume Next
        ExistsWidget = Not Me.Controls(Name) Is Nothing
    On Error GoTo 0
End Function
Run Code Online (Sandbox Code Playgroud)

如果您确实不喜欢“请求宽恕而不是许可”选项,您可以提取文本框的整个有序集合(和/或在具有类似逻辑的另一个循环中按名称检查是否存在)。

Public Function PullBoxes() As Collection
    Dim Control As MSForms.Control

    Set PullBoxes = New Collection

    For Each Control In Me.Controls
        If TypeOf Control Is MSForms.TextBox And _
                Left(Control.Name, 3) = "Box" Then
                Call PullBoxes.Add(Control)
        End If
    Next
End Function
Run Code Online (Sandbox Code Playgroud)

由于小部件的名称是唯一的 - 您可以Dictionary从该函数返回一个带有 (Control.Name, Control) 对的函数,并且能够通过名称正确检查小部件的存在性,而无需抑制错误。 如果这对您来说是新信息,这里有一个很好的指南。Dictionary

无论如何,无论您选择什么对象,如果用户(或代码)无法创建更多这些文本框 - 您可以将Function上面的内容转换为内部集合Static Property Get或仅转换为内部Property Get集合Static,因此您只需迭代所有控件一次(例如UserForm_Initialize事件)!

Public Property Get Boxes() As Collection
    Static PreservedBoxes As Collection

    'There's no loop, but call to PullBoxes to reduce duplicate code in answer
    If PreservedBoxes Is Nothing Then _
            Set PreservedBoxes = PullBoxes

    Set Boxes = PreservedBoxes
End Property
Run Code Online (Sandbox Code Playgroud)

毕竟,最后创建的TextBox名称Box*将是:

Public Function LastCreatedBox() As MSForms.TextBox
    Dim Boxes As Collection

    Set Boxes = PullBoxes

    With Boxes
        If .Count <> 0 Then _
                Set LastCreatedBox = Boxes(.Count)
    End With
End Function
Run Code Online (Sandbox Code Playgroud)

我想现在你已经清楚了!干杯!

注意:所有代码绝对是表单的一堆方法/属性,因此所有内容都应放置在表单模块内。


Vit*_*ata 2

长话短说——你不能用 VBA 做你想做的事。然而,有一个很好的方法来解决这个问题 - 创建一个布尔公式,使用On Error. 因此,您的代码不会被它破坏。

Function ControlExists(ControlName As String, FormCheck As Form) As Boolean
   Dim strTest As String
   On Error Resume Next
   strTest = FormCheck(ControlName).Name
   ControlExists = (Err.Number = 0)
End Function
Run Code Online (Sandbox Code Playgroud)

取自此处:http://www.tek-tips.com/viewthread.cfm ?qid=1029435

要查看整个代码的工作情况,请像这样检查:

Option Explicit

Sub TestMe()

    Dim i       As Long

    For i = 1 To 20
        If fnBlnExists("Label" & i, UserForm1) Then
            Debug.Print UserForm1.Controls(CStr("Label" & i)).Name & " EXISTS"
        Else
            Debug.Print "Does Not exist!"
        End If
    Next i

End Sub

Public Function fnBlnExists(ControlName As String, ByRef FormCheck As UserForm) As Boolean

    Dim strTest As String
    On Error Resume Next
    strTest = FormCheck(ControlName).Name
    fnBlnExists = (Err.Number = 0)

End Function
Run Code Online (Sandbox Code Playgroud)