vba - 可以直接在 UserForm.AddItem 中使用逻辑语句吗?

标签 vba excel listbox userform

我知道并理解将项目添加到 ListBox 的常用方法使用逻辑测试:

If a = 1 Then
    ListBox1.AddItem x
End If

但是,我想知道是否有可能 .AddItem直接用逻辑语句?就像是:
ListBox1.AddItem If a = 1

这不是一个让我难过的紧迫问题。我只想知道是否有其他方法可以添加到我的知识库中。

最佳答案

如果需要逻辑语句来判断是否添加该项,那么答案是:no*不可能。尽快.AddItem方法被调用,将添加一个项目 .如果未提供参数(或参数为 Null/Empty/vbNullString/某些不可打印的字符),则在末尾附加一个空白项。

唯一的单行解决方案是按照 K.Dᴀᴠɪs 的建议进行操作:

If a = 1 Then ListBox1.AddItem x



但是,如果逻辑语句可以在要添加的不同项目之间进行选择,那么是的,这是可能的。

方法一 - IIf() (内联如果):
ListBox1.AddItem IIf(a = 1, x, y)

在哪里 a = 1 ~> ListBox1.AddItem x , 否则 ~> ListBox1.AddItem y .

方法二 - Choose() :
ListBox1.AddItem Choose(a, x, y, z)

在哪里 a = 1 ~> ListBox1.AddItem x , a = 2 ~> ListBox1.AddItem y , a = 3 ~> ListBox1.AddItem z , ETC。



* 从技术上讲,这是可能的。但是,它需要错误捕获和稍微复杂的 .AddItem 使用。方法的第二个参数**:
On Error Resume Next
ListBox1.AddItem x, IIf(a = 1, ListBox1.ListCount, -2)
On Error GoTo 0
-2如果条件失败,插入索引会强制出错,而 ListBox1.ListCount index 导致项目被附加到列表的末尾。 On Error语句导致 .AddItem发生错误时要跳过的方法。

第二个参数也可以用几种不同的方式重写,例如:
ListBox1.AddItem x, ListBox1.ListCount + IIf(a = 1, 0, 1)
ListBox1.AddItem x, ListBox1.ListCount + (a = 1) + 1

** 也可以在不使用第二个参数的情况下进行逻辑语句,但它要么需要区分字符串和数字,要么总是转换为字符串,结果不容易阅读/理解:
On Error Resume Next
' for numbers
ListBox1.AddItem 42 / -(a = 1)
' or for strings
ListBox1.AddItem "42" & String$(0 / (a = 1), 0)
' or for both
ListBox1.AddItem CStr(x) & String$(0 / (a = 1), 0)
ListBox1.AddItem CStr(x) & Choose(1 / (a = 1))
ListBox1.AddItem CStr(x) & IIf(1 / (a = 1), "", "")
On Error GoTo 0

这次的技巧是在条件失败时强制除以零错误,否则将数字除以 1 或将空字符串附加到字符串。 ( String$(0, 0) 返回空字符串,Choose(-1) 返回 Null ,它们像空字符串一样连接。)

备注:
  • 虽然所有这些示例都将项目附加到列表的末尾,但可以修改它们以在中间添加或插入。
  • 一般来说,使用 On Error这种方式的陈述是不是 推荐的。一个适当的错误处理程序,它检查并仅恢复特定的适当错误应该几乎总是 总是 使用。 (当然,所有其他捕获的错误都会重新引发。)
  • 关于vba - 可以直接在 UserForm.AddItem 中使用逻辑语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565892/

    相关文章:

    c# - 从 View 中 ListBox 中删除的文件更新 ViewModel 中的 ObservableCollection - WPF

    c# - 什么 WPF 控件可以用于 WP7 上的只读项目列表?

    vba - Excel vba : choosing random cell from non-contiguous range

    vba - 使用母版在VBA中为PowerPoint 2010创建具有自定义布局的新幻灯片

    excel - 将早期绑定(bind) VBA 转换为后期绑定(bind) VBA : Excel to Outlook Contacts

    excel - 使用选项保护 Office 脚本中的工作表

    ms-access - 错误 2115 : Macro/function set to BeforeUpdate/ValidationRule is preventing {pgm} from saving data in the field

    python - 如何从 excel 中检索数据并在 python 中格式化它们?

    excel - 如何搜索文本中的字符列表

    asp.net - 数据绑定(bind)列表框和设置 css 类