2021-01-01から1年間の記事一覧
マクロを作るSubやFunctionを、正確にはSubプロシージャ/Functionプロシージャと呼びます。このプロシージャは「使いどころがわからない」と悩む人が多く、そんな方々へ向けて、プロシージャ分割の基礎と使いどころを解説いたします。
12/11(土)20:00~ Zoom勉強会に登壇します。「Sub/Functionの使い方入門!」と題し、Functionを一度も使ったことがない方や、1マクロ1Subで作っている方向けの入門解説を行います。無言OK聞き専OKですのでお気軽にご参加ください。
このブログを始めて2年が経過しました。いつもご愛読いただいている皆様ありがとうございます!節目くらいは雑談ということで、ブログ生誕記念に「和風スパゲティのレシピ」というブログタイトルの由来を書いておこうと思います。
この記事をもって、ブログの連続投稿が50日になりました。さすがに50日お付き合いいただいた方はいないと思いますが、3日でも4日でもお付き合いいただいた皆様ありがとうございます(´∀`)ここで区切りにして感想を書いておこうと思います。
検索によく用いられるFindメソッドさんですが、実は危なくて遅い地雷メソッドです。非表示セルを見つけられない、ユーザーと設定を共有する、MATCH関数より十数倍レベルで遅い、の三重苦なので、なるべく使わないようにしましょう。
インクリメント演算子とは、i = i + 1 というコードを ++ i のように短縮表現するための演算子です。他言語経験者の方にはおなじみの書き方ですが、残念ながらVBAにはインクリメント演算子がありませんので、自作関数で代用しましょう。
シート最上部を常に表示する設定は、ディスプレイ用の「ウィンドウ枠の固定」と、印刷用の「印刷タイトル」の2つの設定があります。この2つの設定は同じ位置に設定することが多いので、同時設定するショートカットを作ってしまいましょう。
上下左右の印刷余白を0にするマクロを紹介します。PageSetupオブジェクトに○○Marginというプロパティが6つあるので、それをすべて0にするだけです。マウスだと20回以上クリックが必要な作業をワンクリックにできるのはとても便利ですね。
このブログの記事数が150を突破しました。いつもご愛読いただきありがとうございます。50記事に1回くらいは雑談でも書こうかと思っていますが、別に節目でもないので普通に雑談を始めたいと思います。お暇な方はお付き合いください。
現在のブックが保存されているフォルダを、エクスプローラーで開くマクロを紹介します。「今作業してるファイルと同じフォルダにあるファイルを開きたい」をワンクリックでやるためのマクロですね。Shell関数1行で簡単に実装できます。
マジックナンバーという用語をご存知でしょうか?Cells(R, 4) = Cells(R, 2) * Cells(R, 3)など、直接入力された数値を指す用語です。この3つの数値は、改修時の書き換えが面倒かつ危険でしかも読みづらいので、なくさなければいけない数字です。
指定のフォルダをエクスプローラーで開く方法を紹介します。この処理は、Shell "C:\windows\explorer.exe " & フォルダパス & "\", vbNormalFocusで実装できます。局所的な使い方のコードですので、おまじないだと思って使って構いません。
「いつでも使えるコード」を書くのに便利な個人用マクロブックの作り方・使い方を紹介します。「マクロをツールバーやショートカットキーにセット」「汎用関数集(ライブラリ)の保管場所」「コードテンプレート置き場」が3大活用法です。
Functionプロシージャの名前に句読点を使用すると、ワークシート上でユーザー定義関数として呼び出せなくなります。読点「、」とカンマ「,」、句点「。」とピリオド「.」が自動変換されることが原因のように思えますが定かではありません。
Worksheetオブジェクトから呼び出す場合の、SelectメソッドとActivateメソッドの違いを説明します。どちらもアクティブシートを設定/変更できるメソッドですが、単独のシート選択はActivate、複数のシート選択はSelectがそれぞれ得意です。
すべてのシートをA1セル選択状態にするマクロを紹介します。For Eachで全シートをActivateし、Range("A1").Selectをして回るだけの簡単なコードですが、ウィンドウ枠の固定に対応する必要があるため、ActiveWindow.ScrollRow = 1も実行します。
Shapeの位置がセル範囲内にあるかどうかを判定して、その範囲内のShapeを処理する方法を解説します。TopLeftCell/BottomRightCellでShapeを含む最小のセル範囲を取得し、それとセル範囲のIntersectが一致するかを判定して処理を行います。
すべての図形オブジェクト(Shape)を選択するマクロを紹介します。すべての図形を削除したり、一括で移動したりするときに便利なマクロですね。この処理には専用のメソッド「Shapes.SelectAll」が用意されているため、コードはとても簡単です。
すべての図形オブジェクトを一括で削除するコードを紹介します。すべて削除したい場合はActiveSheet.DrawingObjects.Deleteで簡単に実行できます。グラフだけを残すような場合は、ForEachでひとつずつShape.Typeを判定して削除します。
For Eachで全図形を処理したとき変な動きをする、Shapes.Countを数えるとなぜか1個多い、入力規則の▼が消えてリストから選べない、あたりにお困りの方は、Shapesがドロップダウンリストの▼を含む罠に落ちていないかご確認ください。
Cells(R, ○)←VBAをやっている限り入力し続けることになるこのコードですが、この○を普段どうやって入力していますか?個数→P列→16という対応をいかに素早く考えるかがカギになるこの処理ですが、実はそれ以上に大事なことがあります。
汎用関数・マクロを保存する方法として「個人用マクロブック」があります。このブックは一度作ると以降はExcelの起動時に裏で開かれるのですが、実はこれを普通のブックでやることもできます。その時の細かい違いを解説します。
値が「0」のセルを置換でクリアするマクロを紹介します。単純な処理ですのでコードも単純で、Selection.Replace 0, "", lookat:=xlWhole1行でOKです。ただし、置換はChangeイベントと相性が悪いので.EnableEvents = Falseを挟んで実行します。
マクロがエラーで止まったのに「デバッグ」から1行ずつ実行したら上手くいってしまう。マクロの結果がおかしいので、ステップイン(F8)で1行ずつ実行してみたら正しい結果が出てしまうなどにお悩みの方はこの記事に目を通してみて下さい。
テーブル(ListObject)の最終行取得を解説します。これはListObject.Rangeの最終行で求めますが、そもそもテーブルはListRowプロパティを利用して、1からListRows.Countまで、のようにレコード数でForループが書けることは留意してください。
ひと口に最終行と言ってもいろいろなやり方があり、UsedRange、End、Range、CurrentRegion、AutoFilterなどが考えられます。こういう処理は関数化が便利ですが、せっかくなので1本で何でもやってくれる万能関数を作ってみましょう。
ExcelVBAにおいて、最終列を取得する方法を紹介します。シート/指定行/セル範囲(Range)/CurrentRegion/AutoFilterの最終列を取得するコードをします。仕組みは最終行を取得するときと変わりませんので、ソースコードのみ記載しました。
知らずに落ちると抜け出せなくなるVBAの落とし穴です。最終行がなぜか小さい値になるときは、この罠を疑ってください。Endプロパティは非表示セルを検知しない仕様がありますので、表示されている最後のセルしか取得できません。
CurrentRegionの最終行を取得するコードを解説します。一発で取得するプロパティは残念ながらありませんので、CurrentRegionをストレートにセル範囲に入れて、CurrentRegionの最終行 = セル範囲.Rows.Count + セル範囲.Row - 1で求めます。
オートフィルターの最終行を取得するコードを解説します。これを一発で取得するプロパティは残念ながらありませんので、AutoFilter.Rangeでフィルターのかかっているエリアを取得し、そのエリアの最終行を取得する手法を用います。