我想知道这是否可行。我很确定它不是,但想知道它是否是,而其他人可能知道如何。我正在使用Excel 2010,一切都在使用VBA。我想要做的是设置一个具有最小宽度大小的ComboBox,然后设置AutoSize,如果键入的数据变得长于ComboBox的长度。
好的,让我澄清一些我将被问到的误解或问题,例如为什么我想让用户输入ComboBox。在另一张纸上,除了ComboBox所在的纸张外,我还有一个项目列表。当在这里键入项目时,ComboBox会填充新项目,我也会按字母顺序对列表进行排序,并且在添加时也拼写检查它们。
然后我的代码也检查每个单元格中文本的最长长度,ComboBox的大小将达到其列表中最长的文本长度,因此可以在下拉列表中完全读取。
我还希望用户能够在ComboBox中输入已经不在列表中的项目。该列表仅用于最常用的项目,但通常需要输入其他杂项。我不希望杂项内容添加到ComboBox中的列表中,所以我只希望用户能够在ComboBox中输入数据,但是如果它被大量使用,他们可以将其添加到另一个列表中片材。
如果有人想知道,当用户输入数据时,我确实为ComboBox工作了拼写检查。我所做的就是在ComboBox停用时使ComboBox的单元格等于ComboBox中的文本(LostFocus)然后我拼写检查那个单元格,然后让ComboBox等同于拼写检查的单元格。
无论如何,正如已经提到的,我确实使用代码将ComboBox的宽度设置为列表中最长的项目。有没有办法让我能够以某种方式将ComboBox的最小宽度设置为这个大小,但是当用户输入数据时,宽度会增加,这会比当前设置的框长?我猜这很容易做,如果我在用户完成输入后调整它(当ComboBox LostFocus时),但它是否可以在键入时执行此操作?设置AutoSize将不起作用,因为它将忽略列表中最长项目的大小,并且几乎不收缩,从而无法查看列表中的项目。 AutoSize的另一个问题是您在键入时无法读取列表中的项目。就像您在键入时一样,它会在您键入时从列表中预填充项目,但在使用AutoSize时无法读取预填充项目。
答案 0 :(得分:0)
我想这是可能的,我只是想通了。 iLength决定了默认的最小宽度大小,它略大于ComboBox从其中提取数据的不同工作表中的列大小。我只是做了一些基本的计算,以确定在notes字段中输入的文本的长度(字符数)比默认长度小4.5倍。当然,如果我使用不同大小的字体,4.5会改变。如果键入的文本(基于计算)变得大于默认大小,我将ComboBox设置为AutoSize,否则AutoSize设置为False。然后,当我清除字段中的数据时,我只需要清除按钮中的代码,将ComboBox重置为默认大小,并将AutoSize设置为False。这非常有效。
Private Sub cboNotes_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim iLength As Integer
iLength = Sheets("Notes").Range("A1").Columns.Width + 20
If Len(cboNotes.Value) * 4.5 < iLength Then
cboNotes.Width = Sheets("Notes").Range("A1").Columns.Width + 20
cboNotes.AutoSize = False
Exit Sub
Else
cboNotes.AutoSize = True
Exit Sub
End If
End Sub