- ベストアンサー
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()関数でいくつに分かれるか判定をすることは 可能でしょうか。 または、別の回避策があるのでしょうか。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (3)
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
お礼
早速、ありがとうございました。 また色々と参考になる情報迄頂き、ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
>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と予想個数が等しいかを次の処理に入る前に、チェックすればよいと思います。
お礼
早速、ありがとうございました。
- himajin100000
- ベストアンサー率54% (1660/3060)
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
お礼
すばらしい。 出来ました。 早速、ありがとうございました。
お礼
すばらしい。 出来ました。 早速、ありがとうございました。 コーディング迄、そのまま使えます。 ほんとにありがとうございました。