VBA技術解説
VBA10大躓きポイント(初心者が躓きやすいポイント)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2024-03-05 最終更新日:2024-03-06

VBA10大躓きポイント(初心者が躓きやすいポイント)


多くの人のVBA学習のお手伝いをしてきましたが、共通するVBA学習での躓きポイントはいくつかあります。
ここでは多くの人が躓くVBAの10大躓きポイントを解説していきます。
10大と言っても特に統計をとった訳ではありませんので経験からの感覚的なものです。
ほとんどの内容について既存の解説ページがありますので、補足説明をしつつ既存ページへのリンクを掲載しています。


VBA10大躓きポイントのページ内目次

変数とは

変数と定数のVBAの文法

少なくとも変数と定数のVBAの文法は理解してください。
第12回.変数宣言のDimとデータ型|VBA入門
・データ型 ・変数の使い方 ・変数名の規則 ・良く使われる変数名 ・自動型変換、暗黙の型変換 ・変数宣言の必要性 ・Dim変数宣言のまとめ
第13回.定数宣言のConstと型宣言文字|VBA入門
・Const定数の基本 ・変数でも同じ事が出来るが・・・ ・ダブルクォーテーションについて ・型宣言文字 ・Constにデータ型を指定しない場合のデータ型 ・その他の定数 ・Const変数宣言のまとめ
変数と定数|VBAベーシック|VBA技術解説
・【ここでのポイント】 ・変数の意味 ・変数の宣言 ・変数の代入と取得 ・スコープ ・定数の意味と使い方 ・変数に関係する注意すべきVBAの仕様 ・【業務改善の実務】 ・【本サイト内の関連ページ】 ・VBAエキスパート公式テキスト
変数と配列|VBAスタンダード|VBA技術解説
・【ここでのポイント】 ・静的変数 ・動的配列 ・オブジェクト変数 ・ユーザー定義型 ・【業務改善の実務】 ・【本サイト内の関連ページ】 ・VBAエキスパート公式テキスト
第108回.変数の適用範囲(スコープ,Private,Public)|VBA入門
・プロシージャーレベル変数 ・・・ プロシージャー内でのみ使用可能 ・モジュールレベル変数 ・・・ モジュール内でのみ使用可能 ・パブリック変数 ・・・ 全てのモジュールの全てのプロシージャーで使用可能 ・変数の適用範囲について簡単にまとめてると ・定数(Const)の適用範囲について ・変数の重複について ・変数は、極力狭いスコープで使う事が望ましいとされます。

変数の命名と考え方

変数は奥が深くて、実際に使うとなるとどうしたら良いのか考えることが沢山あります。
変数とプロシージャーの命名について|VBA技術解説
VBAを習い始めると、「変数」について学びます、変数に付ける名前を変数名と呼び、若干の規則はあるが、好きな名前を付けて良いと教わります。好きな名前って…ケイコ、ハルカ、アツコ… まあ、それでも良いけど、入れるデータが分かるような名前がよいですね、わかり易い名前を付けましょう。
変数を考えることはロジックを考える事|VBA技術解説
変数を考えることはロジックを考える事 変数宣言の位置についての議論は絶えません。先頭に宣言、直前で宣言 しかし、これらは単なるコーディング上のテクニックの話であり本質から離れています。中上級者になってからのテクニックとプログラミングの本質がごっちゃになって議論されてしまっている気がします。

オブジェクト変数

変数といっても、オブジェクト変数はまた違うものですね。
第52回.オブジェクト変数とSetステートメント|VBA入門
・オブジェクト変数 ・個有のオブジェクト型とは ・Setステートメント ・Setステートメントの使用例 ・WithとSetの使い分け方 ・Setステートメントの実践的な使い方 ・Is演算子によるオブジェクトの比較 ・最後に
オブジェクト変数とは何か|VBA技術解説
・そもそも変数とは何か ・変数の入れ物としての大きさは ・オブジェクト変数にオブジェクトは入っていない ・オブジェクト変数のメモリアドレス ・Is演算子によるオブジェクトの比較 ・TypeOf演算子 ・オブジェクト変数を使う時の注意点 ・オブジェクト変数の最後に

