• 締切済み

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

みんなの回答

  • aji70
  • ベストアンサー率100% (1/1)
回答No.2

'/* カウンタ Dim i As Integer = 1 '/* 最終行 Dim GYO As Integer = 100 '/* 配列宣言 Dim PN(GYO) As String Dim JN(GYO) As String '/* エクセルから取得 For ii = 1 To GYO PN(i) = xlSheet.Cells(i, 7).Value JN(i) = xlSheet.Cells(i, 8).Value Next '/* ここまでは 現行のCOPY ? 以下 追加処理 '/* SORT をかける Array.Sort(PN, JN) '/* 最終的に格納する配列 Dim PN_NEW() As String Dim JN_NEW() As String '/* 比較用 Dim Chk_PN As String = "" Dim Chk_JN As String = "" '/* カウンタ Dim xx As Integer = 0 For i = 0 To GYO - 1 '/* 一行目前と比較する。 If PN(i) <> Chk_PN Or JN(i) <> Chk_JN Then '/* 配列を追加する ReDim Preserve PN_NEW(xx) ReDim Preserve JN_NEW(xx) '/* データを格納する PN_NEW(xx) = PN(i) JN_NEW(xx) = JN(i) xx = xx + 1 End If Chk_PN = PN(i) Chk_JN = JN(i) Next .net のバージョンとかわからないのでとりあえず・・・・  こんなんでどうでしょう? 

bobobo5246
質問者

お礼

回答ありがとうございます。 別案件が割り込んで、質問した内容のものが中断になっているので まだ試してませんが、是非参考にさせていただきます。 お礼が遅くなり、申し訳ありませんでした。 また、Version未記載ですみません。VisualStudio2008です。

bobobo5246
質問者

補足

試してみましたが、IF文で全部抜けてしまって、格納されませんでした。 でも、どこを修正すべきかわかりません・・・。 いまだ格闘中です。

回答No.1

「各列内で重複する値があった場合、重複を避けて値を取得したい」を無視して、 任意の範囲のセルの値を取得する方法を書きます。 Dim AAA() Redim AAA(m,n) ここで、m:取得するデータの行数、n:その一行当たりのデータの列数 For A=1 To m For B=1 To n AAA(A,B)=Cells(X,Y).Value Next B Next A ここで、X:取得するデータの行番号を表示するAの関数値(例 X=2*A+1とか) Y:取得するデータの行番号を表示するBの関数値(例 Y=3*B+10とか) 取得したデータをどうするか(重複する値があった場合の処置等)については、自分でお考え下さい。

関連するQ&A

  • 配列への文字列の格納について

    C言語で文字列を扱う時、配列に1文字ずつ格納していくか、ポインタ変数を使うと思うのですが、 ポインタ変数を使った場合の処理が上手くできずに困っています。 詳細を説明すると、値を取得して、前回取得した値と比較します。 それで、同じだった場合には"chritm1"に格納した矢印を書き込む処理なのですが、 現在はfor文により配列に格納したものを使用していますが、 この部分をポインタ変数を使用した処理(1文字1文字書くのではなく、string型変数の用に書き込みたい) に変更したいのですが、上手くできないという状況です。 何かとっかかりとなるようなことでもかまいませんので、教えてください。 よろしくお願いします。 static int mainA( char *fileName){ int loop, i, j; FILE *fd; /* 前回値格納用 */ char *preval; /* 現在値格納用 */ char *thisval; /* 同値用記号格納用 */ char chritm1[6] = " → "; -- 中略 -- for( i = 0 ; i < 150 ; i++ ) { thisval = redata[i]; /* 値の比較 */ if(preval == thisval) { for( j = 0 ; j < 6 ; j++){ /* 前回値と同じ場合は矢印 */ fprintf( fd, ",%c",chritm1[j]); } }else{ /* 前回値と異なる場合は値 */ fprintf( fd, ",%s", thisval); } preval = thisval; /*完了したら改行 */ fprintf( fd, "\n" ); } -- 以下略 --

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

    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

  • 重複データーの集計、削除

    どなたかご教授下さい。 下記のようにD列に重複する行があればI列に集計し、行削除するマクロを作成しました。 さらに、重複する基準となる列を複数(D列,F列,G列)に増やしたいのですが、上手く出来ません。 宜しくお願い致します。 Sub test() Dim i, j For i = 19 To Cells(Rows.Count, 2).End(xlUp).row - 1 For j = Cells(Rows.Count, 2).End(xlUp).row To i + 1 Step -1 If Cells(i, 4).value = "" Then Exit Sub If Cells(i, 4).value = Cells(j, 4).value Then Cells(i, 9).value = Cells(i, 9).value + Cells(j, 9).value Rows(j).Delete End If Next Next End Sub

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • 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 年齢 以下同上 ・・・・のように取り出したいと考えています。 よろしくお願いします。

  • 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
  • 配列変数に格納したデータを計算する方法はありますか?

     簡単な例ですが、例えばB列にあるデータの平均値を求めるときに以下のようにしています。 sub 平均計算()   Dim X(1 To 1000, 1 To 1) As Variant, i as Integer   For i = 10 To 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Cells(i - 9, 2), Cells(i, 2)))   Next   Range(Cells(1, 1), Cells(1000, 1)) = X End Sub  ここで処理速度改善のため、B列のデータを別の配列変数Yに格納してから平均値を求めるというようなことをしたいのですが、そんなことは可能でしょうか?イメージとしてはこんな感じです。   Y = Range(Cells(1, 2), Cells(1000, 2))   for i = 1 to 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Y(i - 9, 2), Y(i, 2)))   Next  当然これはエラーになってしまいますが、このようなことを可能にする方法があれば、どなたか教えてください!よろしくお願いします。

  • Excelマクロ

    お世話になります。 Excelのマクロに関する質問です。 目的としては、D列に様々な文言が入っており、 D列に記入されている各文言の数をカウントしたいと思っています。 ただし、D列の各文言が複数あった場合でも、 A列が同じ値の場合は数に含めない、という条件があります。 ex)D列に「りんご」という文言が10個あります。   D列に「りんご」と記入されている行のA列は、 「赤」「青」の2パターンしかありません。 ⇒この場合、「2」とカウントしたいです。 現在、以下のマクロを考えています。 =========================================================== sub test() Dim i As Long, x As Long, cnt As Long, buf As Object '「i」「x」「cnt」を数値として定義。「buf」にD列の値を格納します。 x = 4 '4行目以降を対象としています。 Do While Cells(x, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 cnt = 0 '各行のD列に入っている値の数を数えるため、まずはカウントを0にします。 i = 4 '4行目以降を対象としています。 Set buf = Cells(x, 4) ' D列の値を変数「buf」に格納します。 Do While Cells(i, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 If Cells(i, 4).Value = buf And Cells(i, 1).Value <> Cells(x, 1).Value Then  ' D列の値が「buf」に格納した値と同じ、かつ、       ' A列の値が、bufに値を格納した時と異なる場合のみ対象 cnt = cnt + 1 '数を数える対象であれば、+1します。 End If i = i + 1 '次の行に移るために+1します。 Loop Cells(x, 5).Value = cnt ' E列にcntに格納された値を入力 x = x + 1 '次の行に移るために+1します。 Loop end sub ===================================================== 上記のマクロでは、E列にカウント後の数らしいものが入力されるのですが、 値が正しくないようです。 お力添えをいただけますでしょうか。 よろしくお願いいたします。

  • 指定したセルにデータの書き出し

    いつもお世話になっております。 VB.net+SQLでデータベース連携しております。 SQLで抽出したデータをエクセルに書き出すプログラムを考えています。 For Each myRow In ds.Tables("Estimate").Rows Code = myRow("Code") xlSheet.Cells(3, 2).Value = Code Next myRow 上記で3行目の2列目にデータを書き出すことは出来たのですが 変数codeには複数のデータを格納していて上記のプログラムだとCells(3, 2).Value と指定しているので、はじめのデータから最後のデータまで同じセルに上書きしてしまっているようです。 これを各データを一行ずつ書き出したいのですが、上手くいきません。 For Each myRow In ds.Tables("Estimate").Rows    For i = 3 To 17 Code = myRow("Code") xlSheet.Cells(i, 2).Value = Code      i+=1    Next i Next myRow のようにセルの行指示を変数にしたのですが、変わりませんでした。 分かりますでしょうか?

  • Activeセルの最終列の値を代入し、セル最終行までコピーするには

    最終列の値の代入をここで教えていただいてできました。 J = Range("IV2").End(xlToLeft).Column For i = J to 1 Step -1 If InStr(Cells(2, i).Value, "単価") > 0 Then Cells(3, i).Value = Cells(3, J).Value End If Next i この、Cells(3, i).Value = Cells(3, J).Value を、 "単価"列の最終行までコピーするには どのような記述をしたらいいでしょうか? しばらく悩んでいますができません。。。 お力を貸してください。!

専門家に質問してみよう