文字列のバイト数を取得

文字列のバイト数の取得にはLenB・StrConv関数の2つを組み合わせて取得します

'文字のバイト数を取得
Debug.Print LenB(StrConv("あいうアイウ", vbFromUnicode))

文字列のバイト数を取得するには「LenB」関数と「StrConv」関数を組み合わせて取得します
StrConv関数に関しての解説は以下の記事で確認してください

関数の解説

VBAではUnicode形式が採用されているため、全角も半角も2バイトで表現されています
そのため、普通に文字列を指定してバイト数を取得しようとしても全て2バイトで取得されてしまいます

LenB("あいうアイウ")
→→→ 12

このように、全角と半角が混じっていても同じ2バイトで取得されるため、半角文字が判別できません

なので、この文字形式を変換する必要があります
その変換に使用するのがStrConv関数です
引数の設定により、システムの既定文字形式に変換します

StrConv("あいうアイウ", vbFromUnicode)

LenB関数の引数内にある、この変換により半角は1バイトで表現されるようになるため半角のバイト数も取得できるようになります

変換後のデータはVBAでは表現できませんので、StrConv関数だけ実行してもよくわからない結果が返ってくるだけです

LenB(StrConv("あいうアイウ", vbFromUnicode))
→→→ 9

例コードの実行結果として「あいう」は全角3文字で6バイト、「アイウ」は半角3文字で3バイトとなるので合計の「9」が返されます

このコードを使用することで、指定文字列に全角と半角が混在しているかを判定することが出来ます
その解説に関しては以下の記事を確認してください

文字数を取得

文字列の文字数を取得するにはLen関数を使用します。取得時の注意点も解説

'文字数を取得
Debug.Print Len(ActiveCell)

文字列の文字数を取得するには「Len」関数を使用します
この関数は全角半角に関係なく文字数を取得します

関数の解説

この関数は文字列を加工する際によく使用します
また、ファイルの拡張子など文字数の決まったものの判定にも使用できます
空白の判定に使うこともできます

Len("abc")
→→→ 3

半角のabcは3文字なので「3」を返します

Len("a b c")
→→→ 5

スペースも1文字でカウントされるので「5」を返します

Len("あいう")
→→→ 3

全角の文字でも「3」を返します

Len("あいうアイウ")
→→→ 6

全角と半角が混在していても関係無いので「6」を返します

この関数では、上記のように全角と半角の判別が出来ない点には注意が必要です
区別して取得するには「LenB」関数を使用します
詳しくは以下の記事を確認してください

文字列を変換(大文字・小文字)

アルファベットの大小文字変換にはStrConv関数を使用します。1文字目のみ大文字に指定する引数もあります

'大文字に変換する
Debug.Print StrConv(ActiveCell, vbUpperCase)
'小文字に変換する
Debug.Print StrConv(ActiveCell, vbLowerCase)
'1文字目のみ大文字に変換する
Debug.Print StrConv(ActiveCell, vbProperCase)
'1文字目のみ大文字の半角に変換する
Debug.Print StrConv(ActiveCell, vbProperCase + vbNarrow)

文字列の変換には「StrConv」関数を使用します
引数の設定により、全角と半角の切り替えができます

関数の書式

引数(太字は必須引数)
(String, Conversion)
戻り値の型 Variant型(String型)

引数「String」は、変換前の文字列を指定します
引数「Conversion」は、変換するモードの指定します

関数の解説

StrConv("aBc", vbUpperCase)
→→→ ABC

「vbUpperCase」を指定すると、アルファベットが全て大文字に変換されます

StrConv("aBc", vbLowerCase)
→→→ abc

「vbLowerCase」を指定すると、アルファベットが全て小文字に変換されます

StrConv("aBc", vbProperCase)
→→→ Abc

「vbProperCase」を指定すると、アルファベットの最初の1文字目が大文字になり、2文字目以降は全て小文字に変換されます
2文字目以降に大文字があった場合も小文字に変換されます

全ての指定に共通して、大文字小文字の変換を行いますが、全角半角は変換前のものが継続しますのでそちらの変換には以下の記事にある変換を合わせて行います

StrConv("aBc", vbProperCase + vbNarrow)
→→→ Abc

4つ目の例コードでは、半角にする引数「vbNarrow」を合わせて指定することで一括で変換が可能になります

文字列を変換(ひらがな・カタカナ)

文字列のひらがな・カタカナの変換にはStrConv関数を使用します。それぞれの変換と半角カタカナにするコード

