VBA入門
その他のExcel機能(グループ化、重複の削除、オートフィル等)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-11-11

第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)


エクセルの機能は豊富で、全部の機能を使っている人はまずいないでしょう。
どのような機能があるかだけ知っていれば、必要な時に使えればそれで良いものです。


マクロVBAでも全てのエクセル機能を覚える必要などありません。
必要になった時に調べてVBAが書ければそれで充分です。

では、初めてVBAで扱うエクセルの機能は、どのように調べたら良いのでしょうか・・・
・グループ化
・重複の削除
・オートフィル
・連続データの作成
以上の機能について具体的に見てみましょう。

ただし、これらの機能をVBA入門で取り上げなかった理由もあります。
その機能にバグや動作不明瞭な点があったり、別の方法の方が良いだろうと思われる機能だからです。
今回は、あくまでマクロVBAで始めて使う機能について調べるときの手順の参考という事になります。


マクロの記録

エクセルには、とても便利で強力なVBAサポート機能が備わっています。
言わずと知れた、「マクロの記録」です。

マクロ VBA マクロの記録

マクロVBAの記述が分からない時は、
・その操作を「マクロの記録」
・「マクロの記録」のVBAコードを見る
・VBAコードの不明点をWEB検索する
検索方法について
VBAコードの調べたい単語(例としてGroup)に入力カーソルを置いて、

マクロ VBA サンプル画像

この状態でF1(ヘルプ)を押すとブラウザが起動されて、当該の、
Docs / Office VBA リファレンス / Excel / オブジェクト モデル / ・・・
ここが表示されます、マイクロソフトの正式なヘルプページです。

ちゃんとしたページが出てこなかった場合は、
vba ○○○ docs」これで検索しましょう。

これで表示されたページをざっと読んで、理解できない点や不明点がある。
そういう場合は、
最後のdocsを消して、
vba ○○○」これで再検索してください。

マイクロソフト以外のページが多数表示されます。
当サイトが出ている場合もあるでしょう。
そういう意味では、当サイトのページ下部に置いているGoogleカスタム検索は是非活用してください。



グループ化

マクロ VBA サンプル画像

A列からC列をグループ化して、そして解除します。
「マクロの記録」で作成されたVBAは、

Sub Macro1()
'
' Macro1 Macro
'

'
  Columns("A:C").Select
  Selection.Columns.Group
  Selection.Columns.Ungroup
End Sub

これはVBAコードを見たままですね、
Group
Ungroup
この2つが解れば良いだけです。

Selectionは、ここではRangeオブジェクトなので、
Rangeオブジェクトのメソッドだという事が分かります。

Groupに入力カーソルを置いてF1してみると、
Range.Group メソッド (Excel)
このページが表示されます。
Rangeオブジェクトがピボットテーブルフィールドのデータ範囲内の単一セルを表す場合、 Groupメソッドはそのフィールドで数値または日付ベースのグループ化を実行します。

式。グループ(Start、 End、 By、期間)
expression は Range オブジェクトを表す変数です。

名前 必須 / オプション データ型 説明
Start オプション Variant グループ化する最初の値を指定します。この引数を省略するか、Trueを指定すると、フィールドの最初の値が使用されます。
End オプション Variant グループ化する最後の値を指定します。この引数を省略するか、Trueを指定すると、フィールドの最後の値が使用されます。
By オプション Variant フィールドが数値の場合は、この引数でグループごとのサイズを指定します。このフィールドが日付の場合は、この引数でグループごとの日数を指定します (Periods配列の要素 4 がTrueで、その他すべての要素がFalseの場合)。それ以外の場合、この引数は無視されます。この引数を省略すると、Microsoft Excel は自動的に既定のグループ サイズを選択します。
Periods オプション Variant グループの期間を指定するブール値の配列 (「備考」セクションを参照)。配列内の要素がTrueの場合は、対応する時間に対してグループが作成されます。要素がFalseの場合、グループは作成されません。フィールドが日付フィールドでない場合、この引数は無視されます。

