- - PR -
EXCEL出力を高速にする方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-10-17 17:39
外部からSheetにループで1行づつ貼り付ける場合、確かもっと扱える行数が
少なかった(か、とんでもなく遅かった)と思います。(最新では解消されたの かもしれませんが) 外部からSheetにデータを貼り付ける場合には、配列等でバサっと一気に行う か、列単位で貼り付けると早いです。 項目がすべて文字列とかの場合には、2次元配列1つで良いのですが、混在 するとRangeで指定できる範囲ごとに2次元配列変数を定義する必要があります。 (結構面倒ですが、速度は全然違います。) 後は、一旦ファイルに出して、外部データインポートという方法もあります。 | ||||
|
投稿日時: 2003-10-17 17:54
Hasumiです。
一度テキストファイルにCSV形式で出力してからExcelで読み込み、書式等を設定後 Excel形式で保存するとか。(試していないので高速になるかは不明です。) Excelの行数について Excel95以前では16384行までだったようです。 [XL97] Excel 97 および 5.0/95 ブック形式の使用について | ||||
|
投稿日時: 2003-10-17 18:52
Masaです。 ちなみに、行数の制限に引っかかったプログラムは Excel2000で作成されています。 昔々に見た不良だった気がしていたので、Excel2000 で発生したのを見たときは唖然としましたが... | ||||
|
投稿日時: 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-10-20 16:35
自己解決です。
R1C1にこだわりすぎていました。 シンプルに(1,1)とすればちゃんとできました。 これまでの皆さんの返答、感謝しています。 本当にありがとうございました。 | ||||
|
投稿日時: 2003-10-21 06:34
そういうことって、ありますよね。 確かRC1形式で指定するにはそれようのメソッドを使うような…? | ||||
|
投稿日時: 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-10-21 11:35
確かに高速化にはなるでしょうけれど、特にサーバ環境では問題あると思います。 クリップボードは共有のリソースですからね(同時に動いたりするとどうなるか…というところ) # 個人的にはクライアント環境でもあまり好きではありませんが。 クリップボードを使うなら、配列の方が安全ではないかと思います。 # 配列では出来ないとか理由があったらすみません |