'ひらがなに変換する
Debug.Print StrConv(ActiveCell, vbHiragana)
'カタカナに変換する
Debug.Print StrConv(ActiveCell, vbKatakana)
'全角カタカナに変換する
Debug.Print StrConv(ActiveCell, vbKatakana + vbNarrow)

文字列の変換には「StrConv」関数を使用します
引数の設定により、ひらがなとカタカナの指定が可能です

関数の書式

引数(太字は必須引数)
(String, Conversion)
戻り値の型 Variant型(String型)

引数「String」は、変換前の文字列を指定します
引数「Conversion」は、変換するモードの指定します

関数の解説

StrConv("あいウエ", vbHiragana)
→→→ あいうえ

「vbHiragana」を指定すると、ひらがなに変換します

StrConv("あいウエ", vbKatakana)
→→→ アイウエ

「vbKatakana」を指定すると、カタカナに変換します
ただカタカナには、全角と半角が存在するので注意が必要です

StrConv("あいウエ", vbKatakana + vbNarrow)
→→→ アイウエ

「vbKatakana + vbNarrow」とすれば、複数の指定を一括で行えます
カタカナに変換して、合わせて半角への変換も行いますので、全角と半角が混在しているようなものに対して有効です

おもにこの変換を使用する場面は、ふりがなで使用する事が多いと思います
全角がいい場合は、「vbNarrow」を「vbWide」に修正すればいいだけです
全角半角の切り替えに関しては以下の記事を確認してください

文字列を変換(全角・半角)

文字列の全角半角の変換にはStrConv関数を使用します。それぞれに変換するコード

'全角に変換する
Debug.Print StrConv(ActiveCell, vbWide)
'半角に変換する
Debug.Print StrConv(ActiveCell, vbNarrow)

文字列の変換には「StrConv」関数を使用します
引数の設定により、全角と半角の切り替えができます

関数の書式

引数(太字は必須引数)
(String, Conversion)
戻り値の型 Variant型(String型)

引数「String」は、変換前の文字列を指定します
引数「Conversion」は、変換するモードの指定します

関数の解説

StrConv("aB123", vbWide)
→→→ aB123

「vbWide」を指定すると、半角を全て全角に変換します

StrConv("aB123", vbNarrow)
→→→ aB123

「vbNarrow」を指定すると、全角を全て半角に変換します

数字やアルファベット、カタカナの変換を行います。スペースも変換可能です
全角と半角の変換のためアルファベットの大文字小文字には対応しませんので注意してください

Val関数は全角の数字には対応していないため、これを使用して文字列を全て半角にしてから処理を行えばVal関数でも数値として取得ができるようになります
Val関数に関しての解説は以下の記事を確認してください

文字列の数字を数値で取得

Val関数を使用すると、文字列となった数字を数値として取得できます

'文字列を数値で取得する
Debug.Print Val(ActiveCell.Text)

文字列になっている数字を数値として取得するには「Val」関数を使用します
引数には文字列を指定します、取得が出来なかった場合は「0」が返されます

文字列になっている数値

文字列となっている数値は、そのままでは通常の計算を行えませんので変換する必要があります

文字列が計算できていない状態
文字列が計算されていない状態

画像を確認してください
画像のアクティブセルにはSUM関数が入力されています
引数には上のセル5つが指定されています

SUM関数の答えは「1123.456」になっています
A5はともかく、A1からA4までの合計値とは一致しません
これは、A3とA4が文字列で指定されているためです

SUM関数だけではありませんが、文字列での計算は行えません
この場合に変換が必要となり、この関数の出番がやってきます

また、この関数は「適切な型で返す」とリファレンスにあるように整数だけでなく小数点数値も対象にすることが出来ます

この関数は1文字目から読み込んでいき、数字以外の文字列が出てきた時点で読み込みを終了します

Val("10本")
→→→ 10

つまり上記のコードの様になります
A5セルの「10本」をVal関数で取得すると「本」で読み込みが終了して「10」が返されます

逆に先に数字以外の文字列が出てきた場合は数値に変換は出来ません
よくあるのが、和暦の年数取得ですが、これには使用できません

Val("令和2年")
→→→ 0

「令和2年」をVal関数で取得しても1文字目の「令」の時点で読み込みを終了するため「2」という数値が返されることはありません

Val("123.4 5 6")
→→→ 123.456

A4セルのような小数点の「.」やスペースは無視して読み込みが継続されるので、そういった文字列には対応可能です

特に注意したいのが全角数値は対応できない点です
数字であっても半角のみが対応しています
(※スペースは全角でも対応可能)
全角数字が含まれるデータを扱う場合は、事前に半角に変換する必要があります
以下の記事に半角への変換方法があります

使用場面は、画像の様に文字列入力された数字や数字の後に単位が入力されているような時に使用します

