カウンタを使用した配列の格納について

このQ&Aのポイント
  • Excel VBAにおけるカウンタを使用した配列の格納方法について悩んでいます。
  • データ番号とループ変数jの関係に問題があり、うまくデータが格納されません。
  • データの格納に関する具体的なコードやループの問題点を教えていただけないでしょうか?
回答を見る
  • ベストアンサー

カウンタを使用した配列の格納について

EXCEL VBAについての質問です。 どなたか添削願えないでしょうか? A1からE40までSingle形式のデータが入っています。 ただし、A列はすべて見出し、行には5行おきに1,6,11...行目に見出しが入っています。 4x4のデータが8個ある計算です。 見出しを除くデータをすべて(8,4,4)の配列に格納しようと思い、下記のコードをSheet(1)に 書きましたが、「インデックスが有効範囲にありません」と出てうまく格納できません。 上の「Next j」を生かして、下の「Next j」を殺し、イミディエイトウインドウで確認したところ、 ネストの外ではうまくループしているようですが、入れ子にするとデータがうまく入りません。 jのループ完了後には  j=36  データ番号=8 が入っているはずですが、j がうまく格納されないようで、値がすべて0になります。 上の「Next j」と直下の2行をいかした場合、きちんと値が入り、うまく機能するようです。 色々考えましたが、手詰まりになってしまったので、何がおかしいのか教えてもらえません でしょうか?よろしくお願いします。 Option Base 1 Const データ数 As Integer = 8 Const 列数 As Integer = 4 Const 行数 As Integer = 4 Dim データ番号 As Integer Sub 換算値格納() ReDim 換算値(データ数, 行数, 列数) As Single For j = 1 To 36 Step 5 '(例)j=1→データ番号1、j=6→データ番号2、.... データ番号 = (j - 1) / 5 + 1 Debug.Print "データ番号=" & データ番号 & " j=" & j 'Next j 'データ番号 = 8'<任意に変えてみてください> 'j = (データ番号 - 1) * 5 + 1 For i = 4 To 19 '列定義 'カウンタを4で割って1を足したものが0になる (例)14÷4=3...2 → 2+1=3 列 = i Mod 4 + 1 '行定義 'カウンタがちょうど割り切れたら行をひとつ増やす (例)i=4,8,12...にて列=1,2,3 If i Mod 4 = 0 Then 行 = 行 + 1 換算値(データ番号, 行, 列) = Cells(行 + j, 列 + 1).Value Debug.Print "(" & データ番号 & "," & 行 & "," & 列 & ")は" & 換算値(データ番号, 行, 列) Next i Next j End Sub

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

  • ベストアンサー
  • popuplt
  • ベストアンサー率38% (31/81)
回答No.1

さらと見ただけですが、たぶんここでしょうね。 >If i Mod 4 = 0 Then 行 = 行 + 1 行にいつも1足されてるので、データ番号が2になると行は5となります。 配列は4ですので「インデックスが有効範囲にありません」となるのでしょう。 データ番号が変わるときに 「行=0」 を入れましょう。

saka-ken
質問者

お礼

上のDebug.printに 「行=0」を入れたら機能するようになりました。 どうもありがとうございます。

