• ベストアンサー

Excel2002 配列の取得

いつもお世話になっております。 Excelのデータを行単位で配列に書き換える処理を VBAで記述しています。 '****************************************************** '*** 行のループ処理(見出し行を含まず2行目から) For intCnt = 1 To intRow '*** 列のループ処理 For intCnt2 = 1 To 58  '*** セル範囲を配列変数に格納する varUPDT = wsWS.cells(intCnt, 1).Resize(intCnt, 58).Value  If intCnt2 = 1 Then  varDATA = "('" & varUPDT(intCnt, intCnt2) & "'" Else If varUPDT(intCnt, intCnt2) = Empty Then  varUPDT(intCnt, intCnt2) = 0 Else End If '*** テキスト型の列を指定  If intCnt2 = 2 Then  varDATA = varDATA & ",'" & varUPDT(intCnt, intCnt2) & "'" Else  varDATA = varDATA & "," & varUPDT(intCnt, intCnt2) End If End If Next intCnt2 varDATA = varDATA & ")" Next intCnt '****************************************************** 取得した結果を見ると、なぜか奇数行のみが 取得されています。 行の変数(IntCnt)は1ずつ増えていっているのに不思議です。 間違いをご指摘いただきたく存じます。 どうぞよろしくお願いいたします。

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

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

無駄なコードを書くよりも for x  for y   Cells(x,y)  next next とした方がずっと単純ですね。

romiromi
質問者

お礼

ご回答ありがとうございます。 そうですね、確かに無駄ですね。 シンプルにしたほうが、別の方がメンテナンスをする場合も よいですものね。

その他の回答 (3)

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

雑感。 (1)エクセルのセルは2次元配列的になっているのに、普通は配列に、改めて起す必要はないのではないか。自己プロでソートなどするときは必要と思いますが。VBAでの関数利用やメソッドが豊富で、それで凌げるはず。 (2)#2のご意見のごとく For i=1 to 10 For j=1 to 10 x=Cells(i,j) Next j Next i 式で済むはず。 (3)これは、私の趣味かもしれないが、変数名が丁寧で正式といえば言えるが、複雑で、見通しが悪い。int,varをつけて区別は意味があるのか。 (4)Redimなど使わなくてもVBAレベルでは済むように思う。 (5)コードの質問の場合、そのコード行(や行群)で何をしたいか、解説すべき。回答者や読者に全部解読させるのは、どうかと思う。 本質問は、CSVファイルの作成ですか? (6)テストデータがないと、この質問レベルではテストもできない ことがわかった。そこまで回答者に作らせるのもどうかと思う。 データによってエラーが出たり出なかったりは、しょっちゅう経験するから、再現にデータは大切。 (7)第1列目と第2列目以降をループに入れているが第2列目以降のループにして、A列は、Cells(i,”A")で参照しては。 わたしの言っていることの例。 Sub test01() Dim ws As Worksheet Set ws = Worksheets("aaa") For i = 1 To 5 '行変化 DATA = "('" & ws.Cells(i, "A") & "'" '(’をつけてDATAへセット For j = 2 To 5 '列変化 If j = 2 Then '第2列は文字列型で文字列型は DATA = DATA & ",'" & ws.Cells(i, j) & "'" Else 'C列以右は数値型で DATA = DATA & "," & IIf(ws.Cells(i, j) = "", 0, ws.Cells(i, j)) End If Next j DATA = DATA & ")" MsgBox DATA Next i End Sub テストデータで 東京 xxx 123 34 54 大阪 yyy 234 45 21 静岡 zzz 345 67 23 名古屋 uuu 5567 89 456 MsgBoxで ('東京','xxx',123,34,54) のようになりました。

romiromi
質問者

お礼

ご回答ありがとうございました。 明記する情報が不足しており、そのためにお時間、お手間を取っていただき申し訳ありません。 記述に関してのご指摘は、開発定義書に副わない内容も ありますが、今後の参考にさせていただきます。

回答No.3

>Resize(intCnt, 58) ???

romiromi
質問者

お礼

コードを修正いたしました。 補足はいたしませんが、「変だ」という指摘をいただいて ありがとうございました。 ヘンでした。

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.1

>取得した結果 と言うのは、varDATAのことですか? であるなら、デバッグしながら見ていくとこの変数には、ちゃんと奇数・偶数行の値が取得されています。ただ、配列ではないので毎回上書きされています。 ループが終了したときには最後の行がセットされています。 勘違いでしたらごめんなさい。

romiromi
質問者

お礼

ご回答ありがとうございました。 シンプルなコードに修正することで 今回は回避いたしました。

関連するQ&A