基本的に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(...)
など)
関数を使用すると、ハードコーディングを回避できます ( bad bad bad )!
注意事項:For Each ... In ... Next
厳密に順次処理を保証するものではありませんが、中程度のサイズの 1 次元範囲で使用する場合は常にかなり安全であることがわかりました。絶対に確実にしたい場合は、インデックス変数を導入して単純なFor ... Next
ループを使用する必要があります。