VBA関数 splitが失敗するの面倒だったので関数を作った

ある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で候補が見つからなくてもエラーになりません。

コメント

タイトルとURLをコピーしました