アプリ版:「スタンプのみでお礼する」機能のリリースについて

Split()関数を1つの項目を3つに別けようとしているのですが、「インデックスが有効範囲にありません。」というエラーがでます。このエラーを回避する方法はありますか。 
エラーになっている箇所を例で記入します。

strData = Split(DATA, ",")
OT(1) = strData(0)
OT(2) = strData(1)
OT(3) = strData(2) <=ここでエラー

DATAが",AAAA,BBBB,CCCC" 3つに分かれるときは、OKですが、
DATAが",AAAA,BBBB" 2つ分かれるときは、エラーになります。
エラーになる前にSplit()関数でいくつに分かれるか判定をすることは
可能でしょうか。
または、別の回避策があるのでしょうか。
宜しくお願いします。

A 回答 (4件)

UBound関数で配列の添字の最大値を得る事が可能です。



strData = Split(data, ",")
For i = 0 To UBound(strData)
OT(i + 1) = strData(i)
Next


http://officetanaka.net/excel/vba/function/UBoun …
http://officetanaka.net/excel/vba/tips/tips62.htm
http://www13.ocn.ne.jp/~msactown/vba_19.html
    • good
    • 0
この回答へのお礼

すばらしい。 出来ました。
早速、ありがとうございました。
コーディング迄、そのまま使えます。
ほんとにありがとうございました。

お礼日時:2008/05/14 12:48

2つのサンプルを示します。



Private Sub コマンド0_Click()
  Dim I     As Integer
  Dim N     As Integer
  Dim strDatas() As String

  strDatas() = Split("AAA,BBB,CCC", ",")
  N = UBound(strDatas())
  For I = 0 To N
    Debug.Print strDatas(I)
  Next I
End Sub

[イミディエイト]
AAA
BBB
CCC

C++等では、Forループ直前に配列の数をNに代入。
そうすりゃー、Nはメモリに配置されずにスタックに。
つまり、Forループが高速化します。
VBAでは定かではありませんが、一応は・・・。

Private Sub コマンド1_Click()
  Dim I    As Integer
  Dim strData As String
  Dim strDatas As String
  
  strDatas = "AAA,BBB,CCC"
  Do
    I = I + 1
    strData = CutStr(strDatas, ",", I)
    If Len(strData) Then
      Debug.Print strData
    End If
  Loop Until strData = ""
End Sub

[イミディエイト]
AAA
BBB
CCC

この場合は、安直に CutStr関数で1番目、2番目と切り出しています。
該当するN番目の値が無い時はCutStr関数は""を戻します。
これを手掛かりに表示を制御するって手もあります。
もちろん、その都度に Split関数が働くので数倍の処理時間がかかります。
データ数が多い時は、当然に避けなければならない手法です。
CutStr関数は、一応、Split関数と UBound関数の組合せの典型ですので紹介しておきます。

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function

[イミディエイト]
? CharCount("AAA,BBB,CCC", ",")
2

なお、このように配列インデックスの最大値は CharCount関数の類で取得できます。
No1さんの回答の2番目を関数化しただけですが・・・。

Public Function CharCount(ByVal Text As String, ByVal C As String) As Integer
  CharCount = Len(Text) - Len(Replace(Text, C, ""))
End Function
    • good
    • 0
この回答へのお礼

早速、ありがとうございました。
また色々と参考になる情報迄頂き、ありがとうございました。

お礼日時:2008/05/14 12:52

>DATAが",AAAA,BBBB" 2つ分かれるときは


この例だと3つに分かれませんか。
Sub test01()
strData = ",AAAA,BBBB"
s = Split(strData, ",")
MsgBox UBound(s)
End Sub
では2が表示されます。すなわち3個に分かれたということだと思いますが。
ーー
いくつの分かれても、Ubound(strData)で個数ー1が取れるはずです。
実情で個数が取れるはずです。
データミスなどで(カンマ不足など)個数が足りないかどうかは、
Ubound(strData)+1と予想個数が等しいかを次の処理に入る前に、チェックすればよいと思います。
    • good
    • 0
この回答へのお礼

早速、ありがとうございました。

お礼日時:2008/05/14 12:49

Option Explicit



'二つほど考えてみた。
Sub Main()
Dim strData() As String
Dim DATA As String
DATA = "a,b,c"

strData = Split(DATA, ",")
MsgBox (UBound(strData) + 1)
MsgBox (Len(DATA) - Len(Replace(DATA, ",", "")) + 1)



End Sub
    • good
    • 0
この回答へのお礼

すばらしい。 出来ました。
早速、ありがとうございました。

お礼日時:2008/05/14 12:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A