RGB関数と色の指定について

色の指定を行うためのRGB関数と色の定数について

'色数値を返す
Debug.Print RGB(111, 222, 333)

色の指定に関しては、VBAでは赤・緑・青の3原色を0~255の数値でそれぞれを指定することで表現されています
これ自体は特別なことではないとは思いますので、イメージは出来ると思います
0を含むので合計256の指定となります、内部数値ではその乗算数値になります

色の指定に関して、最も簡単なのがRGB関数を利用する形です
この関数は引数にそれぞれ上記で記載した数値の指定を行うことで色の数値を返す関数です

色の表現は整数値で表されており、赤だけなら255という数値、緑なら32768という数値で表現されます
しかし、この数値自体を理解して利用するのは現実的ではないので関数を利用します

また関数以外の指定方法として定数を指定することも出来ます
先ほどの緑なら、定数は「rgbGreen」として登録されています
定数なので微妙な色はイメージしづらいですが、緑ならGreen、赤ならRedという様に英単語を少し理解していれば比較的イメージしやすい定数となっています

定数の一覧は以下のリンク先に一覧があります
Microsoft Docs-XlRgbColor 列挙 (Excel)

固定した色なら定数の方が便利です
定数に無かったり、微妙な色合いやユーザー設定などで色の変化をさせるにはRGB関数を使用します

RGB関数自体も、その関数名の並び順に引数が指定できるので、引数を忘れてしまうことも少ない扱いやすい関数です
Red、Green、Blueの順番に引数数値を指定すればいいだけですね

Excel2007以降は色の幅が大きく広がった事もあり、原色だけを使っているフォーマットも少なくなってきました
そういった微妙な色合いを有効に活用して、見栄えの良いフォーマットやユーザーフォームを作成してみてください

CreateObject関数について

CreateObject関数はExcelVBAとは別の機能を利用するために使用する関数です

'Excelの新規作成
Dim zzExApp As Object
Set zzExApp = CreateObject("Excel.Application")
'新規作成したExcelの表示
zzExApp.Visible = True
'新規作成したExcelの終了と変数の開放
zzExApp.Quit
Set zzExApp = Nothing

CreateObject関数は、アプリのインスタンスを作成する関数です
この作成したインスタンスは必ず変数に代入して使用します
その時に使用するのは、基本的にはObject型を指定します

例コードではExcelを追加で新規起動します
コードのあるExcelとは別のアプリとして起動しますので、Excel関係の設定であったりを使用中のExcelとは別に指定することが出来ます

VisibleプロパティにTrueを指定することで、表示されるようになります
これを行わないとバックグランド実行となり、変数を開放してしまったり処理が強制終了するとVBAから終了させることが不可能となり起動したままになってしまいます

何らかのブックを開いた状態で、そうなってしまうとそのブックが別のユーザーが使用中となり編集が出来なくなります

この場合にはタスクマネージャーからプロセスの終了を行う必要があります

そのため、この関数を使用してアプリを使用する場合はおおよそVisibleプロパティを最初に設定して表示状態にしておく方が無難です
Visibleプロパティに関しては以下の記事で解説しています

ここまでの話であれば、それほど使用場面は無さそうな関数と感じるかもしれません
ですがこの関数の最大の利用場面は、Excel以外のアプリを使用できることにあります

ExcelVBAの標準機能で使用できるExcelファイル以外のデータが扱えるのはせいぜいテキストデータ程度です
しかし、この関数を使用すると同じOfficeソフトであるWord・PowerPoint・Outlook・AccessそれぞれのアプリやファイルをExcelVBAから操作することもできます
またInternetExplorerの操作によるWeb操作も可能になります

それ以外にもFileSystemObjectやDictionaryの利用時にも使用します

VBAをやり込んでいけば、必ずVBAだけで実現できない場面に遭遇します
その時にVBAの限界と諦めるか、VBAから操作できるものは全て使い切ると考えるかこの関数が使えるかによると言っても過言ではありません

アプリのインスタンスを作成するというだけの関数ですが、この関数からの広がる世界はExcelVBAの世界を遥かに超えた世界になります

どうせならその世界を経験して欲しいなと思います
出来ることが劇的に増えて、とんでもなくおもろいねん、これが

EOF関数(プロパティ)

EOF関数(プロパティ)はデータの末尾を判定するために使用します