機械翻訳されたページなので、細かい日本語にはこだわらないようにしてください。
Start、End、By、Periods等が指定できるようです・・・
ピボットテーブルの場合に使うものですが、今回は説明を省略します。
使用頻度は低いでしょうし、説明が長くなってしまって本旨から外れてしまいますので。
では、マクロVBAを書き直しみると、

Sub Macro1()
  Columns("A:C").Columns.Group
  Columns("A:C").Columns.Ungroup
End Sub

行のグループ化なら、

Sub Macro1()
  Rows("3:10").Rows.Group
  Rows("3:10").Rows.Ungroup
End Sub

Columns("A:C")の範囲を変更したり、Rowsに変更したりで適宜対応すればよいでしょう。

グループ化の問題点
この機能は、人によって好き嫌いがある機能だと思われます。
好きな人は多用するが、使わない人は全く使わないといった感じを受けます。
マクロVBAとしては、行または列が非表示になるので扱いづらいということもあります。


重複の削除

マクロ VBA 重複の削除

マクロ VBA 重複の削除

A列からC列において、A列とC列を重複キーとして重複の削除を実行します。
「マクロの記録」で作成されたVBAは、

Sub Macro2()
'
' Macro2 Macro
'

'
  Columns("A:C").Select
  ActiveSheet.Range("$A$1:$C$10").RemoveDuplicates Columns:=Array(1, 3), _
    Header:=xlNo

End Sub

VBAコードを見ると、
RemoveDuplicates
これが重複の削除のメソッドのようですね。

Selectionは、ここではRangeオブジェクトなので、
Rangeオブジェクトのメソッドだという事が分かります。
ただし、ColumnsHeaderという引数が必要なようです。
Rangeの範囲も勝手にデータの入っている範囲の指定になっています。

そこで、WEB検索してみると、
指定した重複の削除方法 (Excel)
このページが表示されます。
式。重複の削除(列、ヘッダー)
expression は Range オブジェクトを表す変数です。

名前 必須 / オプション データ型 説明
Columns 必須 バリアント型 重複した情報を含む列のインデックスの配列を指定します。
Header 省略可能 XlYesNoGuess 最初の行にヘッダー情報が含まれるかどうかを指定します。xlNoは既定値です。Excel にヘッダーを決定させるには、xlGuessを指定します。

このように書かれています。
それでは、適当にVBAを変更して実行してみます。

Sub Macro2()
  Range("A:C").RemoveDuplicates Columns:=Array(1, 3), Header:=xlNo
End Sub

これだけで動きましたね。
後は、Rangeの範囲と、Columnsの指定を変更すれば良いでしょう。
ただし、このColumnsにVariant変数を直接指定するとエラーとなってしまいます。
そこで、さらに検索を進めるる必要があるのですが、
これについては、以下のページで解説されています。

「重複の削除」の問題点

Excel2007で登場した「重複の削除」には、当初からバグが報告されていました。
致命的なバグで、削除されてはいけないデータが削除されてしまうというものでした。
後々のバージョンで改善されてはきましたが、それでもまだバグは残っているようです。
Excel2016では、逆に重複が削除されないというバグも確認できています。

とはいえ、普通のデータであればバグが発生することもありませんので、
承知したうえで問題が発生しないデータの範囲で使うのであれば良いでしょう。

重複をなくしてデータをユニーク化するのはマクロVBAでは必須になります。
「重複の削除」を使わずに、別の方法でユニークなデータ作成ができるようにしておいてください。
以下のページが参考になると思います。
重複の無いユニークなデータ作成
簡単な例で シート「元データ」A列に、1行目に見出し、2行目以降にデータが入っている シート「ユニーク」このA列に、シート「元データ」のA列をユニーク(一意)にして取り出します。まずは、エクセルらしく、ワークシート関数とフィルターを使って 非常にエクセルらしい、素直な処理です。


オートフィル

マクロ VBA オートフイル

