アプリ版:「スタンプのみでお礼する」機能のリリースについて

512×512の二次元配列データが入ったバイナリデータを読み込んで
ワークシートのセルに出力するプログラムと
ワークシートのセルの内容をタブ区切りのテキストデータとして出力するプログラムを
VBAを使って、作りたいと考えています。

普通にバイナリデータを二次元配列に読み込み

for y = 1 to 512
for x = 1 to 512

Cells(x, y) = hairetu (x,y)

next x
next y

というようにすると
10秒くらいかかります。
一方で
バイナリデータを一度タブ区切りテキストデータとして出力後に
直接ワークシートに読み込ませると
一瞬で読み込むことができます。
なぜこのような速度差が生じるのでしょうか?

配列の内容をワークシートを読み込ませたい場合
一度テキストデータを経由することなく高速で読み込ませるにはどうしたら良いですか?


ワークシートの内容をタブ区切りのテキストデータとして出力する場合も同様に
forループを使って出力すると10秒程度時間がかかります。
一方で普通にExcelの保存機能を使うと
一瞬で保存することができます。
どうすればExcel機能と同じくらいの速度でタブ区切りデータとして保存することができますか?

質問者からの補足コメント

  • すいませんあと、もう一つ質問なので
    教えてくださった方法だと
    Range("A1:CV1000")
    のようにしてセルの範囲を指定しますが、
    Cells(5,6)のように数値で指定することはできないでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/03/18 10:50

A 回答 (4件)

配列順番は合わせる必要があります。


実質的に1から始まる配列を使いたい場合、モジュール最初のプロシージャの上に
option base 1
を加えます。こうすると、配列の添え字の初期値が0でなく1になります。

逆順
同一サイズの配列Bを用意し
For i=1 to 512
B(i)=A(513-i)
next i
    • good
    • 0
この回答へのお礼

ありがとうございます。

うまくいきました。

お礼日時:2015/03/19 13:08

セル範囲の表現


以下、全部同じセル範囲です。
Range("A1:CV1000")
Range(Cells(1,"A"),Cells(1000,"CV"))
Range(Cells(1,1),Cells(1000,100))
Cells(1,1).resize(1000,100)

色指定
思い付くのは、あなたのお話しのfor-nextループ位です。強いて挙げるならThisWorkbook.worksheets("Sheet1")をくくって、
With ThisWorkbook.worksheets("Sheet1")
For i=1 to 512
For j=1 to 512
.Cells(i,j).interior.colorindex=
Next j
Next i
End with

Cellsの前のピリオドを忘れないように。
これをやらないと、マクロはThisWorkbookの、シートSheet1の、とブックとシートの特定作業を512×512回やってしまいます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

うまくいきました。

しつこくなって申し訳ありませんがもう一つ質問です。

配列の順番は予めセルに合わせて並べ替えておく必要がありますか?

この方法だと配列の0~511にデータが入っている必要がありますが
例えば、
1~512にデータが入っており
Cells(1,1)~cells(1,512)
に出力することはできませんか?


それと、
配列の0~511にデータが入っていたとして
逆順で出力することはできませんか?
0→511、1→510、・・・511→0
のように逆順にすることは可能でしょうか?

よろしくお願いいたします。

お礼日時:2015/03/18 20:44

No1です。

補足します。
同じ方法では出来ません。あくまで2次元セルと2次元配列の間でのみ可能な方法なので、例えば
Range(Cells(1,1),Cells(512,512)).Interior.ColorIndex=A
のようにしても出来ません。さらに配列Aを一旦セルに読み込んだ後で
Range(Cells(1,1),Cells(512,512)).Interior.ColorIndex=Range(Cells(1,1),Cells(512,512)).Value
のようにセルのValueからColorIndexに読み込もうとしてもエラーになります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

同じ方法でなくて良いのでできる方法があれば教えてください。

お礼日時:2015/03/18 10:43

セルへの入出力に時間が掛かります。

for-nextループで512×512回出力するため、時間を食うのです。一度コンマ区切りデータにしたファイルを読み込む際は、一気に読み込むため早いのです。ではどうすればいいか、下記URLを参照下さい。プログラム3の17行目で一気に出力してるのがポイントです。

http://www.seiji-tsubosaki.net/ExcelTech/ExcelVB …
    • good
    • 0
この回答へのお礼

ありがとうございます。

まだ、試していませんがうまくいきそうだと思います。
書き出しの方もそのサイトに書かれてありました。

すいません、もう一つ教えていただきたいのですが
512×512の配列のデータからセルの色の変更も行いたいのですが

ThisWorkbook.Worksheets("Sheet1").Cells(x, y).Interior.color = cl_pl_ARGB(hairetu(x, y))

をForループで回すと数値をセルに代入するよりも
2~3倍くらい時間がかかります。

上記と同じような方法をセルの配色変更に応用できないでしょうか?

お礼日時:2015/03/16 22:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!