和風スパゲティのレシピ

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

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

セルに数式を入力する - Range.Formula

セルの数式をVBAで入力するための「Formulaプロパティ」の使い方を解説します。Range("D10").Formula = "=SUM(D4:D9)"のように、数式をRangeオブジェクトのFormulaプロパティに代入することで、数式をVBAから入力することができます。

ワークシート関数を使用する-WorksheetFunction

ワークシート関数をVBA上で計算するWorksheetFunctionオブジェクトの使い方を解説します。自分でコードを書くと大変だけど、関数だと1発で書けるというメリットに加え、シート関数は自分で書くより圧倒的に高速です。積極的に使っていきましょう。

VLOOKUP関数を高速化する方法2選

VLOOKUPの高速化手法は、《簡単》データが連続していることを活用した計算スキップ法と、《超高速》ソート済であることを活用した近似一致法の2種類があります。どちらも使いこなせばとても便利ですので、是非習得していってください。

セル範囲(Range)を取得する方法10選

セル範囲の指定は、簡単に書こうと思えば書けるので、普段はあまり考えない部分かもしれません。ですが読みやすさや書きやすさを追求しようと思えば、とても考えがいのある処理ですので、自分の知識の確認の意味でも、ちょっと確認してみましょう。

印刷映えする格子罫線を自動で引くマクロ

「外枠が実線で中が細い点線の格子罫線」を自動で引くマクロを紹介します。普通の格子罫線は印刷すると太くて気になりますが、一番細い点線を使うと、印刷時は点線ではなく細い直線になります。表をキレイに印刷したいときは、この設定で罫線を引きましょう。

選択範囲を1枚の用紙にクイック印刷するマクロ

選択中のセル範囲を、1枚の用紙にクイック印刷するマクロを紹介します。「選択範囲を印刷範囲に⇒上下左右の余白を0に⇒水平方向をセンタリング⇒シートを1ページに印刷に⇒範囲が横長なら用紙を横に⇒印刷する」を一括で行うマクロです。

汎用マクロ・便利ツール用の共通関数について

本ブログで紹介している、汎用マクロ・便利ツールは、特に頻出の処理を、共通の関数として抽出して使っています。共通関数のソースコードと解説を以下に記しておきますので、コードの説明が読みたい方はご利用ください。

数式を値に固定してついでに#N/Aも消すマクロ

数式を値に固定したあと、#N/Aエラーを消去するマクロを紹介します。何がやりたいかは明らかですね(笑)お忙しい方は、ソースコードをコピーして、使い方例のように実行しちゃえばOKです。コードをしっかり読みたい方は、解説もどうぞ。

Elseの中にメインコードを書かない

「If 開始条件=False Then 警告 Else メインコード Endif」と書いているマクロは、ExitSub EndIfと一旦If文を閉じることで、メインの処理をElse内に書かずに済みます。メインコードのインデントが1つ減りますし、終わった話は終わったと明示しましょう。

セル範囲の数式をコピーする - Range.Formula

セルに入力されたシート関数を、VBAを使って別のセル範囲へコピーする方法を紹介します。D2=B2*C2と入力し、これをD列全体にコピーするには、そもそもコピーする必要もなく一気に「Range("D2:D7").Formula = "=B2*C2"」でOKです。

セル範囲の値だけをコピーする - Range.Value

セルの値だけを、範囲から範囲へコピーする方法を紹介します。A1:C3の正方形を、D4:F6にコピーするコードは、実は「Range("D4:F6").Value = Range("A1:C3").Value」で済みます。「値貼り付け」より速くて読みやすいので、こちらを使いましょう。

If~Else~EndIfを1行で書く - IIf関数

便利なのに知名度のイマイチな関数「IIf関数」を紹介します。IIf([条件式], [Trueのときの値], [Falseのときの値])と書きます。IIf関数は初めて見る方でも、()の中身はよく見たことがあると思います。早い話、「シート関数のIF」が、IIf関数です。

固定のセル(Range)を定数(Const)で定義する

「固定セルを定数で扱いたい!」という場面は結構多いです。データシートの上部に固定された、「対象月」や「更新日」のセルとかですね。常に同じRangeオブジェクトをくれる定数がほしいのですが、Constではできませんので、別の方法を使います。

セル範囲のコピー&ペーストに非表示のセルは含まれる?

セル範囲をコピーした場合、オートフィルターで抽出していないレコードはペーストされません。しかし、非表示にしている列はペーストされます。この仕様の違いは、知っている方も多いのではないでしょうか。では両方がかかっているデータをコピーすると…?

For Each ○ In Range はセルごとのループとは限らない

落ちると抜け出せなくなるVBAの落とし穴です。For EachでRangeオブジェクトをループしたとき、全セルが処理されない。Rangeオブジェクト.Countがセルの数を返さない。あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

マクロの速度は追求すべきものだけを追求すべし

