• ベストアンサー

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/17068)
回答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

  • ACCESSのフォーム上に連番番号を表示したい

    お世話になります フォームは単票型でなく、表型です↓ 例 1 aaaa1 bbbb1 cccc1 2 aaaa2 bbbb2 cccc2 3 aaaa3 bbbb3 cccc3 aaaa1等、右側はテーブルからデータを表示しています この、左の1,2,3、は単なる、表示で関連付けるデータは ありません この単なる1,2,3、はどのようにだすのですか よろしくお願いします

  • 拡張Split関数の出力をセルに

    以下をネットでみつけました。 https://vbabeginner.net/multiple-split/ Splitの拡張関数で区切り文字を複数指定できるので便利だと思いました。 記事では、結果を「Debug.Print」でイミディエイトウィンドウに出力していますが 関数なのでエキセルのシートのセルにも出力させる事ができると思うのですが どうやったら良いですか? 記事のようなSUB(SpritExTest())を作成すれば良いのでしょうが 関数なので汎用で利用できないかと考えました。 例えば、シートで A1: AAAA/BBBB*CCCC/DDDD*EEEE だとして B1:SplitEx(A1,Array"/","*"))と入力すれば 例えば以下のように右側に表示される C1:AAAA D1:BBBB E1:DDDD F1:EEEE これができれば、B1の式を下方向にコピペすると C、D,E,F列に A列の同じようなセルがあれば連続して分割処理(出力)される

  • ACCESSにて2つのテーブルの比較

    2つのテーブルA,テーブルBがあります。テーブルBのデータ以外のデータを選ぶにはどうのようにすれば良いのでしょうか? テーブルA data--- aaaa bbbb cccc dddd aaaa cccc テーブルB data--- aaaa bbbb 欲しい結果 テーブルA data--- cccc dddd cccc よろしくお願い致します。

  • split関数のデリミタに「"」を使用する方法

    split関数のデリミタに「"」を使う方法を教えてください。 SplitedData = Split(Data, """) だと当然エラーになってしまうのです。

  • access で 方法を教えてください。

    access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例)  1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例)  抽出条件    ↓   aaaa 2件 2500byte   bbbb 2件 5000byte  cccc 2件 5000byte   dddd 2件 2120byte   eeee 1件 2000byte   ffff 3件 5120byte 宜しくお願いします。

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • グループ単位で空白行を挿入するVB

    下記の様に番号順にまとまったデータがある場合に その番号が違う番号になった時に空白行を1行挿入したいのですが 良い方法があればご教授下さい。 お願い致します。 <<例>> (実行前)  番号 DATA1 DATA2 1  1  aaaa bbbb 2  1  aaaa cccc 3  2  bbbb bbbb 4  3  cccc bbbb (実行後) 1  1  aaaa bbbb 2  1  aaaa cccc 3  2  bbbb bbbb 4  3  cccc bbbb 以上です。

  • SQLでの条件抽出方法の記述

    はじめまして。 今回、SQLである条件を絞りたいのですがその方法がいまいちピンと来ず、思考錯誤しております。 例えばですが… テーブルにCD,DATA,YMと定義します。 条件としては、 ・MAXを使わずに、YMという値の個々別の最新のもの ・同じCDは重複しない1件のみ(DISTINCT?) ・表示するのはCDとDATAのみ ・(下図で言うと)DATAは0402~0405まで(BETWEEN?) 図で表すと、 CD DATA YM ---------------- 01 AAAA 0401 01 AAAA 0402 01 AAAA 0403 01 AAaa 0404 01 AAaa 0405  ←01の最新 02 BBBB 0402 02 BBBB 0403  ←02の最新 03 CCCC 0402 03 CCCC 0404 03 cccc 0405  ←03の最新 03 cccc 0406  ←これは期間外    ↓ CD DATA YM ---------------- 01 AAaa 0405 02 BBBB 0403 03 cccc 0405 このように抽出したいのですが、良い書き方はあるでしょうか?

  • あるセルに色を付けた時、別のセルにも同じ色が付く

    表1と表2が有って、表1のセルに色をつけると、表2の同じ内容のセルにも同じ色が付くようにしたいのですが、 良い方法は無いでしょうか? 表1         表2 aaaa  |  bbbb cccc dddd bbbb  |  cccc aaaa gggg cccc  |  aaaa bbbb cccc ・ ・ 表1のbbbbに色つけると表2の複数のbbbbにも同じ色が付くようにしたいです。 セル1つずつに条件付書式を設定しても良いですし、関数で一括でもかまいません。 エクセル2000です。

  • SQLが組めません…

    大変恥ずかしい話ですが恥をしのんでHelpさせていただきます。 例えばテーブルTESTに項目がCODE,NAMEとあったとして NAMEの内容がかぶっている項目が有ったら 大きいCODEの方を小さいCODEの内容に上書きするSQLを組みたいのです ex) CODE NAME --------- 0001 AAAA 0002 AAAA 0003 BBBB 0004 CCCC 0005 CCCC を以下のような実行結果にしたい ex) CODE NAME --------- 0002 AAAA 0002 AAAA 0003 BBBB 0005 CCCC 0005 CCCC どなたかお応えください お願いします。。。 使用しているのはORACLE9iです。

このQ&Aのポイント
  • コロナ禍で山に登ることについて感染リスクが気になるが、買い物やカフェは許されるのか疑問がある。
  • 人が多い場所に行くことは感染リスクが高いのか、山に行くことは安全なのか不思議である。
  • 親に山に登ることを禁止されているが、どうやって説得すれば良いか悩んでいる。1人暮らしも却下された。
回答を見る