在Excel中使用VBA搜索多个值

时间:2012-05-04 19:32:36

标签: vb.net excel search excel-vba vba

我不知道是否可以在VBA中实现此问题,或者必须使用VB完成此问题。使用Visual Studio进行网络。

问题: Excel具有搜索功能,如果有许多可用值,或者您必须找到远离A列的值,则会很痛苦。

enter image description here

我想有类似的东西

enter image description here

我可以在其中指定我想通过其标题名称显示的列。按照我想要的方式重新排列列,以及复制和粘贴的能力。像Visual Basic中的datagrid一样? 有可能吗?

1 个答案:

答案 0 :(得分:4)

我在下面给出了两种方法 - VBA和VB.net(随你选择):)

使用VB.NET

在VB.net表单上放置一个DataGridView,并放置一个Button。将此代码放在Button

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim masterTable As New DataTable

        Dim cnnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=NO"";Data Source=""{0}"";"

        Using da As New OleDb.OleDbDataAdapter("select * from [Sheet1$] Where F1 = 'Test1'", String.Format(cnnStr, "C:\Book1.xlsx"))
            da.Fill (masterTable)
        End Using
        DataGridView1.DataSource = masterTable
    End Sub
End Class

你完成了:)

<强>快照

我使用的数据有限。

enter image description here

您还可以将字符串"select * from [Sheet1$] Where F1 = 'Test1'"更改为"select F1 as Name,F2 as PN, F3 as [Inventory Loc] from [Sheet1$] Where F1 = 'Test1'"以显示如下标题

enter image description here

修改

如果您想知道如何在VBA中执行此操作

使用VBA

在表单上放置一个列表框和一个命令按钮,然后使用此代码。

Option Explicit

Private Sub CommandButton1_Click()
    Dim ws As Worksheet, ws1 As Worksheet
    Dim rng As Range
    Dim lastRow As Long
    Dim Ar As Variant

    Set ws = Sheets("Sheet1")

    lastRow = ws.Cells.Find(What:="*", After:=ws.Range("A1"), _
              Lookat:=xlPart, LookIn:=xlFormulas, _
              SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
              MatchCase:=False).Row

    Set rng = ws.Range("A1:C" & lastRow)

    Set ws1 = Sheets.Add

    With rng
        ws.AutoFilterMode = False
        .AutoFilter Field:=1, Criteria1:="Test1"
        .SpecialCells(xlCellTypeVisible).Copy ws1.Range("A1")
        ws.AutoFilterMode = False

        lastRow = ws1.Cells.Find(What:="*", After:=ws1.Range("A1"), _
                  Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _
                  SearchDirection:=xlPrevious, MatchCase:=False).Row

        Ar = ws1.Range("A1:C" & lastRow)

        Application.DisplayAlerts = False
        ws1.Delete
        Application.DisplayAlerts = True
    End With

    With Me.ListBox1
        .Clear
        .ColumnHeads = False
        .ColumnCount = 3
        .List = Ar
        .ColumnWidths = "50;50;50"
        .TopIndex = 0
    End With
End Sub

<强>快照

enter image description here

更多关注

  

嗨Siddharth,非常感谢你们这两个代码。对于VB。网很精彩。对于Exel中的VBA,有什么方法可以复制(使用Ctrl + C)来复制数据 - 单行会很好,尽管复制多行是更理想的。我可以用textbox i49.tinypic.com/2ceq3yf.jpg替换“Test1” - user1370854 5小时前

是的,可以将列表框中的单个选定项目或多个选定项目复制到cliboard。要使listobx多选,在设计模式下,将列表框的属性设置为fmMultiSelectMulti1。下一步添加命令按钮并粘贴此代码。

此代码再次基于我上面使用的数据,因此请根据需要进行修改。当您按下Copy按钮时,数据将被复制到剪贴板,然后您只需使用CTL V将数据粘贴到您想要的位置;例如在记事本中。

Private Sub CommandButton2_Click()
    Dim MyData As DataObject
    Dim i As Long
    Dim strCopiedText As String

    Set MyData = New DataObject

    With Me.ListBox1
        For i = 1 To .ListCount
            If .Selected(i - 1) Then
                strCopiedText = strCopiedText & _
                                .List(i - 1, 0) & vbTab & _
                                .List(i - 1, 1) & vbTab & _
                                .List(i - 1, 2) & vbCrLf
            End If
        Next i

        If Len(strCopiedText) > 0 Then
            MyData.Clear
            MyData.SetText strCopiedText
            MyData.PutInClipboard
            MsgBox "Data copied to clipboard"
        End If
    End With
End Sub

enter image description here