2013-12-13 112 views
0

這是我第一次參加這個論壇。我是一個'新手'在Excel VBA中,並會很感激,如果任何人都可以提供幫助。Excel中的複選框搜索VBA

我試圖建立一個複選框搜索頁面,其中:

  • 用戶可以使用複選框選擇最多4項搜索(在「搜索」工作表)
  • 在數據表時,數據被記錄(由列)如下:

碼本項材料1的百分比1種材料2的百分比2物質3 3百分率材料4的百分比4

  • 一個項目,例如「聚酯」將出現在欄目材料1',2等等中,具體取決於記錄
  • 如果檢查多個關鍵字,則搜索應基於在搜索頁面中檢查的複選框
  • 。滌綸,羊毛,棉花,那麼只應該顯示所有3個關鍵字的行

我已經在網上搜索了很多帖子,如果找到關鍵字,他們會刪除行。有什麼辦法可以扭轉邏輯並適用於這種特殊情況嗎?

被卡住了很多天...感激,如果有人可以幫助!

更新1:我設法找到了一些在互聯網上刪除行,如果某些關鍵字被發現 - 但是 - 我想做相反的事情(這會讓我剩下的正確的,而不是...)

如下

代碼 - 這可能改變?:

Sub Example1() 

    Dim varList As Variant 
    Dim lngarrCounter As Long 
    Dim rngFound As Range, rngToDelete As Range 
    Dim strFirstAddress As String 

    Application.ScreenUpdating = False 

    varList = VBA.Array("Here", "There", "Everywhere") 

    For lngarrCounter = LBound(varList) To UBound(varList) 
     With Sheet1.UsedRange 
      Set rngFound = .Find(_ 
           What:=varList(lngarrCounter), _ 
           Lookat:=xlWhole, _ 
           SearchOrder:=xlByRows, _ 
           SearchDirection:=xlNext, _ 
           MatchCase:=True) 

      If Not rngFound Is Nothing Then 
       strFirstAddress = rngFound.Address 

       If rngToDelete Is Nothing Then 
        Set rngToDelete = rngFound 
       Else 
        If Application.Intersect(rngToDelete, rngFound.EntireRow) Is Nothing Then 
         Set rngToDelete = Application.Union(rngToDelete, rngFound) 
        End If 
       End If 

       Set rngFound = .FindNext(After:=rngFound) 

       Do Until rngFound.Address = strFirstAddress 
        If Application.Intersect(rngToDelete, rngFound.EntireRow) Is Nothing Then 
         Set rngToDelete = Application.Union(rngToDelete, rngFound) 
        End If 
        Set rngFound = .FindNext(After:=rngFound) 
       Loop 
      End If 
     End With 
    Next lngarrCounter 

    If Not rngToDelete Is Nothing Then rngToDelete.EntireRow.Delete 

    Application.ScreenUpdating = True 
+1

[* autofilter以數組爲標準*](http://www.ozgrid.com/VBA/autofilter-vba-criteria.htm) – 2013-12-13 10:30:57

+0

謝謝!但是,如果複選框被選中,你如何添加自動過濾器?爲了添加更多的信息,我有'搜索'工作表 - 用戶可以檢查這些框並鏈接到單元格列,如果他們被檢查,則生成true。我想在'Search Res'表格中使用這些選中的值作爲過濾器過程。 – user3098861

+0

先創建一個數組。在複選框上循環,如果他們被檢查,然後將他們的值(文本)添加到數組。 – 2013-12-16 10:53:49

回答

0

也許你可以試試Sheets("Search").Cells.Find([keyword])命令,它是類同的CTRL + L鍵。

如果你想搜索超過1名的關鍵字,可以使用以下循環:

dim i as Integer 
dim vTemp as Variant 
dim strFind as String 
dim objSearch as Object 

strFind = range("searchField").value 
vTemp = split(strFind, ",") 

for i =0 to Ubound(vTemp) 
    Set objSearch = Sheets("Search").Cells.Find(vTemp(i)) 
    'Do whatever you like to the object of search 
next i 

我希望我能幫上忙。

+0

感謝您的建議 - 但事情是如果它的條件(即只搜索如果複選框的值是真的),然後我堅持把它們放入vba語言中...... – user3098861

+0

這取決於您是否使用過ActiveX工具(僅適用於2007年或後來的Office)或普通工具。 ActiveX更容易,只需要輸入「if sheets(i).checkboxname then ...」。對於普通的Excel工具,您可以將複選框鏈接到單元格值並將該單元格用作參數。我沒有寫出你需要的完整代碼,儘管這些命令應該足以解決你的問題。 – Rafaell