Excel自动弹出选择项问题

ie4888 2016-12-06 05:12:17
目的:在指定单元输入字幕后,自动弹出列表框提供可选择项,随着输入字母增加,自动动态刷新列表框的项。
注:列表框选择项取自另一个表的某列。
问题:有时弹出列表框,有时没有反应。
请高手帮助诊断问题所在,该如何解决?




Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Dim i As Integer
If Target.Count = 1 Then
If Target.Column = 6 And Target.Row >= 3 Then
With Me.TextBox1
.Visible = True
.Top = Target.Top
.Left = Target.Left
.Width = Target.Width
.Height = Target.Height
End With
With Me.ListBox1
.Visible = True
.Top = Target.Top + Target.Height
.Left = Target.Left + 10
.Width = Target.Width * 6
.Height = Target.Height * 8
End With
Else
Me.ListBox1.Clear
Me.TextBox1 = ""
Me.ListBox1.Visible = False
Me.TextBox1.Visible = False
End If
End If
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error Resume Next
Dim i As Integer
Dim Language As Boolean, arr1 As Variant, arr2 As Variant, arr3 As Variant, arr4 As Variant
Dim myStr As String, str_B As String

Me.ListBox1.Clear
With Me.TextBox1
For i = 1 To Len(.Value)

If Asc(Mid$(.Value, i, 1)) > 255 Or Asc(Mid$(.Value, i, 1)) < 0 Then
Language = True
myStr = myStr & Mid$(.Value, i, 1)
Else
myStr = myStr & UCase(Mid$(.Value, i, 1))
End If
Next
End With
With Sheet2 '预设值工作表
arr1 = .Range("j2:j" & .Range("j400").End(xlUp).Row)

For i = 1 To .Range("j400").End(xlUp).Row - 1
If InStr(arr1(i, 1), myStr) Then
Me.ListBox1.AddItem arr1(i, 1)
End If
Next i
End With
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next
Dim rng As Range
Set rng = ActiveCell
Dim str As String
str = ListBox1.Value

If str <> "" And InStr(str, ";") Then
Dim arr
arr = Split(str, ";")
rng.Offset(0, -1).Value = arr(1)
rng.Value = arr(0)
Else
rng.Value = str
End If
rng.Value = Mid$(rng.Value, 1, 6)

Me.ListBox1.Clear
Me.TextBox1 = ""
Me.ListBox1.Visible = False
Me.TextBox1.Visible = False
End Sub
...全文
1731 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ie4888 2016-12-08
  • 打赏
  • 举报
回复
没说清楚。 1、在工序代码单元格输入字母、数字,即时弹出列表框供选择,列表框的内容随着输入动态的改变,来源是另一张表的某一列经过匹配包含已经输入内容的。 2、双击自动填入工序代码(不需要在继续输入全部代码) 3、分号后面是该工序代码的解释,便于其他人理解。 结果: 每次打开表格,输入时,可以弹出列表框,但是有时动态更新选项,有时列表框没有内容。 好久不用VBS,忘得差不多了。
X-i-n 2016-12-06
  • 打赏
  • 举报
回复
你的预设值有专门一张表?如果这样的话,可以用thisworkbook里的Workbook_SheetActivate(ByVal Sh As Object)来触发更新
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 If Not (Sh Is Sheet2) Then
    '更新listbox
 End If
End Sub
X-i-n 2016-12-06
  • 打赏
  • 举报
回复
没有报错的话,基本可以确定是逻辑问题,你预期会发生动作的时候,其实它运行到业务分支之外了,可以在分支之前,捕获一下判断条件的实际值 比如:selectionchange的时候,If Target.Count = 1 Then 这一句前面,可以debug.? target.count。 再比如 if Target.Column = 6 And Target.Row >= 3 then这一句前面,可以插一句 debug.? target.column,target.row 以上是从排查问题的角度给的建议,另外还想了解一下你的业务逻辑 不太明白你的textbox1具体指的是什么东西,一个文本框? 根据ASC结果进行UCASE转换的时候,是考虑非英文的情形吗?我测了一下 Ucase("中aB1以c") = "中AB1以C",这儿应该不需要额外做这个判断,直接取UCASE就可以。如果我说错了请无视 另外还有一个地方,ListBox1_DblClick的时候,你的split分割符用的是分号,但是我看你的J列里面是 [编号]冒号[内容]的格式,不知道是不是手滑了 关于你的业务逻辑这块,我猜你是想通过textbox里keyup来更新list,其实你可以直接用Worksheet_Change来触发更新,通过判断target的位置来决定是否要更新这个表
ie4888 2016-12-06
  • 打赏
  • 举报
回复
注释掉on error,结果还是一样,也没有报异常错误。总是调试不好,头痛。
X-i-n 2016-12-06
  • 打赏
  • 举报
回复
有可能遇到异常了,需要把 On Error Resume Next 注释掉再看。 一般在项目进行中的时候,是不加这个的

6,210

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office应用
社区管理员
  • Microsoft Office应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