EOF関数とは、開かれているデータの末尾を調べる関数です
データベースではプロパティとして使用されます

データが末尾に到達した時点で「True」を返します
それ以外の時点では「False」を返します

主に使用するのは、テキストデータの読み取りや、データベースデータのレコードの最終データの判定に使用します

関数の書式

引数(太字は必須引数)
(Filenumber)
戻り値の型 Integer型(Boolean型)

引数「Filenumber」はOpenステートメントで開いたときのファイル番号です

プロパティでの使用時に引数はありません

実際の使用場面

今回はよく使用するテキストデータの末尾判定処理を行います

取得を行うテキストデータ
末尾判定を行うテキストデータ

この画像のテキストデータを取得しながらEOF関数の動きを確認します

Sub 処理テスト()
Open ThisWorkbook.Path & "\新しいテキスト ドキュメント.txt" For Input As #1
    Do Until EOF(1) = True
        Debug.Print EOF(1)
        Line Input #1, 文字列変数
        Debug.Print 文字列変数
    Loop
    Debug.Print EOF(1)
Close #1
End Sub

このコードが今回作成した処理です
内容としては、テキストデータをメモリ上に読み込みモードで開き
そのファイル番号をEOF関数で「True」が返されるまで取得し続けるループ処理です

EOF関数のコード上の動き
コードの動き

画像の動きを確認してください
EOFがテキストデータの存在している場合には「False」が返されています
データが末尾に来た時点で「True」が返されてループが終了しています

この判定を行っていないと、データが存在しない状態で参照しようとしてエラーが発生します

また、ループ条件の1行に関して

    Do Until EOF(1) = True

この部分に関しては、If関数と同様に比較を行わない方法でも構いません

    Do Until EOF(1)

この様に、「=」以降は入力しなくても関数がTrueを返して条件が成り立つので必要はありません

ただ、それはある程度知識のある人が見てパッと分かるようなコーディングだと思いますのでIfステートメントにしても、自分は「= True」は省略しないようにしています

比較を行わないので、処理速度にも影響はあるようです
見やすさの方が重視するので、あまり気にしませんがねぇ

なお、テキストデータを一括で1つのデータで読み込む場合は
以下の方法も利用できます

テキストデータを1文字ずつ取得する

テキストデータから指定文字数を取得するにはInput関数を使用します。Input#ステートメントとは別物になります

'テキストデータから1文字取り出す
文字列変数 = Input(1, 1)
'テキストデータから1文字ずつ全て取り出す
Open ThisWorkbook.Path & "\新しいテキスト ドキュメント.txt" For Input As #1
Do Until EOF(1) = True
文字列変数 = Input(1, 1)
Debug.Print 文字列変数
Loop
Close #1

テキストデータから指定の文字数を取得するには「Input」関数を使用します
同じ名前のInput#ステートメントとは使い方が全く違いますので注意してください

例えば、テキストデータの文字列の文字コードを調べていきたい場合に使用できます
文字コードの取得は1文字ずつしか行えませんので、この関数で1文字ずつ取得していくことで簡単に調べることができます

関数の書式

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

引数「Number」は取得する文字数です。バイト数ではなく文字数になりますので、半角も全角もどちらでも1文字は「1」になります

引数「Filenumber」はOpenステートメントで開いたファイル番号です

コード解説

文字列変数 = Input(1, 1)

関数で戻り値があるので、基本的に変数などに代入させて使用します

このコードでは、ファイル番号1の1文字を取得します
この関数をコード中で再度実行すると、次の文字が取得されます
なので、ループ処理を使用することで最後まで取得させることができます

2つ目の例コードのループ処理を以下で解説します

Open ThisWorkbook.Path & "\新しいテキスト ドキュメント.txt" For Input As #1
~~ 中略 ~~
Close #1

Openステートメントの取得モード「Input」で指定テキストファイルを開いています
この時、対象ファイルが存在しない場合は新規作成されてしまいます

Close#ステートメントで開いたデータをメモリから閉じています

Do Until EOF(1) = True
~~ 中略 ~~
Loop

テキストデータを最後まで参照するためのループ処理です

取得するテキストデータの最終データを判定するEOF関数を使用してループを行います

文字列変数 = Input(1, 1)
Debug.Print 文字列変数

ここで1文字を取得して、イミディエイトに出力しています

このループ処理のイミディエイト出力の箇所に、処理を組めばテキストデータを1文字ずつ加工していくことができます

