第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
エクセルの機能は豊富で、全部の機能を使っている人はまずいないでしょう。
どのような機能があるかだけ知っていれば、必要な時に使えればそれで良いものです。
必要になった時に調べてVBAが書ければそれで充分です。
・グループ化
・重複の削除
・オートフィル
・連続データの作成
以上の機能について具体的に見てみましょう。
その機能にバグや動作不明瞭な点があったり、別の方法の方が良いだろうと思われる機能だからです。
今回は、あくまでマクロVBAで始めて使う機能について調べるときの手順の参考という事になります。
マクロの記録
言わずと知れた、「マクロの記録」です。
・その操作を「マクロの記録」
・「マクロの記録」のVBAコードを見る
・VBAコードの不明点をWEB検索する
VBAコードの調べたい単語(例としてGroup)に入力カーソルを置いて、
Docs / Office VBA リファレンス / Excel / オブジェクト モデル / ・・・
ここが表示されます、マイクロソフトの正式なヘルプページです。
「vba ○○○ docs」これで検索しましょう。
そういう場合は、
最後のdocsを消して、
「vba ○○○」これで再検索してください。
当サイトが出ている場合もあるでしょう。
そういう意味では、当サイトのページ下部に置いているGoogleカスタム検索は是非活用してください。
グループ化
「マクロの記録」で作成されたVBAは、
Sub Macro1()
'
' Macro1 Macro
'
'
Columns("A:C").Select
Selection.Columns.Group
Selection.Columns.Ungroup
End Sub
これはVBAコードを見たままですね、
Group
Ungroup
この2つが解れば良いだけです。
Rangeオブジェクトのメソッドだという事が分かります。
Range.Group メソッド (Excel)
このページが表示されます。
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は、
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
これが重複の削除のメソッドのようですね。
Rangeオブジェクトのメソッドだという事が分かります。
ただし、ColumnsやHeaderという引数が必要なようです。
Rangeの範囲も勝手にデータの入っている範囲の指定になっています。
指定した重複の削除方法 (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変数を直接指定するとエラーとなってしまいます。
そこで、さらに検索を進めるる必要があるのですが、
これについては、以下のページで解説されています。
「重複の削除」の問題点
致命的なバグで、削除されてはいけないデータが削除されてしまうというものでした。
後々のバージョンで改善されてはきましたが、それでもまだバグは残っているようです。
Excel2016では、逆に重複が削除されないというバグも確認できています。
承知したうえで問題が発生しないデータの範囲で使うのであれば良いでしょう。
「重複の削除」を使わずに、別の方法でユニークなデータ作成ができるようにしておいてください。
以下のページが参考になると思います。
重複の無いユニークなデータ作成
オートフィル
「マクロの記録」で作成された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
これがオートフィルのメソッドのようですね。
Rangeオブジェクトのメソッドだという事が分かります。
ただし、Typeという引数が必要なようです。
そこで、WEB検索してみると、
オートフィルメソッド (Excel)
このページが表示されます。
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 | # | 前のユーザー アクションの検出されたパターンに基づいて、ソース範囲の値をターゲット範囲に適用します。必要に応じて繰り返されます。 |
なにやら、「値」に変なものがあります。
これは機械翻訳したページなので、翻訳の間違いです。
(このような間違いは徐々に修正されてくるものと思われます)
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は、
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
これが連続データのメソッドのようですね。
Rangeオブジェクトのメソッドだという事が分かります。
ただし、TypeやDataSeries・・・いろいろと指定が必要なようです。
そこで、WEB検索してみると、
DataSeries メソッド (Excel)
このページが表示されます。
expression は Range オブジェクトを表す変数です。
名前 | 必須 / オプション | データ型 | 説明 |
Rowcol | オプション | Variant | 行または列にデータ系列を入力するには、XlrowsまたはXlrows定数を使用できます。この引数を省略すると、範囲のサイズと形が使用されます。 |
Type | 省略可能 | XlDataSeriesType | 連続データの種類を指定します。 |
Date | 省略可能 | XlDataSeriesDate | 引数_Type_にxlchronologicalを指定すると、引数_date_は、ステップの日付単位を示します。 |
Step | オプション | Variant | 連続データの増分値です。既定値は 1 です。 |
Stop | オプション | Variant | 連続データの停止値です。この引数を省略すると、対象セル範囲の終端まで繰り返されます。 |
Trend | オプション | Variant | 対象セル範囲に入力されている値を直線 (加算) または指数曲線 (乗算) に当てはめて予測した結果で残りのセル範囲を埋めるには、Trueを指定します。標準の連続データを作成するには、Falseを指定します。既定値はFalseです。 |
これはもう大丈夫ですよね。
このように順に調べれば、目的の望む情報にたどり着けます。
普通にループさせながら、一定のアルゴリズムでデータを作成していく事が多いでしょう。
1列または1行のデータだけをVBAで作成することはあまり無く、
ほとんどの場合は、他の列または行のデータと合わせて作成していく事になるからです。
もし1列または1行の連続データを作成するだけなら、この機能を使うのは良いと思います。
その他のExcel機能
エセルの機能はとても沢山あり、全てのエクセル機能を覚える必要などありません。
このマクロVBA入門でも全てを解説することはできませんし、その必要もないでしょう。
マクロの記録とWEB検索だけではたどり着けないような場合も出てくるでしょう。
そのような時は、
オブジェクトの探索方法
同じテーマ「マクロ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 ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。