投稿者 魔界の仮面弁士  (社会人) 投稿日時 2014/7/15 13:11:38
>> ・Dataが配列1~5まであるとして、値がなければスルー
分割された Data が 5 個以上になるためには、
その行に、「\\」が 4 個以上存在する必要がありますね。


>> Dim Data() = Split(Items(0), "\\") '名前の方の値を\\句切り
>> For i As Integer = 4 To 0 Step -1
>>    If Data(i).Length <> Nothing Then
i の範囲を 4 ~ 0 固定としていますが、その場合、Items(0) 内に
「\\」が4個以上あることを保証しなければなりません。

仮に、「\\」が 4 個未満だった場合、Data(4) は存在しないため、
『インデックスが配列の境界外です』のエラーになってしまうでしょう。

もし、「\\」の数が未定義なのであれば、配列の要素数に応じた数を指定するために、
 For i As Integer = UBound(Data) To LBound(Data) Step -1
のように、UBound 関数や GetUpperBound メソッド、あるいは Length プロパティなどを
併用すると良いでしょう。もしくは、For Each を使うというのも手です。


なお、配列数が 5 個に満たない場合には、そもそも列挙したく ないのであれば、
For での列挙前に、「If Data.Length < 5 Then」などの条件で除外しておくと良いでしょう。
5 個以上あることが確実なら、元の「For i As Integer = 4 To 0 Step -1」のままでも問題ありません。


>> If Data(i).Length <> Nothing Then
文字列の長さを調べるのであれば、Nothing と比較するのではなく、
 If Data(i).Length <> 0 Then
のように、 0 と比較する方が素直だと思いますよ。

仮に、Data(i) そのものが Nothing では無いことを判定する意図だとすれば、
 If Data(i) IsNot Nothing Then
もしくは
 If Not Data(i) Is Nothing Then
と書く必要があります。

あるいは、
 If String.IsNullOrEmpty( Data(i) ) Then
といった書き方もあります。これは、Nothing か空文字かを判定します。

>  a = a + "データ=" + Data(i)
文字列連結時には、「+ 演算子」ではなく「& 演算子」を使うほうが望ましいです。VB では。


>>Redim Data(4)を追加して大きさを指定してみたのですが、
今回、ReDim は不要というか無意味です。
配列サイズの確保は Split 関数側で行われますので、事前に ReDim したとしても、
最終的には「\\」の で分割された総数分の配列を示すことになります。

Dim Data() As String    'この時点では、Data は Nothing 
ReDim Data(100)    'この時点では、Data(0)~Data(100) が確保される 
Data = Split(Items(0), "\\")    'Data(0)~Data(「\\」の出現数 + 1) な配列で上書きされる 





> これだと出来るのはData(0)~(3)の4個じゃないの?
違います。VB の配列宣言は、『配列の添字の最大値』を指定しますので、
『ReDim Data(0 To 4)』や『ReDim Data(4)』は、Data(0)~Data(4)が確保されます。