【发布时间】:2021-12-30 18:11:02
【问题描述】:
我正在尝试摆脱列表框中的水平滚动条 - 当用户单击某些单元格时出现,然后每次用户单击该单元格时都会“删除”(所以我不能手动更改它,我必须用代码更改它)--但 .ColumnWidths 属性似乎不起作用。
似乎 ColumnWidths 默认设置为 74——这是基于这样一个事实,即如果我将 Width 设置为 74 或更大,则没有水平滚动条。
如果单击单元格时,我进入设计模式,打开属性,我可以手动将 ColumnWidths 设置为 35。这不是解决方案,因为我的列表框是根据用户的活动单元格创建和删除的。尽管如此,这证实了我的代码是如何编写的。
Option Explicit
Private WithEvents Lbx As MSForms.ListBox
Private oTarget As Range
Private ListBoxName As String
Private Const Cell_A1 As String = "B1:B20" 'change addr as required.
Private Sub Lbx_Change()
Dim k As Long
oTarget.ClearContents
For k = 0 To Lbx.ListCount - 1
If Lbx.Selected(k) Then
If Len(oTarget) = 0 Then
oTarget = Lbx.List(k)
Else
oTarget = _
Trim(oTarget & vbNewLine & Lbx.List(k))
End If
End If
Next
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim oListBox As OLEObject
On Error Resume Next
Me.OLEObjects(1).Delete
Range(Cell_A1).Interior.ColorIndex = 0
If Target.Column = 2 And (Target.Row >= 1 And Target.Row <= 20) Then
'UCase(Target.Address(0, 0)) = UCase(Cell_A1)
Application.DisplayFormulaBar = False
Set oListBox = _
Me.OLEObjects.Add(ClassType:="Forms.ListBox.1")
With oListBox
Names.Add "ListBoxName", .Name
.Left = Target.Offset(0,1).Left
.Top = Target.Offset(0, 0).Top
.ColumnCount = 1
.ColumnWidths = "35"
.Width = 54
.Height = Me.StandardHeight * 16
.Object.ListStyle = fmListStylePlain
.ListFillRange = "A1:A20"
.Placement = xlFreeFloating
.Object.MultiSelect = fmMultiSelectMulti
.Object.SpecialEffect = fmSpecialEffectFlat
.Object.BorderStyle = fmBorderStyleSingle
With Application
.OnTime Now + _
TimeSerial(0, 0, 0.01), Me.CodeName & ".Hooklistbox"
.CommandBars.FindControl(ID:=1605).Execute
End With
End With
Else
Application.DisplayFormulaBar = True
Names("ListBoxName").Delete
Range(Cell_A1).Interior.ColorIndex = 0
End If
End Sub
Private Sub Hooklistbox()
Application.CommandBars.FindControl(ID:=1605).Reset
Set oTarget = ActiveCell
ActiveCell.Interior.Color = vbGreen
'display the listbox and hook it.
With Me.OLEObjects(Evaluate("ListBoxName"))
.Visible = True
Set Lbx = .Object
End With
End Sub
【问题讨论】:
-
Hooklistbox、Range(WIDTH)中有什么内容? -
如果您在删除列表框后取消
On Error Resume Next,您稍后会在代码中收到错误 - 在我的 PC 上难以调试(“此时无法进入中断模式”)跨度> -
@TimWilliams 我已经添加了我的代码的其他部分(包括 hooklistbox)并对其进行了修改,以便它可以毫无问题地运行。 WIDTH 只是我工作表上的一个命名单元格(带有动态公式)......它不会给我带来任何问题——我已经在上面更新的代码中用整数替换了它。
-
我认为您删除了几行对我造成问题的行-如果我将
.Width设置为(例如)100,则效果很好-没有水平滚动条。似乎你不需要使用Name如果工作表上只有一个 oleObject 吗?从技术上讲,无需删除/重新创建列表框 - 如果选择了监控范围之外的单元格,您可以将其隐藏。这将简化您的代码。 -
@TimWilliams 好吧,但我不是要调整 .Width,而是要调整 .ColumnWidths。你说得对, .Width 是响应式的。但是,我有一个设置的宽度,我需要 ListBox,并且我希望没有滚动条。它与这个问题并不真正相关,但我确实需要一个命名的宽度,因为如果用户调整了某些列的大小,我需要正确调整宽度。它没有反映在此代码中,但我将列表框的右侧与单元格的左侧对齐,这是为了上下文,但我对 WIDTH 名称没有任何问题。
标签: excel vba properties listbox activex