あるExcelの手順書でサーバ名の後ろにIPアドレスを書く人と書かない人がいた。
書き方は自由で「hostname(IP)」や「hostname IP」などだ。
この手順書でサーバ名を取得する上でsplit関数を使った文字区切りは必須だが、書いていたら関数にしたほうが簡潔だったのでここの書き残す。
コード
Sub 配列スプリットテスト() Dim 文字 As String, 文字2 As String 文字 = "hostname1 10.1.1.1" 文字2 = "hostname2(10.1.1.1)" Dim 配列() As Variant 配列 = Array(" ", "(", ":") Dim 取得位置 As Long 取得位置 = 0 Dim 結果 As String 結果 = 配列スプリット(文字, 配列, 取得位置) Debug.Print 結果 結果 = 配列スプリット(文字2, 配列, 取得位置) Debug.Print 結果 End Sub Function 配列スプリット(ByRef 元の文字 As String, ByRef 区切り文字リスト As Variant, ByRef 取得位置 As Long) As String Dim 区切り文字 As Variant For Each 区切り文字 In 区切り文字リスト If InStr(元の文字, 区切り文字) > 0 Then 配列スプリット = Split(元の文字, 区切り文字)(取得位置) Exit For End If Next If 配列スプリット = "" Then 配列スプリット = 元の文字 End If End Function
動き
このコードを実行すると下記2行がデバッグされる。
- hostname1
- hostname2
Array(” “, “(“, “:”)で指定している半角スペースとカッコとコロンがあったらそこで区切るだけ。
先に区切り文字を配列「Array(” “, “(“, “:”)」で宣言しておく。
そして普段splitを使うように配列スプリットを使う。splitと違うのは区切り文字を配列で指定する部分と取得する要素を指定しておくこと。
- 普通:result = split(文字,文字)(要素位置)
- 今回:result = 配列スプリット(文字,1次元配列,要素位置)
問題は最初にHITした文字で処理が終わるので後ろの文字は精査されない。
また区切り文字がない場合は元の値が返ってくるようにしてる。
splitを決め打ちしてると要素がない場合に「実行時エラー’9′:インデックスが有効範囲にありません。」が出てくる。
この関数だと要素位置1で候補が見つからなくてもエラーになりません。