• ベストアンサー

ACCESS VBAのSplit()関数の使用方法

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()関数でいくつに分かれるか判定をすることは 可能でしょうか。 または、別の回避策があるのでしょうか。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

UBound関数で配列の添字の最大値を得る事が可能です。 strData = Split(data, ",") For i = 0 To UBound(strData) OT(i + 1) = strData(i) Next http://officetanaka.net/excel/vba/function/UBound.htm http://officetanaka.net/excel/vba/tips/tips62.htm http://www13.ocn.ne.jp/~msactown/vba_19.html

UKUJIMA
質問者

お礼

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

その他の回答 (3)

noname#140971
noname#140971
回答No.4

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

UKUJIMA
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

>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と予想個数が等しいかを次の処理に入る前に、チェックすればよいと思います。

UKUJIMA
質問者

お礼

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

回答No.1

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

UKUJIMA
質問者

お礼

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

関連するQ&A