首页 > 解决方案 > 更改列表框的样式

问题描述

在 Outlook 2010 中,我有一个带有 ListBox 的用户窗体。这个 ListBox 有 4 列,我在其中显示附件列表(列“文件名”、“文件类型”、“文件大小”和“目标目录”。

不幸的是,ListBox 的布局功能受到限制,用户无法在运行时调整列宽(因此我必须通过设计指定列的宽度)。因为文件路径可以很长,所以我将最后一列的宽度设置为 999 Pt。

所以我的 ListBox 有一个水平滚动条

我想对我的 ListBox 进行以下布局更改:

  1. 添加列标题
  2. 将列的对齐方式更改为右对齐
  3. 可选:允许用户按任何列对列表进行排序
  4. 可选:允许用户排序​​改变任何列的宽度
  5. 可选:在 ListBox 中显示一个网格

对于 1. 我找到了一些答案,这很复杂,我应该使用列表上方的静态标签。这是不可能的,因为我的 ListBox 可以水平滚动。

ListBox 真的那么受限制还是#1 和#2 可能以某种方式?

我知道有外国元件可用,但我不能购买任何元件。

我的解决方案也应该适用于我的同事,所以他们也必须安装这些组件。

标签: vbaoutlooklistbox

解决方案


我一直在尝试解决您的问题的可能方法。我想我已经尽可能地采用了列表框方法,所以我将分享我的发现。

我在网上找不到任何建议有人认为您可以在不使用属性 RowSource 的情况下拥有列表框列标题。要使用 RowSource,请将其设置为 Excel 范围。

我让 Outlook 创建一个 Excel 工作簿并向其中写入一些数据。不幸的是,我找不到任何让 Outlook 用户表单访问 Excel 范围的方法。设置 RowSource 的语法是:

ListBox1.RowSource = "Emails!A2:D20"

这不是范围的标准语法,我没有发现任何扩展它以包含工作簿名称的方法。

Jonah_Hess 在https://stackoverflow.com/a/43381634/973283中描述了一种有趣的方法。他有两个列表框。一个是包含标题的单行列表框,另一个包含数据。这两个列表框设置为相同数量的具有相同宽度的列。这提供了一个有吸引力的外观,但如果您滚动数据列表框,标题列表框不会随之滚动。这与将标签放在单个列表框上方并没有什么不同。

我尝试将标题和数据列表框放在一个框架中并滚动框架,但无法让它工作。我在 VB 用户表单中使用了框架,但功能非常不同,因此没有任何经验教训可以带到 VBA 用户表单中。也许更熟悉 VBA 框架的人可以使用这种方法。

我放弃了尝试在 Outlook 中获得解决方案。Excel 宏可以访问 Outlook 数据,所以我尝试了这种方法。

我创建了一个启用宏的工作簿。在其中,我有两个表格,它们都填满了屏幕以隐藏工作表。第一个表单只是说:“我正在从 Outlook 加载数据,请稍候”。我不清楚您表单上的数据,所以我从一个充满垃圾邮件的文件夹中导入了选定的详细信息,这些邮件是我写到工作表中的。我调整了列表框列的大小以匹配工作表的列。结果是:

带有列标题的可滚动列表框

文字有点小,但我认为它是可读的。底部的列表框允许我选择不同时期的电子邮件。很久以前,我遇到了 RowSource 问题,这意味着我可以更改范围内的值,但无法更改范围的大小。我今天要么设法避免了这个问题,要么这是一个已修复的错误。

您可以看到标题已显示。列有点宽,但我认为它们是合理的第一近似值。更改宽度的选项很容易实现。

您要求的更改:

  • 添加列标题。完毕
  • 将列的对齐方式更改为右对齐。可能但困难。您需要用适当数量的前导空格填充文本。
  • 可选:允许用户按任何列对列表进行排序。数据在工作表中非常容易。
  • 可选:允许用户更改任何列的宽度。我在运行时设置了列宽以显示它是可能的。
  • 可选:在 ListBox 中显示一个网格。不可能。

如果以上内容很有趣,我可以向您展示我的所有代码并指导您创建表单,以便您可以复制我的实验。或者,我可以解释一下:如何将 Outlook 数据导入 Excel,如何包含列标题以及如何设置列宽。

我找不到任何建议可以使用列表框实现更好的效果。

另一种方法是使用标签网格。这可以提供有吸引力的外观,并且一列或多列可以右对齐。使用用户窗体的 Controls 属性,您可以将网格视为二维数组。我很久以前就使用过这种技术,发现它很有吸引力并且不是特别困难。


推荐阅读