特にこの関数を知らないと、後に単位がある文字列を扱う際にMid関数で単位を除外して数字だけにして・・・と、非常に手間になるのでこの場面では非常に便利です

セルの行数・列数を取得する

セルの行数と列数の取得には、Row・Columnプロパティを使用します。アクティブセルの行列数の取得コード

'アクティブセルの行数を取得
Debug.Print ActiveCell.Row
'アクティブセルの列数を取得
Debug.Print ActiveCell.Column

セルの行数の取得には「Row」プロパティを使用します
列数の取得には「Column」プロパティを使用します

これは行数と列数の取得を行いますが、単体のセルの値が取得されます

行数と列数の取得時のセル選択範囲
範囲選択した状態

画像の様な範囲選択をしている状態で解説します

ActiveCell.Row
→→→ 4

アクティブセルの行数の取得です。4行目なので「4」が取得されます

ActiveCell.Column
→→→ 3

アクティブセルの列数の取得です。C列は3列目なので「3」が取得されます
列はアルファベットではなく、数値で取得されます

範囲選択をしていても、アクティブセルが範囲選択の中にあっても取得される数値が変わることはありません

Selection.Row
Selection.Column

このコードの様に、Selectionで指定すると選択範囲が指定されます
しかし、このプロパティは単一のセルに対してのプロパティのため、複数セルを指定した場合は、1番左上が指定されます

範囲選択した状態
範囲選択した状態
Selection.Row
→→→ 2
Selection.Column
→→→ 2

つまり、画像の選択範囲状態であった場合に取得されるのは
行数が「2」、列数が「2」となります
範囲選択の1番左上のB2セルの数値が取得されます

1つのセルに対してのプロパティであること、絶対数値であることの2点からもループ処理に向いているプロパティです
特にForループの数値指定を行えば、指定範囲を明確に行いやすくなります

月の初日と最終日を取得する

DateSerial関数で任意の指定日付の日付データを取得するコード。月の初日と最終日の取得

'本月の1日を取得
Debug.Print DateSerial(Year(Date), Month(Date), 1)
'本月の最終日を取得
Debug.Print DateSerial(Year(Date), Month(Date) + 1, 0)

月末の日にちを取得するには「DateSerial」関数を使用します
この関数は引数に数値で指定した年月日の日付データを返す関数です

関数の書式

引数(太字は必須引数)
(year, month, day)
戻り値の型 Valiant型(Date型)

引数の「year」は年の数値、「month」は月の数値、「day」は日にちの数値を指定します

関数の解説

この関数は引数に指定した数値の日付データを返しますが、指定する数値に関しては通常の日付数値範囲内でなくても大丈夫です

範囲内を超えた場合は、その上位の範囲に自動的に変換されます
引数「day」に「50」を指定すると、引数「month」に1が加算されて、残りの数値が日にちとして返されます

Debug.Print DateSerial(2020, 1, 50)

このコードを実行すると「2020/02/19」が取得されます
「50 – 31(1月の日数) = 19(2月の日数)」となり、月が加算されて結果の日付になります

これは引数「month」も同様で、「13」以上を指定すると引数「year」に繰り上げされます
引数「year」の繰り上げは無いので関係ありません

コード解説

Debug.Print DateSerial(Year(Date), Month(Date), 1)

本月の1日を取得します

年月はDate関数を使用してコード実行日を取得します
日にちは「1」を固定で指定することで、「○年○月1日」を取得できます

Debug.Print DateSerial(Year(Date), Month(Date) + 1, 0)

本月の最終日を取得します
関数の解説でもあるように、「Month(Date) + 1」が「12 + 1」でmonthの指定値が「13」になるので、yearに繰り上げされるので問題なく取得できます

また、この関数の特別な使い方で、「0以下の数値も指定可能」です
dayに「0」を指定すると、1日の前日が指定されるため、前月の最終日が指定されます

「前月の」なので、月に1を加算する必要があります
月に1を加算することで、来月の0日を指定することになり、来月の前月の最終日
つまり、今月の最終日を取得することが出来ました

また、マイナス数値も可能と言いましたが、その場合は指定数値分前の日にちが返されます

ワークシート関数にあるEOMONTH関数がVBAには無いので、こうした工夫をして最終日は取得します

配列変数の宣言(多次元)

多次元の配列変数の作成方法と多次元に関する解説

'2次元配列の宣言
Dim 多次元配列(3, 5) As String

多次元配列とは、通常の配列は1次元で表現されるのに対し、2次元以上の配列が多次元配列となります

