2017-08-29 1 views
2

ワークシートに特定の列ヘッダーのオカレンスを見つけようとしています。たとえば ヘッダー名payout dateの場合は、ワークシートの中で、第1発生セルアドレス、第2発生セルアドレス、第3発生セルアドレス、第4発生セルアドレスのように、payout dateを見つける必要があります。それがあれば感謝します。以下のコードは、それをOMMITまたはそれを作る、ワークシートvbaの特定の列ヘッダーの1,2,3、および4番目のオカレンスを見つけよう

Sub find() 
d = "Payout Date" 
Set r = ThisWorkbook.ActiveSheet.UsedRange.find(d) 
Debug.Print r.Address 
Set r = ThisWorkbook.ActiveSheet.UsedRange.FindNext(d) 
Debug.Print r.Address 
Set r = ThisWorkbook.ActiveSheet.UsedRange.FindNext(d) 
Debug.Print r.Address 
Set r = ThisWorkbook.ActiveSheet.UsedRange.FindNext(d) 
Debug.Print r.Address 
End Sub 
+0

は、すべての特定の列または行のヘッダはありますか? –

+0

あなたの実際の出力は何ですか、あなたは何を期待しましたか?あなたの質問は何ですか、あなたは質問しませんでしたか?ドキュメントの例を見てみましたか?[Range.FindNext](https://msdn.microsoft。com/en-us/vba/excel-vba/articles/range-findnext-method-excel)は正しく動作しますか?それを実装する方法の完全な例があります。 –

+0

@ L.Dutchその1つの特定の列 – Ashok

答えて

2

後は役に立つかもしれません。

Sub Demo() 
    Dim ws As Worksheet 
    Dim i As Long, cnt As Long 
    Dim rng As Range, rng2 As Range 
    Dim cellFound As Range 

    Set ws = ThisWorkbook.Sheets("Sheet1") 'change Sheet1 to your data sheet 
    Set rng = ws.Range("1:1") 'assuming headers are in row 1 else change 1 to row number with headers 
    Set rng2 = rng(1, Columns.Count) 
    cnt = 3    'number of occurrences to find 
    i = 1 
    With rng 
    Set cellFound = .find(what:="ID", After:=rng2, LookIn:=xlValues) 
     If Not cellFound Is Nothing Then 
      firstAddress = cellFound.Address 
      Do 
       Debug.Print "Occurrence " & i & " : " & cellFound.Address 
       i = i + 1 
       If i > cnt Then: Exit Do 
       Set cellFound = .FindNext(cellFound) 
      Loop While cellFound.Address <> firstAddress 
     End If 
     End With 
End Sub 

参照のために画像を参照してください。

enter image description here

+0

私は行A1から最後のセルに同様のものを取得しようとしていました。しかし、私は5番目に2番目の発見を得ていた。最初から最後までではありません。あなたと同じように、この部分を変更するだけです。ループではなく、cF.Address <> FirstAddressとi <= cnt'と 'cnt = 4'です。 – danieltakeshi

+0

あなたの公式を使用して私はまだ '出現1:$ A $ 2を持っています オカレンス2:$ A $ 3出現3:$ A $ 4出現3:$ A $ 4 出現4:$ A $ 5'を' Set rng = ws.Columns(1)最初のオカレンスが範囲の最初のセルである場合は動作しません – danieltakeshi

+0

@ダニエル・タケシ - 私にチェックさせてください。 – Mrig

1

FindNext方法はRangeタイプのオプションの引数を持つ正しく動作しません:

Set r = ThisWorkbook.ActiveSheet.UsedRange.FindNext(r) 
1

これはおそらく、私が一日数回やっものです。したがって、私は簡単に共有できるカスタム関数を作成しました。あなたが改善のためのアイデアを持っているなら、私はそれらを聞いて喜んでいます。

この

が関数である:あなたがアクティブシートの行1の最初の値を取得したい場合は、このように

Public Function fnLngLocateValueCol(ByVal strTarget As String,    
        ByRef wksTarget As Worksheet, _ 
        Optional lngRow As Long = 1, _ 
        Optional lngMoreValuesFound As Long = 1, _ 
        Optional blnLookForPart = False, _ 
        Optional blnLookUpToBottom = True) As Long 

    Dim lngValuesFound   As Long 
    Dim rngLocal    As Range 
    Dim rngMyCell    As Range 

    fnLngLocateValueCol = -999 
    lngValuesFound = lngMoreValuesFound 

    With wksTarget 
     Set rngLocal = .Range(.Cells(lngRow, 1), .Cells(lngRow, Columns.Count)) 
    End With   

    For Each rngMyCell In rngLocal 
     If blnLookForPart Then 
      If strTarget = Left(rngMyCell, Len(strTarget)) Then 
       If lngValuesFound = 1 Then 
        fnLngLocateValueCol = rngMyCell.Column 
        If blnLookUpToBottom Then Exit Function 
       Else 
        Call Decrement(lngValuesFound) 
       End If 
      End If 
     Else 
      If strTarget = Trim(rngMyCell) Then 
       If lngValuesFound = 1 Then 
        fnLngLocateValueCol = rngMyCell.Column 
        If blnLookUpToBottom Then Exit Function 
       Else 
        Call Decrement(lngValuesFound) 
       End If 
      End If 
     End If 
    Next rngMyCell  

End Function 

、あなたは次のように呼び出す:

fnLngLocateValueCol("valueToSearchFor",ActiveSheet) 

第二の値について、あなたは次のように呼び出す:

:あなたはこのように呼んで最後の値については

?fnLngLocateValueCol("valueToSearchFor",ActiveSheet,lngMoreValuesFound:=2) 

?fnLngLocateValueCol("valueToSearchFor",ActiveSheet,blnLookUpToBottom:=false) 

あなたが列にValueToSearchForを持っている場合は、で始まるものを探すことにより、同様にそれを見つけることができます。あなたが探してされている

?fnLngLocateValueCol("Value",ActiveSheet,blnLookForPart:=True) 

行は、また、オプションのパラメータ(lngRow)で、それはトップではないとき値1

lngRowためのオプションのパラメータは(もあります。このような行)またはblnLookForPart、あなたが部品を探しているとき。 -999は、値が見つからないコードです。

これまでのところ、いくつかのVBAアプリケーションで6ヶ月以上働いています。コード内で参照されるルーチンDecrementは、以下れる


Public Sub Decrement(ByRef value_to_decrement As Variant, Optional l_minus As Double = 1) 
    value_to_decrement = value_to_decrement - l_minus 
End Sub 
関連する問題