変数のメモリアドレス

メモリアドレスのことまで知っている必要はありませんが、、、
興味があれば読んでみてください。
VBAにおける変数のメモリアドレスについて|VBA技術解説
・メモリアドレスを取得する関数とメモリコピーのWindowsAPI ・メモリアドレスを確認するために使用したVBA ・文字列型Stringのメモリアドレス ・Integer, Long, Single, Double, Dateのメモリアドレス ・Variantのメモリアドレス ・配列のメモリアドレス ・オブジェクトのメモリアドレス ・ByRef,ByValのメモリアドレス


どこでインデントすれば良い

VBAでは開発環境による自動インデントがないので、インデントの仕方は人それぞれになってしまっています。
こうしなくてはダメだという規則があるわけではありませんが・・・
とはいえ、一般的に推奨されるインデントの基本は押さえておきましょう。

VBAでの推奨インデント

VBAのインデントについて
・VBAのインデントの模範 ・VBAのブロックについて ・VBAのインデントの具体例 ・インデントの最後に

一言で言ったら、ブロック構文の中はインデントするということです。

VBA10大躓きポイント

VBE(Visual Basic Editor)でのインデント操作

VBE(Visual Basic Editor)でのインデント操作はしっかり習得しておきましょう。

VBEの使い方:ショートカットキーとコード編集|VBA入門
・VBEショートカット一覧 ・ショートカットキーの具体的な使い方 ・コメントアウト ・ショートカットとコード編集の最後に

ショートカット キー 説明
Tab インデント
Shift + Tab インデントを戻す


カンマ「,」とピリオド「.」と半角スペース「 」

これについては、そのものズバリの記事があります。
VBAにおけるピリオドとカンマとスペースの使い方|VBA技術解説
・ピリオド「.」 ・カンマ「,」 ・スペース「 」

ピリオドはくっつけるもの
カンマは区切るもの
スペースは単語の区切り


「:=」ってどこで使う

「:=」記号の読み方としては、
Pythonでは、「セイウチ演算子」「ウォルラス演算子」などと呼ばれています。
VBAでは特定の呼び方はなく、
「コロンイコール」
と呼ぶのが普通です。

余談では在りますが、数学における「:=」は、左辺を右辺で定義するという意味になるそうです。

VBAで「:=」を使うのは、関数やメソッドの名前付き引数でのみ使います。
第25回.名前付き引数について|VBA入門
・仮引数と実引数 ・メソッドとは ・名前付き引数について ・名前付き引数の例文 ・名前付き引数の必要性


「"」が多すぎて

VBAで文字列定数を記述するときは、「"」2つの間に文字列を記述します。
文字列として「"」を記述するときは、「"」を連続2つで記述します

規則としてはこれだけなのですが、実際にVBAで書くと、「"」が沢山出てきてわからなくなってしまうことが多いです。

フォルダ指定の文字列作成で良く書かれるVBA

Dim sPath As String, sSubDir As String
sSubDir = "DATA"
sPath = ThisWorkbook.Path & "\" & sSubDir & "sampla.xlsx" 

この"\"はフォルダの中のサブフォルダを指定する場合のフォルダ連結の文字列としての"\"です。
& は、VBAの文字列連結の演算子の& になります。
あるセルの文字と、あるセルの文字をくっつけて、別のセルに表示する、よくある事例であり、頻繁に行われることです。A1セルに"abc" B1セルに"123" この時に、C1セルに"abc123"を入れるような場合のマクロVBAになります。
演算子なので"で囲んだりしません。
「\」も「&」も記号ですが、文字列として扱うものは"の中に入れますが、演算子は"で囲んだりせずにそのまま書きます。

セルに数式を入れるVBA

B2セルに、
=IF(A2="","",A2*2)
この数式を入れるVBAです。

 Range("B2").Formula = "=IF(A2="""","""",A2*2)"

数式には「""」という記述は良く出てきます。
「"」が使われている文字列を扱うときは、
メモ帳等で、「"」を「""」に置換するのが一番手っ取り早いです。
セルの数式をコピーしてメモ帳に貼り付け、
「"」を「""」に置換した後にVBAで""の中に貼り付けます。