関連するQ&A

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Excel.Rangeで取得した値を配列に格納するには?

    プログラミング初心者です。 VB.NET でExcelからデータを取得したのですが、配列等に格納したいのですが、うまくできなくて困っています。どなたか教えてください。 例)以下のデータを取得する場合 セルA(列)1(行)からA5まで セルB1からB5まで セルC1からC5まで Dim xl_APP As Excel.Application Dim xl_Book AS Excel.Workbook Dim xl_Sheet As Excel.Seets = xl_Book.Worksheets Dim xl_W_Sheet As Excel.Worksheet = CType(xl_W_Sheet.Item(1),Excel.Worksheet) 中略 Dim range_data As Excel.Range Dim i Integer Dim j Integer Dim strCel As String For i = 1 To 5 For j = 1 To 3 range_data = CType(xl_W_Sheet.Cells(i,j),Excel.Range) strCel = CStr(range_data.Value)  ↑String型変数に格納していますが、多次元配列?に格納して取り出せるようにしたいのですが、どうしたらよいのでしょうか? Next Nest <range_dataに格納されるデータ> A1:氏名 B1:学年 C:1 年齢 以下同上 ・・・・のように取り出したいと考えています。 よろしくお願いします。

  • 配列の格納方法

    VBEXPRESS超初心者です。配列を格納する方法を調べたらHELPで、 Dim players() As String = {"Dan", "Fred", "Bart", "Carlos", _ "Ty", "Juan", "Jay", "Sam", "Pedro"} Dim i As Integer = CInt(Textbox1.Text) MsgBox(players(i) & " is on first base.")とありましたが、 100行のCSVまたはTxtデータをいちいち””で書かなくても格納する方法はどうすればいいのですか?  基本的なことですいません。 なかなかHelpだけではひとつを知るのに丸一日費やしますので当分の間ご勘弁ください。  

  • VB.NET 配列の格納

    VB.NET 配列の格納 エクセルから任意の列の値を格納したいのですが・・・ 現在、値の取得は以下のようなFor文ループを書いています。 各値を一時記憶(格納)したいのですが、どう書けばいいのでしょうか。 また、各列内で重複する値があった場合、重複を避けて値を取得したいのですが どう書いていいかわかりません。 初歩的な質問で申し訳ありませんが、宜しくお願いします。 PN()→G列の各セルの値の変数 JN()→H列の各セルの値の変数 の変数GYO→シートの最終行 j = 1 For i = 1 To GYO '【リストのG列から部品番号を取得】 PN(j) = xlSheet.Cells(i, 7).Value '【リストのH列から部品和名を取得】 JN(j) = xlSheet.Cells(i, 8).value Next

  • VBA配列 印のついた列番号を格納して利用したい

    Excel VBAで下記処理を作成しました。配列を使えば処理が高速化できるのでは?と思い調べたのですが、配列を使ったことが無く、挫折しましたのでどなたかご教示いただけませんでしょうか。 <対象データ>(添付画像の黄色いセルが処理対象) ・処理対象の行は「区分」列に「0」が入っている ・処理対象の列は、1行目に「●」が入っている <作成した処理> ・ループ(1):データ開始行(画像では3行目)から順に見ていく  ・IF:「区分」列が「0」なら下記に進む(0以外なら次の行へ)   ・ループ(2):列を左から順に見ていく    ・IF:その列の1行目が「●」なら処理を行う For i = 3 To 10000 If Cells(i , 1) = 0 And Cells(i , 1) <> "" Then その行に対する処理の下準備のコード(記載省略) For j = 2 To 500 If Cells(1 , j) = "●" Then Cells(i , j)に対する処理(記載省略) End If Next j End If Next i <問題点> データ量が数千行×数百列と相応にあるため、処理実行に数秒かかります。今後、処理をより複雑にしたいため、高速化できないかと考えています。 <質問> 対象行について毎回、ループ(2)で各列の1行目を調べて●だったら処理する、としているのが非効率かも知れないと思いました。 1行目に●が入っている列番号を調べるのは1度で良いので、それを配列に格納して、ループ(2)の部分で使うことはできますでしょうか? ご存じの方、ご教示いただけますと幸いです。よろしくお願いいたします。

  • 配列に格納したデータを指定行以下に転記する方法

    excel2000を使っています。 以下のコードだと最終行にデータが転記されます。これを4行目に確定して、転記したいのです。常に4行目つまりA列4行目以下に上書きしたいのです。 その場合コードをどのように変更すべきでしょうか? Sub 配列() With ActiveSheet ' 配列に格納 --------------------------- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 --------------------------- SaleAry = Array(.Range("t4"), .Range("e5"), .Range("g5"), .Range("o5")) End With ' 転記 --------------------------- With Worksheets("daityou") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) ' Next i End With Set SaleAry = Nothing End Sub

  • 配列のSession格納、及び取得方法について

    お世話になります。 現在Visual Studio 2005でプログラム作成中です。 質問内容は、 配列(文字列を格納)をSessionに渡し、次ページでその配列の値を取得できるかという点です。 ***(a.aspx.vb)抜粋*** Dim a() As String Redim a(DataTable1.Rows.Count) For i As Integer 0 to DataTable1.Rows.Count - 1 a(i) = CType(DataTable1.Rows(i).Item(0)) Next Session("a.list") = a(DataTable1.Rows.Count) Session("a.count") = DataTable1.Rows.Count ***(b.aspx)抜粋*** Dim b() As String = CType(Session("a.list"), String) Dim bCount as integer = CType(Session("a.count"),Integer) Dim Name as String For i As Integer 0 To bCount Name = CType(b(i),String) Next としているのですが、取得できません。 配列に格納されたものをSessionに格納し、取得することは可能なのでしょうか。 また、その他に適切なものがあればご教授ください。 よろしくお願いいたします。

  • 配列の格納

    アルゴリズム初心者です。 配列Aの16×16ビットの図形データーを時計周りに90度回転し、配列Bに格納する処理内容の記述を教えて下さい。 上からI番目、、左からJ番目をA(I,J)、B(I,J)とします。

  • 特定の文字列を除いた配列の作成マクロについて

    頭書の件、現在マクロで以下のようなことを行おうとしており悩んでおります。 皆様のお知恵を拝借いたしたく、お願いいたします。 エクセルのSheet1に以下のような形でデータが格納されております。 A行:文字列、B行:数字でそれぞれ60000個程度のデータ格納されております。 この中から、特定の文字列を含んだ列を全て削除したデータを配列に格納するマクロを作成したいと考えています。 「特定の文字列」は、例えば"山田", "佐藤", "田中"の3種類とします。 もし上述の文字列のいずれかを含んだデータが30000個あれば、削除後の30000個程度のデータを新しい配列に格納したいと思っています。 イメージ的には以下のような操作がしたいのですが、「If C(i, 1) <> List Then」では通らないので、この部分に該当するような操作をなにかしらの方法で表現できましたらご教授いただけると助かります。 Sub test() Dim C As Variant Dim D As Variant Dim i As Long Dim j As Long Dim List As Variant List = Array("山田", "佐藤", "田中") C = Worksheets("Sheet1").Range("A1", "B6000") For i = 1 To 60000 If C(i, 1) <> List Then D(j,1)=C(i,1) D(j,2)=C(i,2) j=j+1 Else End If Next End Sub お手数をおかけいたしますが、宜しくお願いいたします。

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

専門家に質問してみよう