文字コードから文字入力する

Chr関数はコードから特別な文字入力を行えます、よく使う入力コードを掲載

'「 」半角スペースを入力
Debug.Print Chr(32)
'「"」ダブルクォーテーションを入力
Debug.Print Chr(34)
'「'」シングルクォーテーションを入力
Debug.Print Chr(39)
'タブ(半角スペース4つ)を入力
Debug.Print Chr(9)
'改行文字(vblf)を入力
Debug.Print Chr(10)
'改行文字(vbcr)を入力
Debug.Print Chr(13)

文字コードから文字を入力するには「Chr」関数を使用します

引数に指定されたコードの文字を返します

例コードでは、VBAのコード中で特別な意味を持つため文字として入力する際によく使用されるものを上げています

「”」は文字列として入力したい場合に使用します、いちおう連続入力で代用はできます
このあたりの解説は以下の記事で行っています

また改行文字はVBAでよく使われるのが「vbcrlf」ですが、コードを見て分かるようにこの「vbcr」と「vblf」が結合されているものであることが分かります
Asc関数で「vbcrlf」のコードを取得すると、先にある「vbcr」の「13」が取得されます

文字コードに関しては以下のリンクから確認することが出来ます
MicrosoftDocs-文字セット(0~127)

この関数に指定するコードはAsc関数で調べることもできます
Asc関数に関しては以下の記事で解説しています

上記のAsc関数の解説記事内でもありますが、このChr関数もBとWを付与することで同じように文字コードから入力できます

ただ、VBAでは1バイト文字というのが存在しません
半角であっても2バイトで表現されるためです、なのでVBAコード上で表現できないためワークシートに入力して使用しますが、非常に使いどころが少なく良い例が見つかりませんので割愛しておきます
良い例が見つかれば改めて記事にしたいとは思います

また、ChrW関数に関しては環境依存文字を使用する場合に使用することが多いので、ここでは解説せず別の記事にて解説を行います
以下の記事で環境依存文字とからめた関数の解説を行っています

文字コードを取得する

文字コードの取得にはAsc・AscB・AscW関数を使用します。それぞれの使用方法について

'文字コードを取得
Debug.Print Asc("a")
'1バイト目の文字コードを取得
Debug.Print AscB("a")
'Unicode文字コードを取得
Debug.Print AscW("a")

文字コードを取得するには「Asc」関数を使用します
また、AscにBを付けると最初の1バイト文字を取得します
Wを付けるとUnicode文字コードを取得します

この関数の引数に指定した文字のコードを整数値で返します

なお、複数の文字を指定しても最初の1文字のコードのみが返されるので、文章に対してコードを取得する場合は1文字ずつ処理を行う必要があります
あまりそんな状況は無いとは思いますが・・・

関数の解説

Debug.Print Asc("aあ")
→→→ 97

Asc関数を使用して文字コードを取得しています
1文字目のみが対象となるため、「a」の文字コード「97」が取得されます

Debug.Print Asc("あbc")
→→→ -32096

Asc関数を使用してひらがなの文字コードを取得しています
1文字目の「あ」が対象となり、文字コード「-32096」が取得されます

Debug.Print AscB("aあ")
→→→ 97

AscB関数を使用して文字コードを取得しています
AscB関数は1バイト目の文字コードを取得します
半角文字の「a」は、上記と同じく「97」が取得されます

Debug.Print AscB("あbc")
→→→ 66

AscB関数を使用してひらがなの文字コードを取得しています
ひらがなは2バイト文字になるので、うまく取得はできません
実際このコードを使用しても、「あ」を入力することはできません

Debug.Print AscW("aあ")
→→→ 97

AscW関数を使用して文字コードを取得しています
Unicodeであっても半角文字のコードは同じなので「97」が取得されます

Debug.Print AscW("あbc")
→→→ 12354

AscW関数を使用してひらがなの文字コードを取得しています
こちらでは同じ文字であってもコードは違うため「12354」が取得されます

基本的には、ひらがなであればAsc関数の文字コード内にあるものはそれで取得すればいいです

このコード以外のものを取得する際にはAscW関数を使用します
特に環境依存文字を使用する場合には必要になります
その方法の解説は以下の記事で行っています

文字列のバイト数を取得

文字列のバイト数の取得には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」に修正すればいいだけです
全角半角の切り替えに関しては以下の記事を確認してください