集成服务中心经常要做项目预算,其中涉及到很多的存货信息,并且采购部据此进行采购,销售管理组据此录入销售订单,因此没有统一的存货编码和存货名称是肯定不行的。为此,我在网上查阅了一些资料,设计了一个模糊参照存货信息,弹出列表框进行选择的小程序,以提高各部门工作效率。此程序有两个工作表,一个是存货档案,可以连到用友账套数据库实时更新,一个是参照选择的工作表,只需输入查询关键字,例如:IBM,程序就会弹出一个列表框,显示存货编码、或存货名称、或存货规格型号中含有IBM的存货信息,不区分大小写。双击即可选定到工作表中。设计过程中曾遇到一些小问题:
1、大小写问题。后来查到UCASE函数,于是在代码中将条件与查询关键字都转成大写再查询即可。
2、在三个字段中查询。一开始用 where 存货编码+品名+规格型号 like '%关键字%',结果有误,后改为:where 条件1 or 条件2 or 条件3即可。
3、给窗体赋予多条记录。想起做网页的时候曾用过rs.MoveNext,搬过来用上,结果搞定!
关键代码如下:
''参照查询工作表代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row > 6 Then
Target.Select
h = Selection.Row
If Range("a" & h) = "" Then Exit Sub
UserForm2.Show (vbModeless)
Else
Exit Sub
End If
End Sub
''USERFORM窗体代码:
Private Sub UserForm_Initialize()
a2 = UCase(Selection)
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim mySheet As String
Dim n As Integer
Dim SQL As String
Dim cnnStr As String
Dim myWbName As String
Dim ws As Worksheet
myWbName = ThisWorkbook.FullName
mySheet = Worksheets("存货档案").Name
h = Selection.Row
cnnStr = "Provider=microsoft.jet.oledb.4.0;" _
& "Extended Properties=Excel 8.0;" _
& "Data Source=" & myWbName
cnn.Open cnnStr
SQL = "select [存货编码],[品名],[规格型号] from [" & mySheet & "$] where UCASE(存货编码) like '%" & UCase(Range("A" & h)) & "%' or UCASE(品名) like '%" & UCase(Range("A" & h)) & "%' or UCASE(规格型号) like '%" & UCase(Range("A" & h)) & "%' order by 存货编码"
rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic
n = rs.RecordCount
For i = 1 To n
If rs.EOF = False Then ListBox1.AddItem (rs(0) & " " & rs(1) & " " & rs(2))
rs.MoveNext
Next i
End Sub
2010-3-29 发现上述代码造成EXCEL关闭时自动弹出宏密码框,原因未知,于是考虑改进的方法,最终简化并改进为:
Private Sub UserForm_Initialize()
a2 = UCase(Selection)
With Worksheets("存货档案")
ed = .[b65536].End(xlUp).Row
For i = 2 To ed
If InStr(UCase(.Range("a" & i)), a2) + InStr(UCase(.Range("a" & i)), a2) + InStr(UCase(.Range("c" & i)), a2) > 0 Then ListBox1.AddItem (.Range("a" & i) & " " & .Range("b" & i) & " " & .Range("c" & i))
Next i
End With
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next
a1 = ListBox1.Value
h = Selection.Row
l = InStr(a1, " ")
Selection.Value = Left(a1, l - 1)
a1 = Mid(a1, l + 1)
l = InStr(a1, " ")
Range("D" & h) = Left(a1, l - 1)
Range("E" & h) = Mid(a1, l + 1)
Unload UserForm2
End Sub
Private Sub ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
a1 = ListBox1.Value
h = Selection.Row
l = InStr(a1, " ")
Selection.Value = Left(a1, l - 1)
a1 = Mid(a1, l + 1)
l = InStr(a1, " ")
Range("D" & h) = Left(a1, l - 1)
Range("E" & h) = Mid(a1, l + 1)
Unload UserForm2
End Sub
最终效果如下:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。