ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1309|回复: 2

[转帖] 支持拼音首字母的组合框函数及实例

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-8 17:39 | 显示全部楼层 |阅读模式
http://blog.sina.com.cn/s/blog_553027290100e870.html
Public Function ComboBoxKeyPress(KeyAscii As Integer) As String
'调用方法 在组合框的keypress方法中加入:
'--------------------------------------------
' If ComboBoxKeyPress(KeyAscii) <> "" Then KeyAscii = 0
'--------------------------------------------
On Error GoTo Err
Dim i As Integer
With Screen.ActiveControl
If .ControlType = acComboBox And (KeyAscii >= Asc("a") And KeyAscii <= Asc("z")) Then
'只能由组合框输入小写字母时调用
ComboBoxKeyPress = Nz(HZPY(Left(.Text, .SelStart))) & Chr(KeyAscii)
While HZPY(Left(.ItemData(i), .SelStart + 1)) <> ComboBoxKeyPress And i < .ListCount - 1
i = i + 1
Wend
If i <> .ListCount And Mid(.ItemData(i), .SelStart + 1, 1) <> Chr(KeyAscii) Then
ComboBoxKeyPress = Left(.ItemData(i), .SelStart + 1)
.Value = Null
SendKeys ComboBoxKeyPress
Else
ComboBoxKeyPress = "" '为英文时不代换,否则会进入死循环
End If
End If
End With
Exit Function
Err:
ComboBoxKeyPress = ""
End Function
Function HZPY(hzstr As String) As String
Dim p0 As String, C As String, str As String
Dim i As Integer, j As Integer
p0 = "吖八嚓咑妸发旮铪讥讥咔垃呣拿讴趴七呥仨他哇哇哇夕丫匝咗"
For i = 1 To Len(hzstr)
C = "z"
str = Mid(hzstr, i, 1)
If Asc(str) > 0 Then
C = str
Else
For j = 1 To 26
If Mid(p0, j, 1) > str Then
C = Chr(95 + j)
Exit For
End If
Next
End If
HZPY = HZPY + C
Next
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-8 17:40 | 显示全部楼层
取消方向键改变ComboBox显示项目的功能
很简单的方法就是,在ComboBox的KeyDown事件处理器中设置KeyEventArgs方法的Handled属性为True,这样按上下键时就无法选择项目了。
[VB.NET]

'ComboBox1的KeyDown事件处理器
Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.KeyEventArgs) _
    Handles ComboBox1.KeyDown
    If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then
         e.Handled = True
    End If
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-8 17:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在文本中框只能输入数字设定
下面介绍几种文本框(TextBox1)只能输入数字的方法。
注意:这里介绍的方法,并不是完全可以防止文本框只能输入数字。检测输入的是字符串还是数字,如果输入的是字符串时禁止输入,实现此设定就必须使用TextBox的Validating事件。
KeyPress事件的方法
下面的代码就是使用文本框的KeyPress事件来限制数字以外的输入
[VB.NET]

Private Sub TextBox1_KeyPress(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyPressEventArgs) _
        Handles TextBox1.KeyPress
    If e.KeyChar < "0"c Or e.KeyChar > "9"c Then
         e.Handled = True
    End If
End Sub
补充:「e.KeyChar < '0' || e.KeyChar > '9'」(VB.NET是「e.KeyChar < "0"c Or e.KeyChar > "9"c」)的条件,可以写成「!Char.IsDigit(e.KeyChar)」(VB.NET是「Not Char.IsDigit(e.KeyChar)」)。
补充:从.NET Framework 2.0版本开始,设置KeyDown事件处理器的KeyEventArgs.SuppressKeyPress属性为True时,键的输入变为无效了。设置KeyDown事件处理器的SuppressKeyPress属性为True时,就会触发KeyPress事件。
如果想增加可输入的字符时,在If文里增加相应的条件就可以了。下面的例子是增加Back Space键的方法。
[VB.NET] Private Sub TextBox1_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress If (e.KeyChar < "0"c Or e.KeyChar > "9"c) And e.KeyChar <> vbBack Then e.Handled = True End If End Sub

补充:如果想检测输入的字符是否被限制时,可以使用「Char.IsControl(e.KeyChar)」来检测。
如何防止IME的连接和从剪切板粘贴
向剪贴板复制数字以外的字符串。防止从剪贴板粘贴的方法有详细的说明。这里来介绍一下WM_PASTE信息无视的方法,下面的代码是无法粘贴剪贴板里数字以外字符的方法。
[VB.NET] ''' <summary> ''' 设置TextBox数字以外输入不可 ''' </summary> Public Class MyTextBox Inherits TextBox Private WM_PASTE As Integer = &H302 Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_PASTE Then Dim iData As IDataObject = Clipboard.GetDataObject() '检测剪贴板是否有字符串 If iData.GetDataPresent(DataFormats.Text) Then Dim clipStr As String = _ CStr(iData.GetData(DataFormats.Text)) '检测剪贴板的字符串是文字还是数字 If Not System.Text.RegularExpressions.Regex.IsMatch( _ clipStr, "^\d+$") Then Return End If End If End If MyBase.WndProc(m) End Sub End Class

NumericUpDown控件的使用方法
不使用文本框时,可以考虑使用NumericUpDown控件。但是,这种情况下当IME有效的时候文字也能输入,复制和粘贴也可以使用。当数字以外的文字被输入的时候,在Value属性取得值的时候,返回之前输入的数字,并且那个数字也被NumericUpDown所表示。
CreateParams的重载方法
下面再介绍一种方法。给CreateParams.Style追加ES_NUMBER。但是这种方法也可以使用复制和粘贴的方法输入。
[VB.NET] ''' <summary> ''' 只能输入数字的TextBox ''' </summary> Public Class NumericTextBox Inherits TextBox Private ES_NUMBER As Integer = &H2000 Protected Overrides ReadOnly Property CreateParams() As CreateParams Get Dim parms As CreateParams = MyBase.CreateParams parms.Style = parms.Style Or ES_NUMBER Return parms End Get End Property End Class
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 11:38 , Processed in 0.024039 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表