我正在使用 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,但我宁愿用代码捕获这个特定的实例。
谢谢,乔治
集合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)
我想现在你已经清楚了!干杯!
注意:所有代码绝对是表单的一堆方法/属性,因此所有内容都应放置在表单模块内。
长话短说——你不能用 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)
| 归档时间: |
|
| 查看次数: |
12651 次 |
| 最近记录: |