【问题标题】:Searching for multiple values using VBA in Excel在 Excel 中使用 VBA 搜索多个值
【发布时间】:2012-05-04 19:32:35
【问题描述】:

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

问题: Excel有它的搜索功能,如果有很多可用的值或者你必须找到一个离A列很远的值,那就很痛苦了。

我想要这样的东西

我可以在其中通过标题名称指定要显示的列。以我想要的方式重新排列列,并能够复制和粘贴。像 Visual Basic 中的数据网格? 有可能吗?

【问题讨论】:

  • VBA 和 VB.Net 都可以。你要哪一个?
  • 如果可以在VB中完成。网络作为选项卡(插件)i47.tinypic.com/tsoj.png - 这是最好的

标签: vb.net search excel vba


【解决方案1】:

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

使用 VB.NET

在您的 VB.net 窗体上放置一个 DataGridView 并放置一个按钮。将此代码放在按钮中

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

你完成了:)

快照

我正在使用有限的数据。

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

编辑

如果您想知道如何在 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

快照

更多跟进

您好 Siddharth,非常感谢您提供这两个代码。对于 VB。净是美妙的。对于 Exel 中的 VBA,有什么方法可以复制(使用 Ctrl + C)来复制数据 - 单行就可以了,尽管复制多行更可取。我可以用文本框 i49.tinypic.com/2ceq3yf.jpg – user1370854 5 小时前替换“Test1”

是的,可以将列表框中的单个选定项或多个选定项复制到剪贴板。要使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

【讨论】:

  • @user1370854:更新了上面的帖子:)
  • 线索:.AutoFilter Field:=1, Criteria1:="Test1" ;)
  • @user1370854:如果您想搜索 PN5,则 Field 变为 2,Criteria1 变为 PN5。字段是您要设置条件的列号:)
  • 是否要在 Userform 的筛选值中搜索文本?
  • 这是你正在尝试的吗? Criteria1:="=*Test*"
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多