【问题标题】:Removing image-controls in a UserForm using a loop使用循环删除用户窗体中的图像控件
【发布时间】:2019-06-12 00:27:25
【问题描述】:

我创建了一个用户窗体,它可以创建多达 6 个图像控件,并在按下命令按钮时用图片填充它们 (通过复选框您可以选择图片)。

现在,当按下命令按钮时,我希望在重新加载图像控件和图片之前删除所有带有图片的图像控件,以便在需要时不必Unload UserForm通过复选框选择其他图片。我试图通过循环图像控件来做到这一点,但这不适用于我的代码。你有什么建议我可以解决这个问题吗?谢谢。

记住:整个想法是将删除过程作为子中的第一个操作;我不想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

【问题讨论】:

  • Me.Controls(Control).Remove 或者可能是Me.Controls.Remove(Control)
  • 针对您的问题发布了答案和解决方案。如果我能提供帮助,请通过将其标记为已接受来帮助其他读者确定一个好的答案 - 请参阅"Someone answers" - cf。 Someone answers
  • @tom - 添加了语法链接(与 Nick 的建议不对应),实际上非常感谢您的反馈,因为任何在这里回答的人都会花一些时间来提供帮助 (参见之前的评论)

标签: excel vba loops controls userform


【解决方案1】:

I) “无效参数”问题背后的原因是什么?

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

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

案例[2.1]如果您的“图像”和i控件集仅限于这6个元素, 根本不会发生任何运行时错误 "Invalid argument": 稍后 TypeName 检查 Image2 - 不再存在 - 导致 Object 类型而不是 Image 和 从而防止进一步尝试再次删除您的六个“图像”和 i 控件。

案例[2.2]您创建了附加图像控件:只要For Each 循环检查附加图像控件, TypeName 测试找到Image 类型并尝试再次删除已删除的六包。 => 因此控件名称不存在,参数实际上是无效的。

二。结论

在任何情况下,您都应该避免对已删除的控件应用.Remove 方法。 例如,一劳永逸地使用以下代码就足够了:

For i = 1 To 6
    Me.Controls.Remove "Image" & i          ' property doesn't need brackets
Next i 

IMO 会更好,但是重新考虑编码逻辑重用图像控件而不是删除它们。 因此,您可以通过临时分配 LoadPicture(vbNullString) 值轻松清空其 ►.Picture 属性,并在需要时立即通过 LoadPicture 重新分配所选图像名称。 - CF 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在用户表单的代码模块本身中使当前用户表单实例成为自毁对象并不好用。 为了更深入的了解我推荐阅读文章"UserForm1.Show?"

语法 - 请参阅 MS 帮助 Remove method

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2020-10-10
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多