VB.NETには StringクラスにInsertメソッドがありますが、 Excel VBA にはそれにあたる関数が見当たらないので、自身で用意します。
文字列を挿入する関数の仕様
作ろうとしているユーザー関数を確認しましょう。
具体的に例を挙げると、「ABCDE」という文字列のどこかに "@" という文字を挿入するための関数(プロシージャ)を用意したいです。
挿入位置は(別の定義でもつくれますが)このように定義します。
位置に "0" を指定した場合は「@ABCDE」、
位置に "2" を指定した場合は「AB@CDE」、
位置に "5" を指定した場合は「ABCDE@」となるようにします。
そのため、引数は
- 変換対象とする文字列(挿入前文字列、上記例でいう「ABCDE」)
- 挿入したい文字列(上記例でいう "@" )
- 挿入位置
とします。
ユーザー定義関数(functionプロシージャ)の実装
まずコードを紹介します。
'-------------------------------------------------- '指定した文字列を挿入する ' 引数 ' in_strInput : 対象の文字列 ' in_strChar : 挿入したい文字列 ' in_intPos : 挿入する位置 ' 戻り値 ' 対象に文字列を挿入したあとの文字列 '-------------------------------------------------- Public Function fn_insrChar(in_strInput As String, _ in_strChar As String, in_intPos As Integer) As String '変数の宣言 Dim intLen As Integer Dim strBefore As String strBefore = in_strInput intLen = Len(strBefore) If in_intPos < 0 Or in_intPos > intLen Then Err.Raise Number:=19101, Description:= _ "fn_insrChar関数: 挿入位置の不正" Exit Function End If '戻り値の設定 fn_insrChar = Left$(strBefore, in_intPos) & _ in_strChar & Right$(strBefore, intLen - in_intPos) End Function
この関数(プロシージャ)で fn_insrChar( "ABCDE", "@", 2" ) と指定すると「AB@CDE」と値を返します。
位置を表す変数型を integer と宣言していますが、 long を宣言したほうがいいかもしれません。integerはメモリが貧相だった時代の遺物だという人もいます。
ただ、3万文字以上の文字列に対して処理することはないだろうという前提のもと、メモリ節約のためintegerにしています。
やろうとしていることは簡単です。
元の文字列の挿入位置から左側と右側に分割して、その間に挿入したい文字を付けるだけです。
ところで「ABCDE」という文字列に、挿入位置=7と指定された場合、つまり仕様で想定した挿入位置と異なる値が指定されたときにどのように動作させるかを検討します。
数字が大き過ぎる場合は末尾に付け足す仕様にすることもひとつですが、本来想定していた値と異なる値がわたったときに盲目的に処理が進むべきではないと考え、エラーにしています。
ここではやっていませんが、On Error GoToでエラートラップを仕込んでおくのが一般的です。
ご質問は下の 「コメントを書く」 からお願いします。
ExcelやVBA全般に関わる質問で、比較的簡単にお答えできるものはできる限り回答したいと思います。
回答を公開でなくメールでやり取りしたいという場合は、その旨記載していただければ非公開で回答することも可能です。
有償での作業依頼は非公開にしますので、条件等をお知らせください。