二次元配列に入れたデータをExcelへ出力(VB6.0

解決


HAWK  2006-01-20 20:03:07  No: 93750

初投稿です。よろしくお願いします。

VB6.0を使用して、データベースからの参照&データの出力の作業を行っています。
Spreadシートにデータベースの内容を表示し、表示されているデータと同じデータを二次元配列に入れる。という作業まで行ったのですが、その二次元配列に入れたデータをExcelに書き出すというところで詰まってしまいました。

http://www.bcap.co.jp/hanafusa/VBHLP/excel04.htm

ここらへんのページを見ると、1セルずつデータを写していけばいいんだなー。。。と感じたのですが、それですとわざわざ二次元配列にデータを入れた意味が無くなるのでは?とも感じます。(Spreadシート→Excelに直接データを入れていけばいいことになってしまう?ので。

二次元配列に入れたデータを使う。という前提で行うと、一気に書き出すような事をする方がいいのかな?とも思うのですが、そのようなことは可能なのでしょうか??

よろしくお願いします。


ガッ  2006-01-20 20:15:02  No: 93751

> それですとわざわざ二次元配列にデータを入れた意味が無くなるのでは?
うーん…
操作をただ糖衣すればいいだけだと思うんだけどなぁ

きっと
For i=1 To ..
  For k=1 To ..
    [ExcelのCellに代入する]
  Next
Next
という「コードが浮かんだ」から"意味が無い"と感じるだけで、
それを関数として次の様にすれば
Function Hoge([エクセルのRange],[2次元配列]) As [戻り値ステータス]
  [Rangeに合うように2次元配列を代入していく]
End Sub
別に何ともないと思う…気がする。


もげ  2006-01-20 20:40:14  No: 93752

http://support.microsoft.com/kb/247412/
「オートメーションを使用してデータの配列をブックの特定のセル範囲に転送する」 
のあたりとか。


HAWK  2006-01-20 20:45:12  No: 93753

回答ありがとうございます。

まだVBでの考え方(?)が稚拙な部分もあるので、そこらへんはご勘弁ください(汗

確かに、上半分にかかれているコードが思いつきました。
ExcelにCell。。。で1セル分ずつデータを書き込めるかな〜とは思いましたが。。。

Function Hoge([エクセルのRange],[2次元配列]) As [戻り値ステータス]
  [Rangeに合うように2次元配列を代入していく]
End Sub
ということは、やっていることは同じ。。。?ですか??
Hogeを呼び出す以前(もしくはHogeの中で?)に、エクセルのRange(セル番号?ですよね?)と二次元配列のデータ入れてある場所を渡してやって(もしくは増やして?)、Hogeの中で、代入する。

ということで、上半分のコードをそのまま関数にした。
という解釈でよろしい。。。でしょうか??

追記可能でしたら、お手数ですけれどもしていただけると助かります。よろしくお願いします。


LESIA  2006-01-20 22:15:38  No: 93754

二次元配列なら、一気に代入できますよ。

Dim a(4, 4) As Long
Dim i As Long
Dim j As Long
Dim r As Long
Dim c As Long

For i = 0 To 4
    For j = 0 To 4
        a(i, j) = i * 5 + j
    Next j
Next i

r = UBound(a) - LBound(a) + 1
c = UBound(a, 2) - LBound(a, 2) + 1
objSheet.Range("A1").Resize(r, c).Value = a


HAWK  2006-01-20 22:45:37  No: 93755

もげさん、LESIAさん。返信ありがとうございます。

もげさん紹介のアドレスを参考にやってましたが、データ出力までは何とか行きました。

ただ、出力したい並びがどうしても直らない。。。という問題が。。。

配列を作成し、データを入れる際は、

Dim a(4,4) As Variant
Dim i As Long
Dim m As Long
m = 1

For i = 0 To 4
    a(0,i) = m
    a(1,i) = [データベースから持ってきた名前]
    a(2,i) = [データベースから持ってきた住所]
    a(3,i) = [データベースから持ってきた年齢]
    m++
Next i

などと行っているので、この時配列を見たとすると

1,名前,住所,年齢
2,名前,住所,年齢
3,名前,住所,年齢
4,名前,住所,年齢

という並びになっているのでは?と思うのですが、

r = UBound(a) - LBound(a) + 1
c = UBound(a, 2) - LBound(a, 2) + 1
objSheet.Range("A1").Resize(r, c).Value = a

こちらの方の作業を行うことで、実際にExcelに出力されるデータは

1,2,3,4
名前,名前,名前,名前
住所,住所,住所,住所
年齢,年齢,年齢,年齢

となってしまいます。

objSheet.Range("A1").Resize(r, c).Value = a
この文自体の仕様?でしょうか??
それとも、自分が書いた配列の方の理解不足。。。でしょうか??


那岐  2006-01-20 23:12:10  No: 93756

単に配列の次元が入れ替わっているだけの様な気がします。
Ubound関数のリファレンスをMSDNで見てみたら幸せになれるかも。

この場合どちらの次元を行として見るかが重要ではないかと。
rに行として見ている次元のUbound、cに列数として見ている次元のUboundが代入されれば思うとおりになるんでは?

#次元と配列については感覚的に理解しているのでうまく説明できません。
#問われても抽象的な答えしか返せないと思いますので識者の方に委ねます。


LESIA  2006-01-20 23:53:05  No: 93757

二次元配列をValueプロパティに代入するときは、a(行,列)になってないと
うまくいきません。
配列に値を入れるときに、そうなるようにするか、
objSheet.Range("A1").Resize(r, c).Value = objAppExcel.Transpose(a)
のように、行と列を入れ換えてValueに代入してください。


HAWK  2006-01-23 18:43:28  No: 93758

休日分、間があいてしまいました。。。(汗

何とか目的どおりになった事をご報告です。

的確なアドバイス、ありがとうございました。
いろいろと難しいですね。。。
また別のところで詰まるとも思いますが、その際にはよろしくお願いします。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加