EXCEL VBA 窗体设计,如何实现查询前一条记录和后一条记录的功能。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXCEL VBA 窗体设计,如何实现查询前一条记录和后一条记录的功能。相关的知识,希望对你有一定的参考价值。

在用EXCEL做一个工资管理系统,界面上按下“查询按钮”后查找后台数据表中与组合框“结算期间”和文本框“证件号码”相符的记录,把查找到的记录赋值给标签控件的caption属性显示,同时根据查找到的数据所在行号,逐条浏览本期间(年,月)内所有的记录。

现在的问题是,我已经实现了查询功能,但没有办法实现“上一条”和一“条”的查找功能。
下面是我写的“查询”按钮的代码:

Private Sub cmdcx_Click() '按期间和证件号查询
Dim qj As String '取期间的年号和月号
qjh = Sheet2.UsedRange.Rows.Count '取记录总行号
If Len(cmbqj.Value) = 7 Then '期间的格式是“2012年1月”7个字符和“2013年10月”8个字符两种qjn = Val(Left(cmbqj.Value, 4))
qjy = Val(Mid(cmbqj.Value, 6, 1))
Else
qjn = Val(Left(cmbqj.Value, 4))
qjy = Val(Mid(cmbqj.Value, 6, 2))
End If
For qji = 2 To qjh '期间查询从第2行起到最后一行
If Val(Sheet2.Cells(qji, 3).Value) = qjn Then '如果年号相同查月 If Val(Sheet2.Cells(qji, 4).Value) = qjy Then '如果月号相同查证件
If Sheet2.Cells(qji, 8).Text = txtzjc.Text Then '如果证件相同
txtjsdhc.Enabled = True '激活结算单号文本框
txtjsdhc.Value = Cells(qji, 2).Value '将结算单号赋值给结算单号文本框
lblgze.Caption = Cells(qji, 10).Value '将基础工资额赋值给标签
lblgjb.Caption = Cells(qji, 11).Value
lbljjb.Caption = Cells(qji, 12).Value
lbldnb.Caption = Cells(qji, 13).Value
lblyjj.Caption = Cells(qji, 14).Value
lblbwy.Caption = Cells(qji, 15).Value
lblxj.Caption = Cells(qji, 16).Value
txtxmc.Enabled = True '激活姓名文本框
txtxmc.Value = Cells(qji, 7).Value '将姓名列值赋给姓名框
cmdpre.Enabled = True '激活前后浏览按钮
End If
End If
End If
Next
End Sub

请“知友”们给段程序能实现浏览前后条记录的功能。我的代码如果不合适,请指正。

思路:将点击查询按钮后,进行查询,将查询到的结果所在的行号保存到数组中,
点击上 下 按钮时候改变数组下标即可。
Dim R As Long
Dim Arr()
Private Sub CommandButton1_Click() '查询按钮
ReDim Arr(0)
For qji = 2 To qjh '期间查询从第2行起到最后一行
If Val(Sheet2.Cells(qji, 3).Value) = qjn Then '如果年号相同查月
If Val(Sheet2.Cells(qji, 4).Value) = qjy Then '如果月号相同查证件
If Sheet2.Cells(qji, 8).Text = txtzjc.Text Then '如果证件相同
Arr(UBound(Arr)) = qji '将查询到的行保存到数组
ReDim Preserve Arr(UBound(Arr) + 1)
End If
End If
End If
Next
If UBound(Arr) > 0 Then
显示 (R) '查询完成后显示第一条
Else
MsgBox "没有结果"
End If
End Sub

Private Sub CommandButton2_Click() '下一条 按钮
R = R + 1
If R > UBound(Arr) - 1 Then
MsgBox "已经是最后一条"
R = R - 1
Else
显示 (R)
End If
End Sub

Private Sub CommandButton3_Click() '上一条 按钮
R = R - 1
If R < 0 Then
MsgBox "已经是第一条"
R = R + 1
Else
显示 (R)
End If
End Sub

Function 显示(N As Long) '显示函数
R0 = Arr(N) '要显示的行
txtjsdhc.Enabled = True '激活结算单号文本框
txtjsdhc.Value = Cells(RO, 2).Value '将结算单号赋值给结算单号文本框
lblgze.Caption = Cells(RO, 10).Value '将基础工资额赋值给标签
lblgjb.Caption = Cells(RO, 11).Value
lbljjb.Caption = Cells(RO, 12).Value
lbldnb.Caption = Cells(RO, 13).Value
lblyjj.Caption = Cells(RO, 14).Value
lblbwy.Caption = Cells(RO, 15).Value
lblxj.Caption = Cells(RO, 16).Value
txtxmc.Enabled = True '激活姓名文本框
txtxmc.Value = Cells(RO, 7).Value '将姓名列值赋给姓名框
cmdpre.Enabled = True '激活前后浏览按钮
End Function
参考技术A 建议使用ADO连接查询SHEET2,可以方便地对记录集(查询结果)进行上移、下移操作追问

这个真不会。。。。能不能再给详细说下。