A1に1、A2に2を入れて、A1~A2を選択しフィルハンドルをA10までドラッグします。
「マクロの記録」で作成されたVBAは、

Sub Macro3()
'
' Macro3 Macro
'

'
  Range("A1").Select
  ActiveCell.FormulaR1C1 = "1"
  Range("A2").Select
  ActiveCell.FormulaR1C1 = "2"
  Range("A1:A2").Select
  Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault
  Range("A1:A10").Select
End Sub

VBAコードを見ると、
AutoFill
これがオートフィルのメソッドのようですね。

Selectionは、ここではRangeオブジェクトなので、
Rangeオブジェクトのメソッドだという事が分かります。
ただし、Typeという引数が必要なようです。
そこで、WEB検索してみると、
オートフィルメソッド (Excel)
このページが表示されます。
式。オートフィル(Destination, Type)
expression は Range オブジェクトを表す変数です。

名前 必須 / オプション データ型 説明
Destination 必須 Range オートフィルの書き込み先になる Range オブジェクトを指定します。基準となるデータの入ったセル範囲も含むようにします。
Type 省略可能 XlAutoFillType オートフィルの種類を指定します。

このように書かれています。
XlAutoFillType
これにリンクが付いていますのでクリックしてみると、以下の事が書かれています。
名前 説明
xlFillCopy 1-d ソース範囲からターゲット範囲に値と形式をコピーし、必要に応じて繰り返します。
xlFillDays 5 ソース範囲の曜日名をターゲット範囲に適用します。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlFillDefault 0 Excel がターゲット範囲を入力するために使用する値と形式を決定します。
xlFillFormats 1月3日 ソース範囲からターゲット範囲に形式のみをコピーし、必要に応じて繰り返します。
xlFillMonths 7 ソース範囲の月の名前をターゲット範囲に適用します。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlFillSeries pbm-2 ソース範囲の値をターゲット範囲に連続する数値として適用します (たとえば、'1, 2' は '3, 4, 5' となります)。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlFillValues 2月4日 ソース範囲からターゲット範囲に値のみをコピーし、必要に応じて繰り返します。
xlFillWeekdays シックス ソース範囲の平日の名前をターゲット範囲に適用します。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlFillYears 8 ソース範囲の年をターゲット範囲に適用します。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlGrowthTrend 10 ソース範囲の数値間のリレーションシップが乗算されることを前提として、ソース範囲の数値をターゲット範囲に拡張します (たとえば、' 1, 2, ' は ' 4, 8, 16 ' として拡張されます)。以前の数値で指定した値)。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlLinearTrend 9 ソース範囲からターゲット範囲に数値を拡張します (たとえば、' 1, 2, ' は、各数値が前の番号に値を加算した結果であると仮定した場合)、値の間の関係が加算されます。形式はソース範囲からターゲット範囲にコピーされ、必要に応じて繰り返されます。
xlFlashFill # 前のユーザー アクションの検出されたパターンに基づいて、ソース範囲の値をターゲット範囲に適用します。必要に応じて繰り返されます。

なにやら、「値」に変なものがあります。
これは機械翻訳したページなので、翻訳の間違いです。
(このような間違いは徐々に修正されてくるものと思われます)

マクロ VBA オートフイル

特に値を知る必要はありませんが、調べたい時は、このようにイミディエイトで確認してください。

それでは、適当にVBAを変更して実行してみます。

Sub Macro3()
  Range("A1") = "1"
  Range("A2") = "2"
  Range("A1:A2").AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault
End Sub

あまり変更していませんが、これだけで動きますね。
後は、Rangeの範囲を適宜変更すれば良いでしょう。
Typeについては種類が沢山あるし、使う時にはまた「マクロの記録」からやり直してみてください。

オートフィルの問題点
オートフィルで作成されるデータの規則性をしっかり把握するのが結構大変になります。
特にxlFillDefaultでは、どのようなデータが作成されるかは入っているデータ次第という事になります。
さすがに、データに依存するのではマクロVBAでは扱いづらいものになります。
そしてそもそもVBAでやるなら、
普通にループさせながら、一定のアルゴリズムでデータを作成していく方が作成しやすいでしょう。


