Davidは、日付と各日付のポートフォリオ値の2つの列のみを含むワークシートを持っています。ワークシートには、1999年1月から現在までのすべての取引日の行があります。 Davidは、毎月最終取引日の行を除くすべての行を削除する必要があります。彼はフィルタリングを試みましたが、それは役に立たなかったので、彼は不要な行を削除するための最良の方法で混乱しています。

この問題に取り組む方法を提供する際に、私が焦点を当てる質問の鍵の1つは、Davidが彼のデータには「取引日ごとに行がある」と述べたことです。私にとって、これはいくつかの日付(非取引日)が彼のデータに含まれていないことを意味します。これは、行を保持するかどうかを決定する前に、日付が取引日であるかどうかを判断するソリューションを考え出す必要がないことを意味するため、重要です。

これは実際に仕事をはるかに簡単にします。これで、列Aの日付から、特定の月の最後の(または「最高の」)日付を実際に含む行を簡単に見つけることができます。まず、ヘルパー列に依存する手動アプローチに焦点を当てます。 Davidは、自分のデータは列A(日付)と列B(値)のみで構成されていると述べたので、列Cをヘルパー列として使用することをお勧めします。 (また、行1に列ヘッダーがあり、実際のデータは行2から始まると仮定します。)

日付が昇順になるようにデータが並べ替えられていることを確認し、セルC2に次の数式を入力します。

=IF(DAY(A3)<DAY(A2),"EOM","X")

この式をすべてのデータにコピーすれば、基本的には完了です。必要に応じて、列Cに基づくフィルタリングを使用できるようになりました。「EOM」を含む行のみが表示されるようにフィルタリングすると、各月の最終値が得られます。 「X」を含む行のみが表示されるようにフィルター処理すると、それらの行を削除してフィルターを削除し、データに月末の値を持つ行のみを含めることができます。

よくあることですが、私が提案するものの代わりに、列Cで使用できる数式がたくさんあります。ただし、これを提案したのは、非常に単純な比較であり、常にテスト可能であるためです。つまり、現在の日の後の行の値が「下がる」かどうかです。考えられるすべてのシナリオで、これは月末にのみ当てはまります。したがって、その行は「EOM」でマークされ、残りは「X」でマークされます。

別の数式を使用する場合は、列Aの日付がその月の最後の日であるかどうかをテストしない数式であることを確認してください。どうして?そうではない可能性があるため、Davidのデータでは、列Aに取引日の日付が含まれており、月の最終取引日がその月の最終日に当たらない可能性が非常に高いことを覚えておいてください。 (つまり、週末と休日は、定義上、Davidのデータから除外されます。)

Office 365(または最近のMicrosoftがMicrosoft 365と呼んでいるもの)を使用している場合は、月末の日付とその値だけを取得する方法もあります。データがA2:B5000にあると仮定しましょう。 (A1:B1には列ヘッダーが含まれていることに注意してください。)セルE2に次の数式を入力します。

=FILTER(A2:B5000,DAY(A3:A5001)<DAY(A2:A5000),1)

それでおしまい;単一のセル内の単一の数式。日付を正しく表示するには、列Eをフォーマットする必要がある場合がありますが、このFILTER関数の使用法は、すでに説明したのと同じ比較を行い、月末の日付と値のみを取得します。 (考えてみれば、これは非常に巧妙です。)ただし、Office365でのみ機能することを忘れないでください。 Excel 2019、Excel 2016、またはそれ以前のバージョンのプログラムでは機能しません。

マクロベースのアプローチを好む場合は、次の短いマクロでうまくいきます。

Sub DelRows()

Dim LastRow As Long     Dim J As Long

LastRow = Cells(Rows.Count, "A").End(xlUp).Row     LastRow = LastRow - 1     For J = LastRow To 2 Step -1         If Month(Cells(J, 1)) = Month(Cells(J + 1, 1)) Then             Rows(J).EntireRow.Delete         End If     Next J End Sub

マクロは、ワークシートの最後の行(LastRow変数に格納されている)を判別し、For …​ Nextループを使用して行を逆方向にステップスルーします。現在の行の月が次の行の月と等しい場合、その行は削除されます。マクロは、For …​ Nextループにジャンプする前にLastRowをデクリメントすることに注意してください。これが行われるのは、データの最後の行が常にデータの最後の取引日であると想定されているためです。したがって、データは常に削除されたデータのままです。

このマクロは、ワークシートのほとんどの行を1つずつ削除するため、実行に時間がかかる場合があります。ただし、完了すると、月末のデータのみが残ります。

最後に、このヒントで使用されているアプローチは、FILTER関数を除いて、データを破壊するものです。それらを使用すると、ワークシートのデータは永久に失われます。つまり、元のデータのコピー以外で実行する前に、2回(または3回)考える必要があります。

注:

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

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

このヒント(13768)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。