追答

留邮箱,发个文件给你

本回答被提问者采纳

vba 怎么实现在excel中搜索窗体textbox中的内容

vba 怎么实现在窗体textbox中输入内容,然后点击窗体按键,可以在sheet1的b列搜索含有textbox内容(含有,不是要完全一样)的单元格并返回?

参考如下问答:

如何让textbox中输入信息,在表格中搜索到,并实时显示在listbox中

功能描述如下,如附件中frame图所示,在textbox中输入一个人名,实时在一个表格(如附件表格图所示)中搜索此人名,并将搜索结果放到frame中的listbox中,搜索结果包括姓名,班级,性别。实时显示就是在textbox中输入后马上执行搜索并显示的任务,应该是在textbox的change方法中写代码。

根据textbox1里的值去查找,应该可以不用考虑使用字典的


Private Sub TextBox1_Change()
ListBox1.Clear
Set Rng = Sheets(1).Columns(2).Find(TextBox1.Text, lookat:=xlWhole)
If Not Rng Is Nothing Then
ListBox1.AddItem (Rng)
For j = Rng.Row + 1 To Sheets(1).Cells(Rows.Count, 2).End(3).Row
If Sheets(1).Cells(j, 2) = Rng Then
ListBox1.AddItem (Rng)
End If
Next j
End If
End Sub
根据textbox1的值查找    

参考技术A

这个还是挺简单的.如果你刚学VBA,可以直接用FOR循环遍历单元格,如何满足要求就显示出来.只是这样搜索速度会慢点,如果将整个工作表赋值给一个数组变量后,在数组中进行检索的话,速度将会大大提高
下图是我自己做的一个用来查询重量的窗体

参考技术B

搜索内容很简单,你是想以什么样的形式返回?

搜索的话遍历行就可以,参考下面的代码

listbox1.Clear
listbox1.AddItem("库位    在库数量")

 For j = 1 To 500 Step 1
            If Trim(thisWs.Cells(i, 1)) = Trim(textbox1)  and  instr(1,thisWs.Cells(i, 2),textbox2) >0 Then
                'thisWs.Cells(i, 2).Interior.ColorIndex = 3 '单元格颜色改成红色
                listbox1.AddItem(thisWs.Cells(i, 3)&"    "&thisWs.Cells(i, 4))'将符合条件的数据加入列表
                'Exit For 允许多条结果时不要这个
            End If
Next j

这段代码比较了第一列和textbox1相等,且第二列包含textbox2,变量名自己根据实际情况修改,遍历的行数也可以自己调整。

追问

谢谢大神,送花~
我想以listbox形式返回,listbox1中第一行固定格式为“库位”,“在库数量”,比如我搜“钻头”,“1.6”,在listbox1中第二行(第一行库位的下面)可以出现:AA1,“在库数量”下面出现24;
这个样子,如果在excel中搜索1.6不止1个数据,那么 在listbox的第3行,第4行......都以第二行的数据格式返回出来;

追答

代码又改了一下,listbox里增加数据就可以了。

追问

谢谢大神,很简练,有用。采纳了

本回答被提问者采纳
参考技术C Private Sub CommandButton1_Click()
Dim Rng As Range
With Application.Intersect(Sheet1.UsedRange, Sheet1.Range("A:A"))
    Set Rng = .Find(What:=Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
    If Not Rng Is Nothing Then
        firstAddress = Rng.Address
        Do
            If InStr(1, Rng.Offset(0, 1).Value, Me.TextBox2.Value, vbBinaryCompare) > 0 Then
                Sheet1.Activate
                Rng.Select
                Exit Sub
            End If
            Set Rng = .FindNext(Rng)
        Loop While Not Rng Is Nothing And Rng.Address <> firstAddress
    End If
End With
MsgBox "未找到"
End Sub

参考技术D

代码如下:

Private Sub CommandButton1_Click()
Dim MyRows As Integer
Dim MyFind As Boolean
With Excel.Application.ActiveWorkbook.Sheets("Sheet1")
   MyFind = False
   MyRows = 1
   Do While .Cells(MyRows, 1).Value <> ""
      If .Cells(MyRows, 1).Value = TextBox1.Text And .Cells(MyRows, 2).Value = TextBox2.Text Then
          MsgBox "你要的数据在第" & MyRows & "行!"
          MyFind = True
          Exit Do
      End If
      MyRows = MyRows + 1
   Loop
   If Not MyFind Then MsgBox "找不到你要的数据!"

End With
  
End Sub

运行时界面:

单击按钮后显示:

以上是关于EXCEL VBA 窗体设计,如何实现查询前一条记录和后一条记录的功能。的主要内容,如果未能解决你的问题,请参考以下文章

vba 怎么实现在excel中搜索窗体textbox中的内容

C# WPF制作窗体特效问题

Excel VBA入门用户窗体开发

如何在Excel VBA中定义一个在窗体控件和模块中均能使用的变量?

csv转excel,用vba实现

EXCEL VBA 窗体显示期间不执行下面代码,也不影响操作工作表?