0

簡単な例:

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

strセルの最初の 3 文字として、最初の範囲オブジェクトを行 2 に格納したいと考えています。

これは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)
4

2 に答える 2

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
于 2013-08-30T11:23:58.410 に答える
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(...)など)

関数を使用すると、ハードコーディングを回避できます ( bad bad bad )!

注意事項:For Each ... In ... Next 厳密に順次処理を保証するものではありませんが、中程度のサイズの 1 次元範囲で使用する場合は常にかなり安全であることがわかりました。絶対に確実にしたい場合は、インデックス変数を導入して単純なFor ... Nextループを使用する必要があります。

于 2013-08-30T10:58:15.283 に答える