Excel VBAでのセルと範囲の操作(選択、コピー、移動、編集)
Excelで作業する場合、ほとんどの時間はワークシート領域で費やされます–セルと範囲を扱います。また、VBAを使用してExcelで作業を自動化したい場合は、VBAを使用してセルと範囲を操作する方法を知る必要があります。
VBAの範囲でできることはたくさんあります(選択、コピー、移動、編集など)。).
このトピックをカバーするために、このチュートリアルをセクションに分割し、例を使用してExcel VBAでセルと範囲を操作する方法を示します。,
始めましょう。
VBAを簡単に学ぶことに興味があるなら、私のオンラインExcel VBAトレーニングをチェックしてください。
このチュートリアルでは、
VBAを使用してExcelでセル/範囲を選択する
VBAを使用してExcelでセルと範囲を操作するには、それを選択する必要はありません。
ほとんどの場合、セルまたは範囲を選択しない方が良いでしょう(これから説明します)。,
それにもかかわらず、このセクションを通過し、それがどのように動作するかを理解することが重要です。 これはVBAの学習において重要であり、ここで取り上げる多くの概念がこのチュートリアル全体で使用されます。
それでは、非常に簡単な例から始めましょう。
VBAを使用して単一のセルを選択する
アクティブなシート(たとえばA1)で単一のセルを選択する場合は、以下のコードを使用できます。
Sub SelectCell()Range("A1").SelectEnd Sub
上記のコードには必須の”Sub”と”End Sub”部分と、セルA1を選択するコード行があります。,
Range(“A1”)は、参照するセルのアドレスをVBAに伝えます。
SelectはRangeオブジェクトのメソッドであり、Rangeオブジェクトで指定されたセル/範囲を選択します。 セル参照は二重引用符で囲む必要があります。
このコードは、チャートシートがアクティブシートの場合にエラーを表示します。 チャーシートを含むチャートは広く用いられている。 それにはセル/範囲がないので、上記のコードはそれを選択することができず、エラーが表示されることになります。
アクティブなシートでセルを選択するので、セルアドレスを指定するだけです。,
しかし、別のシート(Sheet2としましょう)のセルを選択する場合は、最初にSheet2を有効にしてから、その中のセルを選択する必要があります。
Sub SelectCell()Worksheets("Sheet2").ActivateRange("A1").SelectEnd Sub
同様に、ワークブックをアクティブ化し、その中の特定のワークシートをアクティブ化してから、セルを選択することもできます。
Sub SelectCell()Workbooks("Book2.xlsx").Worksheets("Sheet2").ActivateRange("A1").SelectEnd Sub
ワークブックを参照するときは、ファイル拡張子とともにフルネームを使用する必要があることに注意してください。上記のコードではxlsx)。 ワークブックが一度も保存されなかった場合は、ファイル拡張子を使用する必要はありません。,
さて、これらの例はあまり役に立ちませんが、このチュートリアルの後半で、同じ概念を使用して(VBAを使用して)Excelにセルをコピーして貼り付ける方法
セルを選択するのと同じように、範囲を選択することもできます。
範囲の場合、固定サイズの範囲または可変サイズの範囲にすることができます。
固定サイズの範囲では、範囲の大きさがわかり、VBAコードで正確なサイズを使用できます。 しかし、可変サイズの範囲では、範囲の大きさがわからず、VBAの魔法を少し使用する必要があります。
これを行う方法を見てみましょう。,
修正サイズの範囲を選択する
範囲A1:D20を選択するコードは次のとおりです。
Sub SelectRange()Range("A1:D20").SelectEnd Sub
これを行う別の方法は、以下のコードを使用することです。
Sub SelectRange()Range("A1", "D20").SelectEnd Sub
上記のコードは、左上のセルアドレス(A1)と右下のセルアドレス(D20) この手法は、可変サイズの範囲を操作しているときに便利になります(Endプロパティがこのチュートリアルの後半で説明されているときにわかります)。,
選択を別のワークブックまたは別のワークシートで実行する場合は、これらのオブジェクトの正確な名前をVBAに伝える必要があります。
たとえば、以下のコードは範囲を選択しますA1:D20Book2ワークブックのSheet2ワークシート。
Sub SelectRange()Workbooks("Book2.xlsx").Worksheets("Sheet1").ActivateRange("A1:D20").SelectEnd Sub
さて、そこにいくつの行があるかわからない場合はどうすればよいですか。 値が含まれているすべてのセルを選択する場合はどうすればよいですか。
このような場合は、次のセクションで示す方法を使用する必要があります(可変サイズの範囲を選択する)。,
可変サイズの範囲の選択
セルの範囲を選択するには、さまざまな方法があります。 選択する方法は、データの構造によって異なります。
このセクションでは、VBAで範囲を操作するときに本当に便利ないくつかの便利なテクニックについて説明します。
Select Using CurrentRange Property
データがある行/列の数がわからない場合は、RangeオブジェクトのCurrentRangeプロパティを使用できます。
CurrentRangeプロパティは、データ範囲内のすべての連続した塗りつぶされたセルをカバーします。,
以下は、セルA1を保持する現在の領域を選択するコードです。
Sub SelectCurrentRegion()Range("A1").CurrentRegion.SelectEnd Sub
上記の方法は、空白の行/列がないテーブルとしてすべてのデータがある場合に適しています。
ただし、データに空白の行/列がある場合、空白の行/列の後のものは選択されません。 下の画像では、CurrentRegionコードは行10までのデータを選択し、行11が空白であるためです。
このような場合は、WorksheetオブジェクトのUsedRangeプロパティを使用することができます。,
Select Using UsedRangeプロパティ
UsedRangeを使用すると、変更されたセルを参照できます。
したがって、以下のコードは、アクティブシート内の使用されるすべてのセルを選択します。
Sub SelectUsedRegion()ActiveSheet.UsedRange.SelectEnd Sub
使用されている遠いセルがある場合は、上記のコードで考慮され、使用されているセルが選択されるまでのすべてのセルが
Endプロパティを使用して選択します
さて、この部分は本当に便利です。
Endプロパティを使用すると、最後に塗りつぶされたセルを選択できます。, これにより、コントロールダウン/アップ矢印キーまたはコントロール右/左キーの効果を模倣することが
例を使ってこれを理解してみましょう。
以下に示すようなデータセットがあり、列Aの最後に塗りつぶされたセルをすばやく選択したいとします。
ここでの問題は、データが変更され、塗りつぶされたセルの数がわからないことです。 キーボードを使用してこれを行う必要がある場合は、セルA1を選択し、Control+下矢印キーを使用すると、列の最後に塗りつぶされたセルが選択されます。
VBAを使用してこれを行う方法を見てみましょう。, このテクニックは、可変サイズの列の最後に塗りつぶされたセルにすばやくジャンプする場合に便利です
Sub GoToLastFilledCell()Range("A1").End(xlDown).SelectEnd Sub
上記のコードは、列Aの最後に塗りつぶされたセルにジャンプします。
同様に、End(xlToRight)を使用して、行の最後に塗りつぶされたセルにジャンプできます。
Sub GoToLastFilledCell()Range("A1").End(xlToRight).SelectEnd Sub
さて、最後に塗りつぶされたセルにジャンプするのではなく、列全体を選択する場合はどうなりますか。,
以下のコードを使用してそれを行うことができます。
Sub SelectFilledCells()Range("A1", Range("A1").End(xlDown)).SelectEnd Sub
上記のコードでは、選択する必要があるセルの最初と最後の参照を使用しました。 塗りつぶされたセルの数に関係なく、上記のコードはすべてを選択します。
次のコード行を使用して範囲A1:D20を選択した上記の例を覚えておいてください。
Range(“A1″,”D20”)
ここで、A1は左上のセル、D20は右下のセルです。 可変サイズの範囲を選択する際にも同じロジックを使用できます。, しかし、右下のセルの正確なアドレスがわからないので、Endプロパティを使用して取得しました。
範囲(”A1″、範囲(”A1″)。End(xlDown))、”A1″は最初のセルと範囲(“A1”)を指します。End(xlDown)は最後のセルを参照します。 両方の参照を提供しているので、Selectメソッドはこれら二つの参照の間のすべてのセルを選択します。
同様に、複数の行と列を持つデータセット全体を選択することもできます。
以下のコードは、セルA1から始まるすべての塗りつぶされた行/列を選択します。,
Sub SelectFilledCells()Range("A1", Range("A1").End(xlDown).End(xlToRight)).SelectEnd Sub
上記のコードでは、Range(“A1”)を使用しました。エンド(xlDown)。End(xlToRight)は、データセットの右下に塗りつぶされたセルの参照を取得します。
CurrentRegionとEndの違い
CurrentRegionプロパティがあるときにEndプロパティを使用して塗りつぶされた範囲を選択する理由が不思議なら、違いを教えてください。
Endプロパティを使用すると、開始セルを指定できます。, たとえば、A1:D20にデータがあり、最初の行がヘッダーである場合、Endプロパティを使用してヘッダーなしのデータを選択できます(以下のコードを使用)。
Sub SelectFilledCells()Range("A2", Range("A2").End(xlDown).End(xlToRight)).SelectEnd Sub
ただし、CurrentRegionはヘッダーを含むデータセット全体を自動的に選択します。
これまでのところ、このチュートリアルでは、さまざまな方法を使用してセルの範囲を参照する方法を見てきました。
では、これらの手法を実際に使用して作業を完了させる方法をいくつか見てみましょう。,
VBAを使用してセル/範囲をコピーする
このチュートリアルの冒頭で述べたように、セルを選択する必要はありません。 このセクションでは、これらを選択せずにセルと範囲をコピーする方法がわかります。
簡単な例から始めましょう。
単一セルのコピー
セルA1をコピーしてセルD1に貼り付けたい場合は、以下のコードで実行します。
Sub CopyCell()Range("A1").Copy Range("D1")End Sub
rangeオブジェクトのcopyメソッドは、Control+Cのようにセルをコピーし、指定された宛先に貼り付けることに注意してください。,
上記のコード例では、copyメソッドを使用する行と同じ行に宛先が指定されています。 コードをさらに読みやすくしたい場合は、以下のコードを使用できます。
Sub CopyCell()Range("A1").Copy Destination:=Range("D1")End Sub
上記のコードは、値と書式設定/数式をコピーして貼り付けます。
すでに気づいているかもしれませんが、上記のコードはセルを選択せずにコピーします。 ワークシートのどこにいても、コードはセルA1をコピーしてD1に貼り付けます。
また、上記のコードはセルD2の既存のコードを上書きすることに注意してください。, 上書きせずにセルD1に既に何かがあるかどうかをExcelに通知したい場合は、以下のコードを使用できます。
修正サイズの範囲のコピー
A1:D20をJ1:M20にコピーする場合は、以下のコードを使用できます。
Sub CopyRange()Range("A1:D20").Copy Range("J1")End Sub
宛先セルでは、左上のセルのアドレスを指定するだけです。 コードは、正確にコピーされた範囲を宛先に自動的にコピーします。
同じ構造を使用して、あるシートから別のシートにデータをコピーすることができます。
以下のコードは、アクティブシートからA1:D20をSheet2にコピーします。,
Sub CopyRange()Range("A1:D20").Copy Worksheets("Sheet2").Range("A1")End Sub
上記は、アクティブシートからデータをコピーします。 ようなので、シートのデータをアクティブなシート前にコードです。 安全のために、データのコピー中にワークシートの名前を指定することもできます。
Sub CopyRange()Worksheets("Sheet1").Range("A1:D20").Copy Worksheets("Sheet2").Range("A1")End Sub
上記のコードの良いところは、どのシートがアクティブであっても、常にSheet1からデータをコピーしてSheet2に貼り付けることです。
参照の代わりにその名前を使用して名前付き範囲をコピーすることもできます。,
たとえば、’SalesData’という名前の範囲がある場合は、以下のコードを使用してこのデータをSheet2にコピーできます。
Sub CopyRange()Range("SalesData").Copy Worksheets("Sheet2").Range("A1")End Sub
名前付き範囲のスコープがブック全体である場合、このコードを実行するには、名前付き範囲を持つシート上にいる必要はありません。 名前付き範囲はブックのスコープであるため、このコードを使用して任意のシートからアクセスできます。
Table1という名前のテーブルがある場合は、以下のコードを使用してSheet2にコピーできます。
Sub CopyTable()Range("Table1").Copy Worksheets("Sheet2").Range("A1")End Sub
範囲を別のブックにコピーすることもできます。,
次の例では、Excelテーブル(Table1)をBook2ブックにコピーします。
Sub CopyCurrentRegion()Range("Table1").Copy Workbooks("Book2.xlsx").Worksheets("Sheet1").Range("A1")End Sub
このコードは、ブックが既に開いている場合にのみ機能します。
可変サイズの範囲のコピー
可変サイズの範囲をコピーする一つの方法は、これらを名前付き範囲またはExcelテーブルに変換し、前のセクションに示
しかし、それができない場合は、CurrentRegionまたはrangeオブジェクトのEndプロパティを使用できます。
以下のコードは、アクティブなシートの現在の領域をコピーし、Sheet2に貼り付けます。,
Sub CopyCurrentRegion()Range("A1").CurrentRegion.Copy Worksheets("Sheet2").Range("A1")End Sub
データセットの最初の列を最後に塗りつぶされたセルまでコピーしてSheet2に貼り付ける場合は、以下のコードを使用できます。
Sub CopyCurrentRegion()Range("A1", Range("A1").End(xlDown)).Copy Worksheets("Sheet2").Range("A1")End Sub
行と列をコピーする場合は、以下のコードを使用できます。
Sub CopyCurrentRegion()Range("A1", Range("A1").End(xlDown).End(xlToRight)).Copy Worksheets("Sheet2").Range("A1")End Sub
すべての列をコピーすることができます。
Sub CopyCurrentRegion()Range("A1", Range("A1").End(xlDown).End(xlToRight)).Copy Worksheets("Sheet2").Range("A1")End Sub
すべての列をコピーすることができます。これらのコードは、実行中にセルを選択しません。 一般に、作業する前に実際にセル/範囲を選択する必要があるケースはほんの一握りです。,
オブジェクト変数への範囲の割り当て
これまでのところ、セルの完全なアドレス(Workbooks(“Book2.xlsx”)。ワークシート(”Sheet1″)。範囲(“A1”))。
コードをより管理しやすくするために、これらの範囲をオブジェクト変数に割り当ててから、それらの変数を使用できます。たとえば、以下のコードでは、ソースと宛先の範囲をオブジェクト変数に割り当て、これらの変数を使用して、ある範囲から別の範囲にデータをコピーしました。
変数をRangeオブジェクトとして宣言することから始めます。, 次に、Set文を使用してこれらの変数に範囲を割り当てます。 範囲が変数に割り当てられたら、その変数を使用するだけです。
次の空のセルにデータを入力します(入力ボックスを使用)
入力ボックスを使用して、ユーザーがデータを入力できるようにすることができます。
たとえば、以下のデータセットがあり、販売レコードを入力すると、VBAの入力ボックスを使用できます。 コードを使用して、次の空白行のデータを確実に埋めることができます。,
上記のコードは、VBA入力ボックスを使用してユーザーから入力を取得し、指定されたセルに入力を入力します。
正確なセル参照は使用しなかったことに注意してください。 代わりに、EndプロパティとOffsetプロパティを使用して、最後の空のセルを見つけ、その中のデータを埋めました。
このコードは使いやすいものではありません。 たとえば、入力ボックスで数量または金額を要求するときにテキスト文字列を入力すると、Excelで許可されていることがわかります。 If条件を使用して、値が数値であるかどうかをチェックし、それに応じて許可することができます。,
セル/範囲をループする
これまでのところ、セルと範囲のデータを選択、コピー、および入力する方法を見ることができました。
このセクションでは、範囲内のセル/行/列のセットをループする方法について説明します。 これは、各セルを分析し、それに基づいて何らかのアクションを実行する場合に役立ちます。
たとえば、選択範囲のすべての第三の行を強調表示する場合は、ループスルーして行番号を確認する必要があります。, 同様に、フォントの色を赤に変更してすべての負のセルを強調表示する場合は、各セルの値をループスルーして分析する必要があります。
選択したセルの行をループし、代替行を強調表示するコードは次のとおりです。
Sub HighlightAlternateRows()Dim Myrange As RangeDim Myrow As RangeSet Myrange = SelectionFor Each Myrow In Myrange.RowsIf Myrow.Row Mod 2 = 0 ThenMyrow.Interior.Color = vbCyanEnd IfNext MyrowEnd Sub
上記のコードは、MOD関数を使用して選択内の行番号をチェックします。 行番号が偶数の場合は、シアン色で強調表示されます。
コードが各セルを通過し、負の値を持つセルを強調表示する別の例を次に示します。,
Sub HighlightAlternateRows()Dim Myrange As RangeDim Mycell As RangeSet Myrange = SelectionFor Each Mycell In MyrangeIf Mycell < 0 ThenMycell.Interior.Color = vbRedEnd IfNext MycellEnd Sub
条件付き書式を使用して同じことを行うことができます(これは動的であり、これを行うより良い方法です)。 この例は、VBAのセルと範囲でループがどのように機能するかを示す目的のためだけです。
VBAコードをどこに配置するか
VBAコードがExcelブックのどこにあるのか疑問に思っていますか?
ExcelにはVBAエディタと呼ばれるVBAバックエンドがあります。 VB Editor module codeウィンドウにコードをコピーして貼り付ける必要があります。
これを行うための手順は次のとおりです。
- 開発者タブに移動します。,
- Visual Basicオプションをクリックします。 これは、バックエンドでVBエディタを開きます。
- VBエディターのプロジェクトエクスプローラーペインで、コードを挿入するブックの任意のオブジェクトを右クリックします。 Project Explorerが表示されない場合は、Viewタブに移動し、Project Explorerをクリックします。
- 挿入に移動し、モジュールをクリックします。 この挿入モジュールオブジェクト用ワークブック.
- モジュールウィンドウにコードをコピーして貼り付けます。,
次のExcelチュートリアルも好きかもしれません。
- VBAを使用してワークシートを操作します。
- VBAを使用してブックを操作します。
- Excelでユーザー定義関数を作成します。
- Excel VBAの次のループの場合–例を含む初心者向けガイド。
- Excel VBA InStr関数を使用する方法(実用的な例を含む)。
- Excel VBA Msgbox。
- Excelでマクロを記録する方法。
- Excelでマクロを実行する方法。
- Excelでアドインを作成する方法。,
- Excel Personal Macro Workbook|Save&すべてのブックでマクロを使用します。
- Excel VBAイベント-簡単な(そして完全な)ガイド。
- Excel VBAエラー処理。
- VBAを使用してExcelでデータをソートする方法(ステップバイステップガイド)。
- VBA初心者のための24便利なExcelマクロの例(すぐに使用できます)。