2012-05-04 42 views
2

我不知道在VBA中是否可以實現此問題,或者它必須使用VB完成。使用Visual Studio的網絡。在Excel中使用VBA搜索多個值

問題: Excel有它的搜索功能,這是一個痛苦,如果有許多可用的價值,或者你必須找到一個值,遠離A列

enter image description here

我想有什麼這樣

enter image description here

在這我可以指定我想通過自己的頭名,以顯示哪些列。以我想要的方式重新排列列,並且可以複製和粘貼。像Visual Basic中的datagrid一樣? 這可能嗎?

+1

它可以同時在VBA和VB.Net來完成。你想要哪一個? –

+0

如果可以在VB中完成。作爲一個選項卡網絡(插件)http://i47.tinypic.com/tsoj.png - 這是最好的 – NCC

回答

4

我已經給下面兩種方法 - VBA和VB.net(隨你挑):)

使用VB.NET

將一個DataGridView您VB.net表上,也發生一個按鈕。將此代碼放置在按鈕

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)來複制數據 - 雖然複製多行是更可取的,但單行將會很好。我可以用文本框i49.tinypic.com/2ceq3yf替換「Test1」。jpg - 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

+0

嗨Siddharth,非常感謝你的代碼。對於VB。網絡是美好的。對於Exel中的VBA,有沒有什麼方法可以複製(使用Ctrl + C)來複制數據 - 雖然複製多行是更可取的,但單行將會很好。我可以用文本框替換「Test1」http://i49.tinypic.com/2ceq3yf.jpg – NCC

+1

@ user1370854:更新了上面的帖子:) –

+0

Siddharth,非常感謝 – NCC