マクロの速度はどこまで気にするべきか?というテーマです。マクロの早さが気になってキリがないよ~に陥っていた人は、「早くする意味のないマクロ」「早くしても無駄な処理」を意識すると、早さと読みやすさのバランスが取れるようになります。

If文は判定回数より読みやすさを最適化すべし

コードの読みやすさと処理速度のバランスに関するお話です。テーマは「Ifの判定回数にどれだけこだわるか」です。単純な比較時間は、実はほとんど0で、別にIfは重複しても問題ありません。Else地獄に陥らないよう、読みやすさを追求していきましょう。

For文をたくさん分割しても処理は遅くならない

マクロの処理速度に関するお話です。今回のテーマは「錯覚しやすいForステートメントの処理速度」です。For R = 1 To 10000 処理A,B,C,D Nextは、For R = 1 To 10000 処理A Next × 4個に分けても、「Rに1を足す×30000回」しか処理の内容に差がありません。

変数の型「Long」と「Integer」の違い

VBAの変数の型である「Long型」と「Integer型」の違いを解説します。両者とも整数を扱いますが、箱の大きさが違います。使うのは常にLong型でOKです。Integerの方がメモリを使わなくて地球にやさしそうですが、気にするレベルではありません。

VALUE関数とVal関数(とCDbl関数)の違い

VBAの関数「Val関数」と、ワークシート関数「VALUE関数」の違いを解説します。とその前に、実はVALUEとValはほとんど違う関数です。ワークシートのVALUE関数と対応するVBAの関数は、Val関数ではなくCDbl関数ですので、それを念頭に解説をどうぞ。

Workbooks.Open中にShiftを押すとマクロが停止する

知らずに落ちると抜け出せなくなるVBAの落とし穴です。Wrokbooks.Open 以降が実行されない。マクロが何のエラーメッセージも出さずに静かに止まる。Exitもなく絶対実行されるはずの行が実行されない。あたりにお悩みの方は、この落とし穴を疑いましょう。

Val関数は全角(日本語入力)の「1」を0に変換する

知らずに落ちると抜け出せなくなるVBAの落とし穴です。今回の罠は超単純です。Val("全角の1") ' ← 0が返ります。という罠です。皆さん気をつけましょう。他にも罠がたくさんあるので、Val関数は正直言うと使用禁止関数です。

文字列の中にある数字を抽出する関数

指定の文字列から数字だけを抜き出す汎用関数を紹介します。数値をすべて抽出する(123みかん456 ⇒ 123456)タイプと、最初に登場したものを抽出する(1,100円(税10%) ⇒ 1,100)タイプがありますので、目的にあった方をご覧ください。

OnErrorResumeNextはIfの分岐をTrueとみなす

Ifの判定部分がOn Error Resume Nextでスキップされた場合、IfステートメントはTRUE側に分岐します。実はIfステートメントはTrueなら通ってよしという処理ではなく、FalseならEndIfまでジャンプという処理なので、それがスキップされるという理屈です。

VBAではカウンタ変数に「i」を使うな

Cells(i, 1)をもうやめて、Cells(R, 1)こうしませんか?という話です。複数のオブジェクトを扱う場面が多いExcelVBAにおいて「カウンタ変数は何のカウンタかわかるように命名する」ことは、とても重要なコーディング規約なんじゃないかと思います。

コロン:を使って複数行のコードを1行に書く

VBAでは、「:」を使うことで、複数行のコードを1行に書くことができます。これをマルチステートメントと呼びます。これを使うべきか。結論は、「使った行は読みづらくなるが、代わり全体の流れが読みやすくなるなら使ってOK」です。

Dirループ中は別関数であっても他のDirは使えない

知らずに落ちると抜け出せなくなるVBAの落とし穴です。Dir関数が途中で止まる、逆に無限ループする、「プロシージャの呼び出し、または引数が不正です。」エラーを出す、あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

ダイアログボックスでフォルダを指定・選択する

マクロの実行中に、ダイアログボックスを開き、ユーザーにフォルダを指定・選択してもらうコードを、コピペして使える関数にしたものを紹介します。ユーザーが選択したフォルダの「パス」を返す関数なので、Stringの変数に入れたりして使ってください。

IsNumeric関数とISNUMBER関数の違い

VBAの関数「IsNumeric」と、ワークシート関数「ISNUMBER」の違いを解説します。両方とも数値かどうかを判定しますが、IsNumericの方が条件が緩く「数値に見ることができる⇒True」、ISNUMBERの方が条件が厳しく「完璧に数値⇒True」という違いがあります。

ブックを現在開いているかチェックする関数

ある名前のブックを、現在開いているかを調べる関数を紹介します。Worksbooks(ブック名)の「インデックスが有効範囲にありません」エラーを回避するのによく使います。やり方は簡単で、教本のような「コレクションに対するFor Each」で処理します。