この次元というものは、現実世界でいう次元とはイメージが違います
次元というのはデータの集合体であり、そのグループ分けされたものが別次元です

もはや、訳が分かりませんね
実際に、コードによって生成された変数を確認すると少し分かり易いです

多次元配列を宣言したときの状態
生成された多次元配列

ローカルウィンドウの画像です
例コードのある処理を実行した際に、2次元の配列が作成されます

青の行は変数名なので、これ以下のものが実際のデータ範囲です

すぐ下に「多次元配列(0)」があります、その中にはさらに6つの変数が存在しています
ようするに、次元数とは階層数と同じようにイメージしてもらうと画像と一致します

また、型の列を確認すると、青の行では「String(0 to 3,0 to 5)」となっています

これは要素のインデックスの下限と上限が表示されています
つまり、1次元は「0,1,2,3」の4要素、2次元は「0,1,2,3,4,5」の6要素が作成されていることが分かります

下限は変更可能ですが、常に「0」で考えるようにしてください
これは、この配列データの個数を数える場合に影響があることや、標準の設定をわざわざ変更することによるコードの可読性低下などが理由です

これに関しては変更するコードを書かなければ、常に「0」になるので、あまり意識しなくてもいいと思います

そして、1次元の「3」や2次元の「5」というインデックス最大値を取得するのがUbound関数です、これを利用して配列データの個数は取得します

この関数の解説は以下の記事で行っています

この次元数自体は、どんどん増やしていくことが可能です

Dim 多次元配列(3, 5, 8) As String

この様に、引数の数値を増やしていくだけです
これで、3次元配列が作成されます

ただ、次元数が増えすぎると管理が大変になるため、実用性で考えると2次元で十分かな
3次元ぐらいまでなら、なんとか管理できるけど、4次元以上になるとかなり複雑な配列になるのでコードも組むの大変でバグめっちゃ出そうやので、自分はしません

なにより、3次元以上はセルへの一括出力ができません
ワークシートは縦と横の2次元で表現されているためです

2次元配列は、セルへの一括出力が可能です

また、この多次元は静的、動的配列のどちらにも使用可能で使用方法もそれぞれの宣言に引数の数値をコードの様に記載するだけです

再定義時の注意点

多次元配列使用時は、Preserveキーワードでの再定義が行えません
最後の次元数は変更可能ですが、それ以前の次元数の再定義は行えません

ReDim 動的配列(5, 5, 5)

まず、最初にこのコードで3次元のそれぞれに要素数を定義します
その後、再定義を行う際に注意する必要が出てきます

ReDim Preserve 動的配列(5, 5, 6)
→→→ 実行可能

この様に最後の次元数の変更は可能です
当然、キーワードを使用しているので既存のデータは保持されています

ReDim Preserve 動的配列(5, 6, 5)
ReDim Preserve 動的配列(6, 5, 5)
→→→ 実行不可

こちらのように、最後の次元数以外の変更は出来ません
実行時エラーが発生します

このキーワードを使用せずに次元数を再定義することは可能ですが、既存のデータは初期化されてしまいます

多次元配列の動的使用時は、どの次元数がどの時点で確定するかをしっかり見極めたうえで使用する必要があります

配列のインデックスの最大値を取得

UBound関数は、配列データの個数を取得する際に使用します。実際には最大値を取得します

'配列の最大数を取得
Debug.Print UBound(配列変数)

配列変数のインデックスの最大値を取得するには「UBound」関数を使用します

関数の書式

引数(太字は必須引数)
UBound(arrayname, dimension)
戻り値の型 Long型

引数「arrayname」は、配列変数名を指定します
引数「dimension」は、取得する次元数を数値で指定します。省略時は1次元が指定されます。多次元配列を使用する際に、指定する引数です

多次元配列に関しては以下の記事を確認してください

関数の解説

基本的には、配列データの個数を取得するために使用しますが、この関数の戻り値がそのまま個数にはならない点には注意が必要です

と、いうのも配列データの下限値は任意に変更することが出来ます
下限値を3に設定してUbound関数で5が取得された時、要素数は3,4,5の3つとなります
通常は0から始まるため、Ubound関数の戻り値に1を加算すれば個数になります

こういったことからも、下限値はあまり変更しない方がいいと思います
当サイトは下限値の設定は行わず、常に0であると想定して解説しています

主には動的配列使用時に、要素を新規追加したりループの回数指定に使用したりします
要素のインデックス最大値なので、データの個数はそれに+1したものになります

また下限値を取得するには「LBound」関数を使用しますが、基本的に下限値を「0」以外に設定する処理は解説もしていませんので記事としての解説は割愛しておきます
使い方は全く同じ使い方をします