我创建了一个用户窗体,该窗体最多可创建6个图像控件,并在按下命令按钮时在其中填充图片 (通过复选框,您可以选择图片)。
现在,当我按下命令按钮时,我希望先删除所有带有其图片的图像控件,然后再重新加载该图像控件和图片,这样一来,不必Unload
一个人想通过复选框选择其他图片。我试图通过遍历图像控件来做到这一点,但这不适用于我的代码。您有什么建议可以解决这个问题吗?谢谢。
(记住:整个想法是在子程序中首先执行此删除过程;我不想Unload Me
等...)
Option Explicit
Dim i, k As Byte
Private Sub cmdGetGraphics_Click()
Dim sum_cb As Byte, cb_slct As Byte, y As Byte, sum_img As Byte
Dim Img As MSForms.Image
Dim Control As Control
Dim F(1 To 6) As Integer
Dim img_name As String
For Each Control In Me.Controls
If TypeName(Control) = "Image" Then
For i = 1 To 6
Me.Controls.Remove "Image" & i 'error occurs here: Invalid Argument
Next i
End If
Next Control
答案 0 :(得分:0)
I)“无效参数”问题的根源是什么?
我假设您创建了其他图像控件,导致运行时错误“无效参数”-见案例[2.2]。
[1]
一旦在For Each
循环中找到第一 图像控件,
您已经在For i = 1 to 6
循环中删除了完整的“图像”和i控件集。
重要的是要知道,For Each
循环不会通过当前删除操作纠正Me.Controls
中的原始内容
并尝试分析整个集合(例如,在接下来的步骤中为Image2
,Image3
等)。
案例[2.1]
,如果您的“图片”和我控制的对象的集合仅限于这些 6个元素,
根本不会发生任何运行时错误“无效参数” :
以后对TypeName
进行的Image2
检查-不再存在-产生Object
类型而不是Image
因此可以防止再次尝试删除您的六个“图像”和i控件。
案例[2.2]
,您创建了其他图像控件:For Each
循环一旦检查了其他图像控件,
TypeName
测试发现一种Image
类型,并尝试再次删除已经删除的六个包。
=>因此,控件名称不存在,该参数实际上是无效的。
II。结论
无论如何,您都应避免在已删除的控件上应用.Remove
方法。
例如,一劳永逸地使用以下代码就足够了:
For i = 1 To 6
Me.Controls.Remove "Image" & i ' property doesn't need brackets
Next i
IMO甚至更好,但是重新考虑编码逻辑并重新使用图像控件,而不是移除。
因此,您可以通过临时分配一个.Picture
值来轻松清空它们的►LoadPicture(vbNullString)
属性,并在需要时通过LoadPicture
重新分配所选的图像名称。
-C.f. How to clear an imagage in a UserForm?
其他提示
您的声明行Dim i, k As Byte
表示未指定的变量i
默认为Variant。 --
所以我建议说Dim i As Long, k As Byte
(在VBA中,声明As Integer
没有内存优势,
特别是关于行或列数超过整数限制的情况;抛弃可能需要使用整数的API函数)
通过Unload Me
在Userform的代码模块本身中使当前userform实例成为自毁对象不是很好的方法。
为了更深入地理解,我建议阅读文章"UserForm1.Show?"。
语法-请参阅MS帮助Remove method