和風スパゲティのレシピ

日本語でコーディングするExcelVBA

2021-01-01から1年間の記事一覧

プロシージャ[Sub/Function]の使い方入門

マクロを作るSubやFunctionを、正確にはSubプロシージャ/Functionプロシージャと呼びます。このプロシージャは「使いどころがわからない」と悩む人が多く、そんな方々へ向けて、プロシージャ分割の基礎と使いどころを解説いたします。

12/11(土)20:00~ VBA勉強会「Sub/Functionの使い方入門!」

12/11(土)20:00~ Zoom勉強会に登壇します。「Sub/Functionの使い方入門!」と題し、Functionを一度も使ったことがない方や、1マクロ1Subで作っている方向けの入門解説を行います。無言OK聞き専OKですのでお気軽にご参加ください。

ブログタイトル「和風スパゲティ」の由来

このブログを始めて2年が経過しました。いつもご愛読いただいている皆様ありがとうございます!節目くらいは雑談ということで、ブログ生誕記念に「和風スパゲティのレシピ」というブログタイトルの由来を書いておこうと思います。

50日連続投稿達成!良かったこと悪かったこと

この記事をもって、ブログの連続投稿が50日になりました。さすがに50日お付き合いいただいた方はいないと思いますが、3日でも4日でもお付き合いいただいた皆様ありがとうございます(´∀`)ここで区切りにして感想を書いておこうと思います。

Findは遅くて非表示に弱くてユーザー操作の影響を受ける

検索によく用いられるFindメソッドさんですが、実は危なくて遅い地雷メソッドです。非表示セルを見つけられない、ユーザーと設定を共有する、MATCH関数より十数倍レベルで遅い、の三重苦なので、なるべく使わないようにしましょう。

VBAでインクリメント演算子(++i)を使う方法

インクリメント演算子とは、i = i + 1 というコードを ++ i のように短縮表現するための演算子です。他言語経験者の方にはおなじみの書き方ですが、残念ながらVBAにはインクリメント演算子がありませんので、自作関数で代用しましょう。

ウィンドウ枠固定と印刷タイトルを同時設定するマクロ

シート最上部を常に表示する設定は、ディスプレイ用の「ウィンドウ枠の固定」と、印刷用の「印刷タイトル」の2つの設定があります。この2つの設定は同じ位置に設定することが多いので、同時設定するショートカットを作ってしまいましょう。

上下左右の印刷余白を0にするマクロ

上下左右の印刷余白を0にするマクロを紹介します。PageSetupオブジェクトに○○Marginというプロパティが6つあるので、それをすべて0にするだけです。マウスだと20回以上クリックが必要な作業をワンクリックにできるのはとても便利ですね。

プログラマ向けピアノ楽譜の読み方

このブログの記事数が150を突破しました。いつもご愛読いただきありがとうございます。50記事に1回くらいは雑談でも書こうかと思っていますが、別に節目でもないので普通に雑談を始めたいと思います。お暇な方はお付き合いください。

アクティブブックの保存フォルダを開くマクロ

現在のブックが保存されているフォルダを、エクスプローラーで開くマクロを紹介します。「今作業してるファイルと同じフォルダにあるファイルを開きたい」をワンクリックでやるためのマクロですね。Shell関数1行で簡単に実装できます。

マジックナンバーを減らす方法6選

マジックナンバーという用語をご存知でしょうか?Cells(R, 4) = Cells(R, 2) * Cells(R, 3)など、直接入力された数値を指す用語です。この3つの数値は、改修時の書き換えが面倒かつ危険でしかも読みづらいので、なくさなければいけない数字です。

指定のフォルダをエクスプローラーで開く

指定のフォルダをエクスプローラーで開く方法を紹介します。この処理は、Shell "C:\windows\explorer.exe " & フォルダパス & "\", vbNormalFocusで実装できます。局所的な使い方のコードですので、おまじないだと思って使って構いません。

個人用マクロブックの作り方と使い方3選

「いつでも使えるコード」を書くのに便利な個人用マクロブックの作り方・使い方を紹介します。「マクロをツールバーやショートカットキーにセット」「汎用関数集(ライブラリ)の保管場所」「コードテンプレート置き場」が3大活用法です。

Function名に句読点を使うとシート上で呼べなくなる

Functionプロシージャの名前に句読点を使用すると、ワークシート上でユーザー定義関数として呼び出せなくなります。読点「、」とカンマ「,」、句点「。」とピリオド「.」が自動変換されることが原因のように思えますが定かではありません。

Worksheet.Selectと.Activateの違い

Worksheetオブジェクトから呼び出す場合の、SelectメソッドとActivateメソッドの違いを説明します。どちらもアクティブシートを設定/変更できるメソッドですが、単独のシート選択はActivate、複数のシート選択はSelectがそれぞれ得意です。

すべてのシートをA1セル選択状態にするマクロ

すべてのシートを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を判定して削除します。

Shapesにはドロップダウンリストの▼が含まれる

For Eachで全図形を処理したとき変な動きをする、Shapes.Countを数えるとなぜか1個多い、入力規則の▼が消えてリストから選べない、あたりにお困りの方は、Shapesがドロップダウンリストの▼を含む罠に落ちていないかご確認ください。

Cells(R, ○)←○を入力するスピードを極めろ!

Cells(R, ○)←VBAをやっている限り入力し続けることになるこのコードですが、この○を普段どうやって入力していますか?個数→P列→16という対応をいかに素早く考えるかがカギになるこの処理ですが、実はそれ以上に大事なことがあります。

個人用マクロブックと普通のブックの違い

汎用関数・マクロを保存する方法として「個人用マクロブック」があります。このブックは一度作ると以降はExcelの起動時に裏で開かれるのですが、実はこれを普通のブックでやることもできます。その時の細かい違いを解説します。

選択エリアの0値を置換で消去するマクロ

値が「0」のセルを置換でクリアするマクロを紹介します。単純な処理ですのでコードも単純で、Selection.Replace 0, "", lookat:=xlWhole1行でOKです。ただし、置換はChangeイベントと相性が悪いので.EnableEvents = Falseを挟んで実行します。

通常の実行ではエラーが出るのに1行ずつ実行すると上手くいく原因

マクロがエラーで止まったのに「デバッグ」から1行ずつ実行したら上手くいってしまう。マクロの結果がおかしいので、ステップイン(F8)で1行ずつ実行してみたら正しい結果が出てしまうなどにお悩みの方はこの記事に目を通してみて下さい。

テーブル(ListObject)の最終行を取得する

テーブル(ListObject)の最終行取得を解説します。これはListObject.Rangeの最終行で求めますが、そもそもテーブルはListRowプロパティを利用して、1からListRows.Countまで、のようにレコード数でForループが書けることは留意してください。

最終行/最終列を取得する万能関数を作る

ひと口に最終行と言ってもいろいろなやり方があり、UsedRange、End、Range、CurrentRegion、AutoFilterなどが考えられます。こういう処理は関数化が便利ですが、せっかくなので1本で何でもやってくれる万能関数を作ってみましょう。

最終列を取得する方法5選

ExcelVBAにおいて、最終列を取得する方法を紹介します。シート/指定行/セル範囲(Range)/CurrentRegion/AutoFilterの最終列を取得するコードをします。仕組みは最終行を取得するときと変わりませんので、ソースコードのみ記載しました。

Endによる最終行取得は非表示の行を検知できない

知らずに落ちると抜け出せなくなるVBAの落とし穴です。最終行がなぜか小さい値になるときは、この罠を疑ってください。Endプロパティは非表示セルを検知しない仕様がありますので、表示されている最後のセルしか取得できません。

CurrentRegionの最終行を取得する

CurrentRegionの最終行を取得するコードを解説します。一発で取得するプロパティは残念ながらありませんので、CurrentRegionをストレートにセル範囲に入れて、CurrentRegionの最終行 = セル範囲.Rows.Count + セル範囲.Row - 1で求めます。

オートフィルターの最終行を取得する

オートフィルターの最終行を取得するコードを解説します。これを一発で取得するプロパティは残念ながらありませんので、AutoFilter.Rangeでフィルターのかかっているエリアを取得し、そのエリアの最終行を取得する手法を用います。