- PR -

EXCEL出力を高速にする方法

投稿者投稿内容
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2003-10-17 17:39
外部からSheetにループで1行づつ貼り付ける場合、確かもっと扱える行数が
少なかった(か、とんでもなく遅かった)と思います。(最新では解消されたの
かもしれませんが)

外部からSheetにデータを貼り付ける場合には、配列等でバサっと一気に行う
か、列単位で貼り付けると早いです。
項目がすべて文字列とかの場合には、2次元配列1つで良いのですが、混在
するとRangeで指定できる範囲ごとに2次元配列変数を定義する必要があります。
(結構面倒ですが、速度は全然違います。)

後は、一旦ファイルに出して、外部データインポートという方法もあります。
Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2003-10-17 17:54
Hasumiです。

一度テキストファイルにCSV形式で出力してからExcelで読み込み、書式等を設定後
Excel形式で保存するとか。(試していないので高速になるかは不明です。)

Excelの行数について
Excel95以前では16384行までだったようです。
[XL97] Excel 97 および 5.0/95 ブック形式の使用について
Masa
会議室デビュー日: 2002/08/13
投稿数: 16
投稿日時: 2003-10-17 18:52
引用:

Hasumiさんの書き込み (2003-10-17 17:54) より:
Hasumiです。

一度テキストファイルにCSV形式で出力してからExcelで読み込み、書式等を設定後
Excel形式で保存するとか。(試していないので高速になるかは不明です。)

Excelの行数について
Excel95以前では16384行までだったようです。
[XL97] Excel 97 および 5.0/95 ブック形式の使用について



Masaです。
ちなみに、行数の制限に引っかかったプログラムは
Excel2000で作成されています。

昔々に見た不良だった気がしていたので、Excel2000
で発生したのを見たときは唖然としましたが...
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2003-10-20 13:05
Jittaさん、Masaさん、Beatleさん、Hasumiさん返答ありがとうございました。
現在、自分が開発している状況を考えて配列で一気に入れてしまうのが一番よいのかなぁ
と考えました。
でも1つ問題点がありまして例えば

Dim TBL() As String
ReDim TBL(10, 5)
Range("A15:E24").Value = TBL

だとうまく良くのですが

Range("R15C1:R24C5").Value = TBL1

だと例外エラーで落ちてしまいます。
何がいけないのかさっぱりわかりません。
R1C1では無理なんてことはないですよね。
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2003-10-20 16:35
自己解決です。
R1C1にこだわりすぎていました。
シンプルに(1,1)とすればちゃんとできました。
これまでの皆さんの返答、感謝しています。
本当にありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-21 06:34
引用:

ななさんの書き込み (2003-10-20 16:35) より:

自己解決です。
R1C1にこだわりすぎていました。


そういうことって、ありますよね。
確かRC1形式で指定するにはそれようのメソッドを使うような…?
Mr.タナカ
ベテラン
会議室デビュー日: 2003/03/15
投稿数: 64
投稿日時: 2003-10-21 11:05
こんにちは。
スレッド見ました。

Excelへの出力ですが、セル一つずつを指定して記述していると遅いです。
一番早いのは、ペーストを使用するのが早いです。
最悪、Rangeオブジェクトを使用する方がいいと思います。

方法は...
@クリップボードにString型で作成したデータを格納
ACells(1, 1).Selectで開始位置を指定
BPasteで貼付け

これで完成です。

String型の変数には、Tabで列、CrLfで行を区切ります。
ただし、Excelの書式は個別に設定する必要があります。
これはRangeを使用すれば、かなり早くなるはずです。

いろいろと試しましたが、これの方が早いと思います。
ASP.NETでは無理かもしれませんが...

↓VB6ですと、こんな感じです。
'データ作成
strExcelData = strExcelData & "データ1" & vbTab
strExcelData = strExcelData & "データ2" & vbTab
strExcelData = strExcelData & "データ3" & vbTab
strExcelData = strExcelData & "データ4" & vbCrLf

'現在のクリップボードの値を格納
valClipboard = Clipboard.GetText

'クリップボードのクリア
Clipboard.Clear

'クリップボードに格納
Clipboard.SetText strExcelData

With objxlsSheet.Application.ActiveSheet
'フォーマット指定
.Range(.Cells(1, 1), .Cells(1, 2)).Interior.ColorIndex = 15 'ヘッダの背景
.Range(.Cells(1, 1), .Cells(2, 2)).NumberFormat = "@"

'記述位置を指定
.Cells(1, 1).Select

'データ貼り付け
.Paste

'クリップボードのクリア
Clipboard.Clear

'バックアップのクリップボードを戻す
Clipboard.SetText valClipboard

'アクティブなシートの設定
objxlsSheet.Application.Sheets(1).Select
End With

[ メッセージ編集済み 編集者: Mr.タナカ 編集日時 2003-10-21 11:09 ]

[ メッセージ編集済み 編集者: Mr.タナカ 編集日時 2003-10-21 11:13 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-10-21 11:35
引用:

Mr.タナカさんの書き込み (2003-10-21 11:05) より:

Excelへの出力ですが、セル一つずつを指定して記述していると遅いです。
一番早いのは、ペーストを使用するのが早いです。
最悪、Rangeオブジェクトを使用する方がいいと思います。


確かに高速化にはなるでしょうけれど、特にサーバ環境では問題あると思います。
クリップボードは共有のリソースですからね(同時に動いたりするとどうなるか…というところ)
# 個人的にはクライアント環境でもあまり好きではありませんが。

クリップボードを使うなら、配列の方が安全ではないかと思います。
# 配列では出来ないとか理由があったらすみません

スキルアップ/キャリアアップ(JOB@IT)