VBA10大躓きポイント


暗黙の型変換とは

VBAではデータの自動型変換、暗黙の型変換が行われます。
この、型変換がいつどのように行われるかの全てを覚えるのは困難です。
そのため、意図しない場面で型変換が行われてしまい、意図しない結果になってしまうことがあります。

VBAの基本としては、
型変換できるものは自動で型変換します。
型変換できないものはエラーとなります。
まずはこの基本だけは覚えておいてください。

自動型変換、暗黙の型変換|第12回.変数宣言のDimとデータ型|VBA入門
第12回.変数宣言のDimとデータ型|VBA入門
・データ型 ・変数の使い方 ・変数名の規則 ・良く使われる変数名 ・自動型変換、暗黙の型変換 ・変数宣言の必要性 ・Dim変数宣言のまとめ

代入の場合

代入先の型に自動的に変換して代入されます。
この時、代入先の型に変換できない場合に型エラーとなります。
そのデータ型が格納できる数値範囲を超えている場合もエラーになります。
Integerは-32,768 ~ 32,767の範囲ですので、この範囲外の数値を入れるとエラーになります。

演算の中では

演算子によって自動的に型変換されます。
算術演算子であれば、数値変換後に計算されます。
ただし、
+演算子は、足し算の演算子であると同時に文字列結合の演算子でもあるので、
2項とも数値なら足し算、片方でも文字列なら文字列結合が行われます。
(文字列結合については次々回に説明します。)


データ型変換関数一覧

明示的に型変換を行う場合は、以下の関数を使用します。

関数名 戻り値の種類 引数の範囲
CBool関数 Boolean 任意の有効な文字列式または数式を指定します。
CByte関数 Byte 0 から 255。
CCur関数 Currency -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807。
CDate関数 Date 任意の有効な日付式。
CDbl関数 Double 負の値の場合は -1.79769313486231E308 ~ -4.94065645841247E-324
正の値の場合は4.94065645841247E-324 ~ 1.79769313486232E308。
CDec関数 Decimal ゼロスケールの値 (小数部分がない値) の場合は 79,228,162,514,264,337,593,543,950,335 です。
小数点以下が 28 桁の値の場合は 7.9228162514264337593543950335 です。
0 以外で可能な最小値は 0.0000000000000000000000000001 です。
CInt関数 Integer -32,768 から 32,767。
小数点以下は丸められます。
CLng関数 Long -2,147,483,648 から 2,147,483,647。
小数点以下は丸められます。
CLngLng関数 LongLong -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807。
小数点以下は丸められます (64 ビット プラットフォームのみで有効)。
CLngPtr関数 LongPtr 32 ビットのシステムでは -2,147,483,648 ~ 2,147,483,647
64 ビットのシステムでは -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807。
32 ビットと 64 ビットのどちらのシステムでも、小数部分は丸められます。
CSng関数 Single 負の値の場合は -3.402823E38 ~ -1.401298E-45
正の値の場合は 1.401298E-45 ~ 3.402823E38。
CStr関数 String CStr の戻り値は、引数に依存します。
CVar関数 Variant 数値の場合はDoubleと同じ範囲です。
数値以外の場合はStringと同じ範囲です。


用語が難しい(オブジェクト、プロパティ、メソッド)

用語は単に正式な呼び名を覚えるということになりのます。
しかし、用語を覚えたからと言ってVBAが書けるようになる訳ではありません。
用語を覚える過程で、その用語が意味する重要な概念を少しずつ理解していきましょう。

