2013-08-30 26 views
-1

快速例如:VBA的Excel匹配或找到的子串

A  B  C  D  E  F 
1   
2     str1 str2 str3 str4 

我要存儲所述第一範圍的對象時,在第2行,同str作爲單元的前三個字符。

這可能在VBA中嗎?

這就是我想實現:

Dim rng As Range 
Dim colNr as integer 
colNr = WorksheetFunction.Match(left(cell.value,3)="str", .range("2:2"), 0) 
set rng = Sheets("Sheet1").cells(2,colNr) 
+0

爲什麼向下票呢?解釋一下 – karamell

回答

0

你已經很接近:

Dim rng As Range 
Dim colNr as Long 
With Sheets("Sheet1") 
    colNr = WorksheetFunction.Match("str*", .range("2:2"), 0) 
    set rng = .cells(2,colNr) 
End With 
0

從根本上說,我會用一個For Each ... In ... Next循環,在第一次發現中斷。這裏是沒有太多的錯誤檢查工作草案(TargetRange只有1行,TargetCell是一個字符串,用Ucase/LCASE,等...):

Function FirstMatch(TargetRange As Range, SearchString As String) As Variant 
Dim TargetCell As Range 

    ' if we don't find any, we return a #N/A error value 
    FirstMatch = CVErr(xlErrNA) 

    For Each TargetCell In TargetRange.Cells 
     If InStr(1, TargetCell, SearchString) Then 
      ' returning the value of first find 
      ' FirstMatch = TargetCell 

      ' returning the column position relative to the first cell in selected range 
      FirstMatch = TargetCell.Column - TargetRange(1, 1).Column + 1 
      Exit Function 
     End If 
    Next TargetCell 

End Function 

使用您的情況是:

A2 :=FirstMatch(C2:F2, "str")

修改If ...狀況根據自己的需要(如Left(...)等)

使用功能,您避免硬編碼(壞壞壞)!

謹慎一句:Allthough For Each ... In ... Nextdoesn't guarantee a strictly sequential processing我一直覺得很安全,而中等大小的1維範圍使用時。如果你想確定你需要引入一個索引變量並使用一個普通的循環。