連続データの作成

マクロ VBA 連続データの作成

A1セルに1を入れ、A10まで1ずつ増加する連続データを作成します。
「マクロの記録」で作成されたVBAは、

Sub Macro4()
'
' Macro7 Macro
'

'
  Range("A1").Select
  ActiveCell.FormulaR1C1 = "1"
  Range("A1").Select
  Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
    Step:=1, Stop:=10, Trend:=False

End Sub

VBAコードを見ると、
DataSeries
これが連続データのメソッドのようですね。

Selectionは、ここではRangeオブジェクトなので、
Rangeオブジェクトのメソッドだという事が分かります。
ただし、TypeDataSeries・・・いろいろと指定が必要なようです。
そこで、WEB検索してみると、
DataSeries メソッド (Excel)
このページが表示されます。
式。DataSeries(Rowcol、 Type、 Date、 Step、 Stop、 Trend)
expression は Range オブジェクトを表す変数です。

名前 必須 / オプション データ型 説明
Rowcol オプション Variant 行または列にデータ系列を入力するには、XlrowsまたはXlrows定数を使用できます。この引数を省略すると、範囲のサイズと形が使用されます。
Type 省略可能 XlDataSeriesType 連続データの種類を指定します。
Date 省略可能 XlDataSeriesDate 引数_Type_にxlchronologicalを指定すると、引数_date_は、ステップの日付単位を示します。
Step オプション Variant 連続データの増分値です。既定値は 1 です。
Stop オプション Variant 連続データの停止値です。この引数を省略すると、対象セル範囲の終端まで繰り返されます。
Trend オプション Variant 対象セル範囲に入力されている値を直線 (加算) または指数曲線 (乗算) に当てはめて予測した結果で残りのセル範囲を埋めるには、Trueを指定します。標準の連続データを作成するには、Falseを指定します。既定値はFalseです。

XlDataSeriesTypeとXlDataSeriesDateにリンクがあります。
これはもう大丈夫ですよね。
このように順に調べれば、目的の望む情報にたどり着けます。

連続データの作成の問題点
この機能をマクロVBAで使う事はあまりないとは思います。
普通にループさせながら、一定のアルゴリズムでデータを作成していく事が多いでしょう。
1列または1行のデータだけをVBAで作成することはあまり無く、
ほとんどの場合は、他の列または行のデータと合わせて作成していく事になるからです。
もし1列または1行の連続データを作成するだけなら、この機能を使うのは良いと思います。


その他のExcel機能

最初に書いた通り、
エセルの機能はとても沢山あり、全てのエクセル機能を覚える必要などありません。
このマクロVBA入門でも全てを解説することはできませんし、その必要もないでしょう。

今回説明したように、順に調べながらマクロVBAを完成させてください。
マクロの記録とWEB検索だけではたどり着けないような場合も出てくるでしょう。
そのような時は、
オブジェクトの探索方法
・オブジェクト探索の説明で使う例題 ・自動記録を使ってオートシェイプの概要を知る ・ローカルウィンドウでオートシェイプのテキストを調べる ・オートシェイプの位置移動について ・VBAを完成させる ・オブジェクトブラウザーを使いさらにオブジェクトを調べる ・ウォッチウィンドウについて
このようなテクニックも合わせて使いながら、一つずつ解決していってください。




同じテーマ「マクロVBA入門」の記事

第137回.ActiveXコントロール
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第135回.ジャンプの選択オプション(SpecialCells)
第141回.行・列の表示・非表示・列幅・行高
第105回.Callステートメント
第106回.Functionプロシージャー
第107回.プロシージャーの引数
第108回.変数の適用範囲(スコープ,Private,Public)
第100回.InputBoxメソッド(インプットボックス)


新着記事NEW ・・・新着記事一覧を見る

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