Mid関数とMidステートメント

Alphabet blocks

Excel VBA のヘルプで「Mid」と検索すると、Midキーワードは「Mid関数」と「Midステートメント」の2つの構文で使用される旨の説明が表示されます。今回はこの「Mid関数」と「Midステートメント」の違いについて説明します。




Mid関数

Mid関数はよく使われる文字列操作の代表的な関数です。説明する程でもないですが、機能と構文を一応載せときますね。

機能:文字列の指定した位置から指定した長さの文字列取り出し、バリアント型 (内部処理形式 String の Variant) の値を返す。
構文:Mid(string, start[, length])

引数 指定 内容
string 必須 文字列を取り出す元の文字列を指定します。
start 必須 取り出し開始位置を長整数型 (Long)で指定します。先頭(1文字目)は1になります。引数stringの文字数より大きい値を指定した場合は空文字””(長さ0の文字列)を返します。
 length 省略可 引数startで指定した位置から取り出す文字数をバリアント型 (内部処理形式 Long)で指定します。この引数を省略した場合は引数startで指定した位置以降のすべての文字列を返します。また、引数startからの文字数が引数lengthよりより少ない場合も引数startで指定した位置以降のすべての文字列を返します。

使用例:「Dev-Clips」という文字列から「- (ハイフン)」を取り出すには、4文字目から1文字取り出せばよいので以下のように指定します。

    '4文字目の「-」を取り出す
    MsgBox Mid("Dev-Clips", 4, 1)
Mid関数使用例 - 4文字目の「-」を取り出す

Excel VBAで開発していれば使用したことがない方はいないんじゃないかってくらいメジャーな関数ですよね。これは問題ないと思います。

Midステートメント

Mid関数がある文字列から指定した位置・文字数の文字列を取り出すのに対し、Midステートメントは文字列の一部を他の文字列に置き換えます。

機能:バリアント型 (内部処理形式 String の Variant) 変数の一部を他の文字列に置き換える。
構文:Mid(stringvar, start[, length]) = string

引数 指定 内容
stringvar 必須 変更元の文字列変数を指定します。
start 必須 置き換え開始位置をバリアント型 (内部処理形式 Long) で指定します。先頭(1文字目)は1になります。
 length 省略可 引数startで指定した位置から置き換える文字数をバリアント型 (内部処理形式 Long)で指定します。この引数を省略した場合は引数startで指定した位置以降のすべての文字列が置き換えられます。また、引数startからの文字数が引数lengthよりより少ない場合も引数startで指定した位置以降のすべての文字列が置き換えられます。
string 必須 新しく置き換える文字列を指定します。

使用例:「Dev-Clips」という文字列の4文字目の「- (ハイフン)」を「@」に置き換えるには以下のように指定します。

    Dim stringvar As String
    '置き換え元の変数に文字列を設定
    stringvar = "Dev-Clips"
    '4文字目から1文字を「@」に置き換える
    Mid(stringvar, 4, 1) = "@"
    '内容確認
    MsgBox stringvar
Midステートメント使用例 - 4文字目の「-」を「@」に置換

よく使われるMid関数の構文と違って左オペランドにMidステートメントが来るのでなんだか違和感がありますが、使い方によってはとても便利なステートメントですね。

まとめ。

よく使われるのは文字列を取り出すMid関数の方でしょうか、機能的にも実用的ですしね。一方、文字列置き換えのMidステートメントはあまり使い道がないように思えます。文字列置換と言えばReplace関数が Excel VBA には用意されていますしね。ただ、このMidステートメントは文字列連結で大きな力を発揮します。

文字列連結での効果的なMidステートメントの使用方法はこのエントリーでは触れませんが、近いうちに別記事で掲載致します。現在執筆中ですのでしばらくお待ちください。

Midステートメントを使用した文字列の連結方法に関する記事を公開しました。高パフォーマンスの文字列連結処理が可能となる内容になってます。文字列連結の仕組みにもちょろっと触れてますので是非ご覧ください:)

Excel VBA でStringBuilderを使う – http://dev-clips.com/clip/vba/stringbuilder-for-vba/

それにしても、同じ名前の関数・ステートメントでも構文が異なるものが Excel VBA には存在するんですね、紛らわしい(^^;

ご質問などございましたらお気軽にお問合せくださいまし。

HAYs