Rogerは、リスト内の値の出現間隔を計算する方法があるかどうか尋ねました。たとえば、彼の列Aには数千の数字があります。セルA351の値を見ると、その値がリストで最後に発生したのはセルA246でした。彼は、セルB351に配置して、351と246の差である105を返すことができる数式を望んでいます。

このアプローチは、Excelが列を上に向かって逆方向に検索するのがあまり得意ではないため、Excelで実装するのは困難です。前提を逆にすることができれば、タスクははるかに簡単になります。たとえば、セルB246の数式が値105を返す場合、最後の出現を計算する代わりに、セルA246の値が次に出現するまでの間隔を示します。次の数式は、セルA1の値の次の出現を計算します:

=MATCH(A1,A2:$A$65536,0)

この数式をセルB1に配置し、コピーします。ただし、多くのセルが必要です。列Aの値が列に再び出現しない場合、数式は#N / Aエラーを返します。数式で0を返したい場合は、次のように機能します。

=IF(ISNA(MATCH(A1,A2:$A$65536,0)),0,MATCH(A1,A2:$A$65536,0))

絶対に上向きにカウントする必要がある場合(次のオカレンスではなく前のオカレンスを見つける)、それを行う最も簡単な方法はユーザー定義関数を使用することです。次の関数RowIntervalは、指定した範囲を逆方向に調べて、目的の間隔を返します。

Function RowInterval(TestCell As Range, LookHere As Range) As Long     Dim varValue As Variant     Dim lngRow As Long

Application.Volatile     varValue = TestCell.Value          'Check for occurrences of the test value in the search range     If WorksheetFunction.CountIf(LookHere, varValue) > 0 Then         With LookHere             'Get the last row of the search range             lngRow = .Row + .Rows.Count - 1             'Start with the last cell in the search range and work up             Do Until .Item(lngRow, 1).Value = varValue                 lngRow = lngRow - 1             Loop         End With         'Subtract the number of the row containing the found occurrence         'from the number of the row containing the test value         RowInterval = TestCell.Row - lngRow     End If End Function

この関数を使用するには、セルB2に次の数式を入力し、その数式を目的のセルの数だけコピーします。

=RowInterval(A2,A$1:A1)

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(2338)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。