2020-07-01から1ヶ月間の記事一覧
数式を値に固定したあと、#N/Aエラーを消去するマクロを紹介します。何がやりたいかは明らかですね(笑)お忙しい方は、ソースコードをコピーして、使い方例のように実行しちゃえばOKです。コードをしっかり読みたい方は、解説もどうぞ。
「If 開始条件=False Then 警告 Else メインコード Endif」と書いているマクロは、ExitSub EndIfと一旦If文を閉じることで、メインの処理をElse内に書かずに済みます。メインコードのインデントが1つ減りますし、終わった話は終わったと明示しましょう。
セルに入力されたシート関数を、VBAを使って別のセル範囲へコピーする方法を紹介します。D2=B2*C2と入力し、これをD列全体にコピーするには、そもそもコピーする必要もなく一気に「Range("D2:D7").Formula = "=B2*C2"」でOKです。
セルの値だけを、範囲から範囲へコピーする方法を紹介します。A1:C3の正方形を、D4:F6にコピーするコードは、実は「Range("D4:F6").Value = Range("A1:C3").Value」で済みます。「値貼り付け」より速くて読みやすいので、こちらを使いましょう。
便利なのに知名度のイマイチな関数「IIf関数」を紹介します。IIf([条件式], [Trueのときの値], [Falseのときの値])と書きます。IIf関数は初めて見る方でも、()の中身はよく見たことがあると思います。早い話、「シート関数のIF」が、IIf関数です。
「固定セルを定数で扱いたい!」という場面は結構多いです。データシートの上部に固定された、「対象月」や「更新日」のセルとかですね。常に同じRangeオブジェクトをくれる定数がほしいのですが、Constではできませんので、別の方法を使います。
セル範囲をコピーした場合、オートフィルターで抽出していないレコードはペーストされません。しかし、非表示にしている列はペーストされます。この仕様の違いは、知っている方も多いのではないでしょうか。では両方がかかっているデータをコピーすると…?
落ちると抜け出せなくなるVBAの落とし穴です。For EachでRangeオブジェクトをループしたとき、全セルが処理されない。Rangeオブジェクト.Countがセルの数を返さない。あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。
マクロの速度はどこまで気にするべきか?というテーマです。マクロの早さが気になってキリがないよ~に陥っていた人は、「早くする意味のないマクロ」「早くしても無駄な処理」を意識すると、早さと読みやすさのバランスが取れるようになります。
コードの読みやすさと処理速度のバランスに関するお話です。テーマは「Ifの判定回数にどれだけこだわるか」です。単純な比較時間は、実はほとんど0で、別にIfは重複しても問題ありません。Else地獄に陥らないよう、読みやすさを追求していきましょう。
マクロの処理速度に関するお話です。今回のテーマは「錯覚しやすいForステートメントの処理速度」です。For R = 1 To 10000 処理A,B,C,D Nextは、For R = 1 To 10000 処理A Next × 4個に分けても、「Rに1を足す×30000回」しか処理の内容に差がありません。
VBAの変数の型である「Long型」と「Integer型」の違いを解説します。両者とも整数を扱いますが、箱の大きさが違います。使うのは常にLong型でOKです。Integerの方がメモリを使わなくて地球にやさしそうですが、気にするレベルではありません。
VBAの関数「Val関数」と、ワークシート関数「VALUE関数」の違いを解説します。とその前に、実はVALUEとValはほとんど違う関数です。ワークシートのVALUE関数と対応するVBAの関数は、Val関数ではなくCDbl関数ですので、それを念頭に解説をどうぞ。
知らずに落ちると抜け出せなくなるVBAの落とし穴です。Wrokbooks.Open 以降が実行されない。マクロが何のエラーメッセージも出さずに静かに止まる。Exitもなく絶対実行されるはずの行が実行されない。あたりにお悩みの方は、この落とし穴を疑いましょう。
知らずに落ちると抜け出せなくなるVBAの落とし穴です。今回の罠は超単純です。Val("全角の1") ' ← 0が返ります。という罠です。皆さん気をつけましょう。他にも罠がたくさんあるので、Val関数は正直言うと使用禁止関数です。
指定の文字列から数字だけを抜き出す汎用関数を紹介します。数値をすべて抽出する(123みかん456 ⇒ 123456)タイプと、最初に登場したものを抽出する(1,100円(税10%) ⇒ 1,100)タイプがありますので、目的にあった方をご覧ください。
Ifの判定部分がOn Error Resume Nextでスキップされた場合、IfステートメントはTRUE側に分岐します。実はIfステートメントはTrueなら通ってよしという処理ではなく、FalseならEndIfまでジャンプという処理なので、それがスキップされるという理屈です。