第12回.エクセルの言葉を理解する(オブジェクト、プロパティ、メソッド)|VBA再入門
・VBAが表示するメッセージ ・オブジェクト、プロパティ、メソッド ・プロパティとメソッドの違い ・オブジェクトの階層(親子構造) ・プロパティの省略 ・エクセルの言葉であるVBAを日本語に翻訳する ・最終行取得のコードを訳してみる ・VBA用語を覚えることについて ・ExcelマクロVBA入門等の対応ページ
オブジェクト式について|VBA技術解説
・オブジェクト式の書き方 ・オブジェクトは直接指定できない ・オブジェクト式の書き始めは何か ・メソッドとプロパティの違いについて ・オブジェクト式の最後に
オブジェクトの探索方法|VBA技術解説
・オブジェクト探索の説明で使う例題 ・自動記録を使ってオートシェイプの概要を知る ・ローカルウィンドウでオートシェイプのテキストを調べる ・オートシェイプの位置移動について ・VBAを完成させる ・オブジェクトブラウザーを使いさらにオブジェクトを調べる ・ウォッチウィンドウについて
第140回.Property {Get|Let|Set} ステートメント|VBA入門
・そもそもプロパティとは ・VBAでプロパティを作成するステートメント ・Property {Get|Let|Set} ステートメントの構文 ・Propertyプロシージャの使用例 ・Propertyプロシージャの実践例


配列とは

配列は覚えることがた沢山あります。
一度に全てを覚えようとすると大変なので、必要に応じて少しずつ覚えて使える範囲を広げていきましょう。

第111回.静的配列
・配列とは ・静的配列と動的配列 ・配列の宣言 ・多次元配列 ・要素の下限の変更 ・配列について
第112回.動的配列(ReDim)
・ReDimステートメント ・要素数の変更について ・配列について
第113回.配列に関連する関数
・LBound関数とUBound 関数 ・Array関数 ・IsArray 関数 ・Join関数 ・Filter関数 ・Eraseステートメント
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
・セル範囲⇔配列の基本VBA ・使用例 ・配列およびマクロVBAの高速化に関するページ
第115回.Split関数
・Split関数 ・区切り文字が文字列式内に存在しない場合 ・空文字("")をSplitした場合 ・Split関数の使用例
VBAの配列まとめ(静的配列、動的配列)|VBA技術解説
・配列の概念 ・静的配列 ・動的配列 ・セル範囲⇔配列の基本 ・配列で必要となるVBA関数とステートメント ・配列に関する記事の一覧


ByValとByRef

値渡し(ByVal)、参照渡し(ByRef)の概念を完全に理解するには、それなりの学習時間が必要になります。
プロシージャーの引数|VBA入門
・引数の構文 ・引数の使用例 ・引数について
値渡し(ByVal)、参照渡し(ByRef)について|VBA技術解説
・ByVal(値渡し)とByRef(参照渡し) ・普通の変数(プリミティブ型)の場合 ・オブジェクト変数の場合 ・サイト内のByVal,ByRefの記事

以下の文章の意味が理解できればOKです。

ByVal:値渡し

変数の中のデータを渡すもので、呼出側の変数は影響を受けません。
つまり、値渡しでは、呼出し先で引数の値を変更しても、呼出し元の引数は変更されません。

ByRef:参照渡し

変数そのものを渡すもので、呼出側の変数が影響を受けます。
つまり、参照渡しでは、呼び出し先で引数の値を変更すると、呼び出し元の引数も変更されます。


VBAを書く場所

標準モジュールとシートモジュールの違い|VBA技術解説
・書かれている場所と概要 ・シートを省略してRangeやCellsと記述した時 ・他モジュールから使う時 ・デバッグ時の違い ・標準モジュールとシートモジュールの使い分け方

最初は全て標準モジュールに書くものだと考えて差し支えありません。
VBA学習が進むと、以下の全てのモジュールが扱えるようになります。

標準モジュール
シートモジュール
ブックモジュール
フォームモジュール
クラスモジュール




同じテーマ「マクロVBA技術解説」の記事

VBAの小数以下の演算誤差について
スピルでVBAの何が変わったか
CharactersプロパティとCharactersオブジェクト
ユーザーに絶対に停止させたくない場合のVBA設定
印刷範囲の設定・印刷範囲のクリア
VBAの省略可能な記述について
VBAのVariant型について
VBAのインデントについて
VBAの演算子まとめ(演算子の優先順位)
列幅不足による###表示や指数表示を判定する
VBA10大躓きポイント(初心者が躓きやすいポイント)


新着記事NEW ・・・新着記事一覧を見る

ブール型(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)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