我对VBA比较陌生,我正在尝试解决在Excel 2010中使用userform的问题。
我正在编写一个伪拼写检查器来验证列表中的单词。未知单词显示在文本框中,允许单词列表位于下面的组合框中。我希望组合框能够根据未知单词显示“建议”。即,未知单词是“挖掘”,组合框中允许的单词之一是“挖掘”。我希望组合框能够建议“挖掘”一词。我的问题是自动完成不提供建议,因为未知单词比允许的单词长。
我解决问题的想法是做以下事情: - 将未知单词解析为字符数组。 - 将一个字符一次添加到组合框文本属性,并允许自动完成运行。 - 一旦自动完成停止工作,删除一个字符并插入自动完成建议的单词。
我的问题是,一旦自动完成停止工作,我找不到任何要告诉我的信息。
欢迎任何想法,建议或其他方法。
提前致谢,
威尔
答案 0 :(得分:3)
您可能希望更改ComboBox的2个属性以强制选择列表中的条目:
因此,当用户尝试选择列表之外的单词时,他们会收到“无效的属性值”。
答案 1 :(得分:1)
此代码假定您所描述的TextBox
和ComboBox
,仍然使用其默认名称。此外还有一个按钮,按下时会提示您输入一个单词。然后将这个单词粘贴到文本框中,我认为它会复制您编码的行为:
Private Sub UserForm_Activate()
With Me.ComboBox1
.AddItem "bat"
.AddItem "battleship"
.AddItem "battle"
.AddItem "batty"
.AddItem "bathhouse"
End With
End Sub
Private Sub CommandButton1_Click()
Me.TextBox1 = Application.InputBox("Word", , , , , , , 2)
End Sub
Private Sub TextBox1_Change()
Dim WordToMatch As String
Dim AvailableWords() As String
Dim i As Long
Dim MatchedWordPosition As Long
Dim LongestWordLength As Long
With Me.ComboBox1
.ListIndex = -1
WordToMatch = Me.TextBox1.Text
ReDim AvailableWords(0 To .ListCount - 1)
For i = LBound(AvailableWords) To UBound(AvailableWords)
AvailableWords(i) = .List(i)
LongestWordLength = WorksheetFunction.Max(Len(.List(i)), LongestWordLength)
Next i
For i = 0 To Len(WordToMatch) - 1
On Error Resume Next
MatchedWordPosition = WorksheetFunction.Match(WordToMatch & WorksheetFunction.Rept("?", (LongestWordLength - Len(WordToMatch)) - i), AvailableWords(), 0)
If MatchedWordPosition > 0 Then
Exit For
End If
Next i
If MatchedWordPosition > 0 Then
.ListIndex = MatchedWordPosition - 1
End If
End With
End Sub
我想有几种方法可以给这只猫上皮,但这是我的最大努力。