使用循环删除用户窗体中的图像控件

时间:2019-01-17 18:28:09

标签: excel vba loops controls userform

我创建了一个用户窗体,该窗体最多可创建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

1 个答案:

答案 0 :(得分:0)

I)“无效参数”问题的根源是什么?

我假设您创建了其他图像控件,导致运行时错误“无效参数”-见案例[2.2]。

[1]一旦在For Each循环中找到第一 图像控件, 您已经在For i = 1 to 6循环中删除了完整的“图像”和i控件集。 重要的是要知道,For Each循环不会通过当前删除操作纠正Me.Controls中的原始内容 并尝试分析整个集合(例如,在接下来的步骤中为Image2Image3等)。

案例[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