当前位置: 首页 > 知识库问答 >
问题:

在 Excel VBA 中动态调整组合框的宽度

华甫
2023-03-14

我正在努力设置一个组合框(在 Excel VBA 中),以便根据它包含的最长字符串的长度自动调整其宽度。

我正在尝试创建一个下拉列表(使用名为“WorksheetSelectionForm”的表单中的组合框),一旦打开特定工作簿,该列表就会出现在屏幕上,并允许用户选择要打开的工作簿工作表中的哪一个。

我希望组合框的宽度调整为下拉列表中最长文本字符串的长度。目前,我的下拉列表包含三个项目(工作簿中当前存在的工作表的名称)。它们如下:

  • "损益表"(23个字符)
  • "资产负债表"(13个字符)
  • “现金流报告”(15个字符)

更多的工作表可以添加到工作簿中,因此更多的项目可以添加到下拉列表中,因此我不想简单地将组合框的宽度固定为23磅(下拉列表中当前最长字符串的长度)。

我一直在参考OzGrid的以下思路(见条目3):http://www.ozgrid.com/forum/showthread.php?t=55098.他们提出的解决方案如下:

Dim iWidth As Double 
ComboBox1.AutoSize = True 
iWidth = 0 

For i = 0 To ComboBox1.ListCount - 1 
    ComboBox1.ListIndex = i 
    If iWidth < ComboBox1.Width Then 
        iWidth = ComboBox1.Width 
    End If 
Next 

ComboBox1.Width =  iWidth 
ComboBOx1.AutoSize = False 
ComboBox1.ListCount = 0 

此解决方案的问题在于,if-then 语句中的代码 ComboBox1.Width 实际上似乎并没有计算出当前在 for-next 循环中焦点的组合框项的长度。

以下是我迄今为止编写的代码:

Private Sub Workbook_Open()

Dim Sheet As Worksheet, CmBox As MSForms.ComboBox, LWidth As Double, i As Integer
Set CmBox = WorksheetSelectionForm.ComboBox_Worksheets
LWidth = 0

'Populate the drop-down list with the names of the worksheets
For Each Sheet In Worksheets
    CmBox.AddItem Sheet.Name
Next Sheet

'Find out the length of the longest string in the combobox
For i = 0 To CmBox.ListCount - 1
    CmBox.ListIndex = i
    If Len(CmBox.Value) > LWidth Then
        LWidth = Len(CmBox.Value)
    End If
Next i

'Set the combobox's width to the length of the longest string in the combobox
CmBox.ListWidth = LWidth

'Show the form on screen
WorksheetSelectionForm.Show

End Sub

这段代码在运行时,似乎没有按照预期设置combobox的宽度。它还生成一个combobox,其中缺少所有的项目(工作表的名称)。我哪里做错了?

下面是用户选择组合框中的项目时的代码(以防万一它对您有用):

Private Sub ComboBox_Worksheets_Change()

'Activate the worksheet whose name has been selected in the combobox
Sheets(ComboBox_Worksheets.Value).Activate

'Close the form
Unload WorksheetSelectionForm

End Sub

共有2个答案

常乐
2023-03-14

我使用您的代码作为起始基础,这是结果:

Private Sub Workbook_Open()

Dim Sheet As Worksheet, CmBox As MSForms.ComboBox, LWidth As Double, i As Integer
dim Wb as workbook
load WorksheetSelectionForm
with WorksheetSelectionForm
    Set CmBox = .ComboBox_Worksheets
    'LWidth = 0

    'Populate the drop-down list with the names of the worksheets
    with cmBox
        .clear
        for each Wb in workbooks
            For Each Sheet In WB.Worksheets 'i wasn't sure your way works for filling the list, did you verify it ?, so i do it my way
                h = Sheet.Name
                .AddItem h
                if len(h)>Lwidth then LWidth = Len(h) 'no need to loop again when list is full
            Next Sheet
        next Wb
    end with

    'Find out the length of the longest string in the combobox
    'For i = 0 To CmBox.ListCount - 1
    '    tmp_Length = len(CmBox.List(i))    'this is an other way of doing it, without changing the cmBox value (could trigger events)
    '    If tmp_Length > LWidth Then
    '        LWidth = tmp_Length
    '    End If
    'Next i

    'Set the combobox's List's width to the length of the longest string in the combobox
    CmBox.ListWidth = LWidth*8 'according to the list's Text Font size , you will need to adjust the *8

    'Show the form on screen
    .Show
end with

结束Sub

易琛
2023-03-14

这并不太难。它需要一个API调用。我已经完成了,但没有确切的代码,但这可能会这样做。vb宏字符串宽度,以像素为单位

如果没有,请搜索这些API:

    < li>GetCharABCWidths(用于true type字体) < Li > getchartbwidthsfloat < li>GetCharWidth(可能是最有用的一个) < li>GetCharWidth32(可能更有用) < li>GetCharWidthFloat
 类似资料:
  • 问题内容: 我有一个UILabel,一个UIView在情节提要中并排包含其他子视图。UIView应该紧靠UILabel的右边缘(跟踪约束为1),但我还需要UIlabel(左侧的UIlabel)将其宽度设置为等于其内容大小,除非它达到最大宽度。视觉上: |标签文字| | UIViewWithSubviews | 我需要以下约束: 1)标签应明智地调整宽度大小,除非达到最大大小,并且高度也是动态的,这

  • 问题内容: 我正在尝试自动调整工作表的列大小。我正在写文件,最后我尝试调整所有列的大小。 上面的代码不起作用。不更改列大小以适合文本 更新 我正在使用的作家 问题答案: 如果将列设置为AutoSize,PHPExcel会尝试根据列的计算值(基于任何公式的结果)以及格式掩码(例如千位分隔符)添加的任何其他字符来计算列宽。 默认情况下,这是宽度:使用GD时,可以使用一种更准确的计算方法,该方法还可以处

  • 我有一个,有5列。这些分别是我对列约束的设置。 (固定大小) 整个 基本上是两列形式的布局。我的列 1 和 4(索引 0 和 3)是字段标签,而列 2 和 5 是输入字段(等)。列 3 只是两个表单列之间的固定宽度填充。 我的表单中有一些 - 有些在左列,有些在右列。我已将所有的最大宽度设置为。 加载表单时,布局与我预期的一样(两个输入字段列的宽度相等)。但是,当我单击任何一个<code>组合框<

  • DynamicHeights是一个动态表格元素高度(动态TableViewCell)的例子。实际应用场景在iOS开发中会经常遇到不规律的TableViewCell,往往需要根据内容的多少而动态调整这些Cell的大小。在http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ 中,有详细的解说开发的流程以及这么处理的原因。里面的大

  • 如何动态调整列的大小以支持可能的不规则数组? 上面的代码会分配每个col的长度吗? 事先谢谢你的帮助。

  • 本文向大家介绍C#动态调整数组大小的方法,包括了C#动态调整数组大小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#动态调整数组大小的方法。分享给大家供大家参考。具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度。 希望本文所述对大家的C#程序设计有所帮助