- 9/28/2020
- 読了3分
- s
- C
- A
注意
Office 365 ProPlusはMicrosoft 365 Apps for enterpriseに名称変更されました。 この変更の詳細については、このブログ記事をお読みください。
概要
Microsoft Excel 2002 およびそれ以降のバージョンの Excel は、Microsoft Excel 97 以前のバージョンの Excel とは異なる方法で “For Each…Next” ループ内のセルを削除します。
この記事では、その違いについて説明し、ループ内のセルを削除する方法を説明する Visual Basic for Applications のマクロ例を提供します。 これには、商品性または特定目的への適合性に関する暗黙の保証が含まれますが、これに限定されるものではありません。 この記事は、あなたがデモンストレーションの対象となるプログラミング言語と、プロシージャの作成およびデバッグに使用されるツールに精通していることを前提としています。 マイクロソフトのサポートエンジニアは、特定のプロシージャの機能を説明する手助けをすることができます。 しかし、これらの例を修正して機能を追加したり、特定の要件を満たすようにプロシージャを構築したりすることはありません。
サンプルデータ
この記事のマクロを使用するには、ワークシートに次のサンプルデータを入力します:
A1: a B1: 1A2: b B2: 2A3: x B3: 3A4: x B4: 4A5: c B5: 5A6: x B6: 6A7: d B7: 7A8: x B8: 8A9: x B9: 9A10: e B10: 10
サンプルマクロ
新しいマクロモジュールに、次のマクロを入力します。
サンプルマクロのExcel 2002以降のバージョンでの動作
Excel2002以降のバージョンでDeleteCellsマクロを実行すると、3行目、6行目、8行目のみが削除されます。 4行目と9行目にはA列に “x “が含まれていますが、マクロは行を削除しません。 マクロの結果は以下の通りです。
A1: a B1: 1A2: b B2: 2A3: x B3: 4A4: c B4: 5A5: d B5: 7A6: x B6: 9A7: e B7: 10
MicrosoftExcelが3行目を削除すると、すべてのセルが1行上に移動します。 例えば、セルA3はセルA4の内容を引き受け、セルA4はセルA5の内容を引き受け、といった具合に。 For Each…Nextループがセルを評価した後、次のセルを評価します。したがって、セルがシフトされると、ループによってスキップされることがあります。
サンプルマクロのMicrosoft Excel 5.0 および Microsoft Excel 7.0 における動作
Excel 5.0 および Excel 7.0 で DeleteCells マクロを実行すると、マクロは “x” を含むすべての行を削除します。 マクロの実行結果は以下のとおりです。
A1: a B1: 1A2: b B2: 2A3: c B3: 5A4: d B4: 7A5: e B5: 10
3行目が削除されると、すべてのセルが1行上に移動します。 そして、セルA3はセルA4の内容を、セルA4はセルA5の内容を、といった具合に引き継がれます。
ただし、Excel 2002以降のバージョンにおけるループの動作とは異なり、Excel 5.0およびExcel 7.0では「For Each…Next 」ループがセルを評価する際に、ループの中でセルを削除すると再評価されるようになっています。 そのため、セルはスキップされません。
ループを使ってセルを削除するおすすめの方法
ループを使ってセルを削除する場合は、次のマクロを使用します。
A1: a B1: 1A2: b B2: 2A3: c B3: 5A4: d B4: 7A5: e B5: 10
このマクロをすべてのバージョンのExcelで実行した結果は、次のようになります。
上記で示した方法とは別の方法です。 この方法でも同じ結果が得られます
。