ExcelマクロVBA入門
第101回.Midステートメント

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-10-30

第101回.Midステートメント


Midステートメントは、文字列変数の一部を他の文字列に置き換えます。
これは、マクロVBAのステートメントで、Mid関数とは根本的に違うものです。


Mid関数と誤解されがちですが、全く別物になります。
Mid関数は、文字列の一部を取り出す関数ですが、
Midステートメントは、文字列の一部を置換するものです。

Midステートメント

Mid(stringvar, start[, length]) = string



stringvar 必ず指定します。
変更する文字列変数の名前を指定します。
start 必ず指定します。
バリアント型 (内部処理形式 Long) の値を指定します。
引数 stringvar の中の置き換えを始める位置を文字数単位で指定します。
length 省略可能です。
バリアント型 (内部処理形式 Long) の値を指定します。
置き換えを行う文字数を指定します。
省略すると、文字列すべてが対象となります。
string 必ず指定します。
新しく置き換える文字列式を指定します。

Midステートメントを実行しても、元の文字列の文字数は変更できません。

startに、stringvarの文字数よりも大きい値を指定するとエラーとなります。
start + length が、stringvarの文字数を超える場合は、stringvarの文字数までが置換対象となります。
string(置き換える文字列)がlengthを超えている場合は、lengthの文字数までが有効となります。
実際には、lengthは省略し、stringの文字数が置換されるようにします。

MidBステートメント

Midステートメントのバイト処理になります。
構文はMidステートメントと同様となっています。

文字列に格納されたバイトデータには、MidBステートメントを使用してください。
MidBステートメントでは、置換を開始するstringvar内のバイト位置をstartで指定し、置き換えるバイト数をlengthで指定します。

Midステートメントの使用例

Dim MyString As String
MyString = "ABCDEF"
Mid(MyString, 3, 2) = "cd"
MsgBox MyString

”ABcdEF”と表示されます。

Midステートメントの必要性

文字列の特定の位置の決められた文字数を置換したいという事は、滅多にあることではありません。
文字列の置換であれば、
Replaceメソッド
Replaceメソッドは、セル範囲内で条件に当てはまるセルの文字列を置換するものです。ReplaceメソッドはRangeオブジェクトのメソッドで、ワークシート操作の「検索と置換」の「置換」の機能をVBAで使うものです。VBA関数のReplace関数とは全く違うものになりますので使い分けが必要です。
または、
Replace関数
Replace関数は、指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返します。引数compareの指定りより、全角半角、大文字小文字の扱いが変わります。Replace関数 Replace(expression,find,replace[,start[,count[,compare]]]) expression 必ず指定します。
これらを使う事がほとんどになります。

では、Midステートメントが活躍する場面とは、どのような場面でしょうか。
例えば、データに、
1234-1234-1234
2345-1234-1234
・・・
このようなデータがあるとして、
この真ん中の1234だけを2345に変更するとした場合、
Replace関数だと、単純な置換ができません。
以下では参考VBAとして、「1234-1234-1234」の置換をしています。



Dim str As String
str = "1234-1234-1234"
str = Left(str, 5) & Replace(str, "1234", "2345", 6, 1)

Replace関数では、かなり面倒な処理となっています。
(これを関数化Functionにしておけばよいとは言えますが)

Dim str As String
str = "1234-1234-1234"
Mid(str, 6) = "2345"

Midステートメントを使う事で、これだけで済んでしまいます。
そして、何よりも、
Midステートメントの良さは、処理が高速であるという事です。
置換すべきデータ量が膨大で、置換処理に時間がかかっているような場合は、
Midステートメントが使えないかを検討して下さい。

実践での使用例

遅い文字列結合を最速処理する方法について
VBAは遅い… よく聞くことですが、確かに普通にコード記述しているととても遅いことがあります、その代表の一つに、文字列結合があります、文字列結合を最速処理する方法について解説します。そもそも文字列結合は、なぜ遅いのか、String型(可変長文字列)についての基礎知識が必要です。
この記事では、Midステートメントを使う事で、文字列結合を高速化できることを紹介しています。



同じテーマ「マクロVBA入門」の記事

第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.Unionメソッド
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
第105回.Callステートメント
第106回.Functionプロシージャー
第107回.プロシージャーの引数
第108回.変数の適用範囲(スコープ,Private,Public)


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

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • Midステートメント

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


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




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