ACCESSからEXCEへ出力!VBA その6 アクセス講座
ACCESS から EXCE へ出力! コピペのイロイロ
VBA その6 アクセス講座
ひな形」は、
---
' (範囲指定でコピーする方法)
If i < 1 Then GoTo sheet_11
'xlPasteValues = -4163, xlNone = -4142, xlPasteAll = -4104
SHEET.Rows(Y_ROW).Copy
SHEET.Rows(Y_ROW + 1 & ":" & i + Y_ROW).PasteSpecial Paste:=-4104, Operation:=-4142, SkipBlanks:=False, Transpose:=False
---
' (1行づつコピーする方法)
'row行目の書式を含めコピーする
For i = i To 1 Step -1
SHEET.Rows(Y_ROW).Copy
SHEET.Cells(Y_ROW, X_COL).INSERT Shift:=-4121 'Shift:=xlDown '-4121=xlDown、xlShiftDown
Next
---
違いは、エクセルの操作と同じ
行を1行選択して、その次の行へコピーします
範囲選択とどちらが良いかは、PCの環境にも依ると思います
少ない行数、100行程度だと、ほとんど違いは有りません
範囲選択すると速いのですが、若干メモリを食う気がするので、、、
とは云え、、、
範囲選択でも、90,000-行くらいまでは、一瞬、です
xp の古いPC で256M でも大丈夫!
実証済み、、、但し、OffLine で使用しています
大体の目安です
これとは別に、簡単な書式で全てOKであれば、EXCEL の書式設定で、列を全て選択してしまうのも1つの方法です
これだと、項目数、コピー行数が多くても良いですネ
この行をコピーする時間が短縮されます
2,000行で、100項目くらい、コピペで10秒くらいかなぁ~
まっ、スペックによるのですが、実際に使用していたのは、xp、1Gメモリ、シングルコアだったので、それでも時間短縮できるのは随分違って感じます
これを踏まえて更に高速化するには、、、
---
'---(時間短縮 Ver)--- ※Export(Work)→Copy(Paste)→Delete(Work)
Dim SHEET3 As Object
Dim BOOK_NM3 As String
Dim w_IPCNT3 As Integer
BOOK_NM3 = PATH_RPT & "\R3030_Exp.xls"
sheet_11:
w_IPCNT3 = REC.RecordCount + 1
REC.Close
If w_IPCNT3 = 1 Then GoTo sheet_2
OBJ.DisplayAlerts = False '確認メッセージなしに保存する-->
OBJ.WorkBooks(1).SaveAs BOOK_NM2 '一旦、保存
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
"Q3030_P1DAT", BOOK_NM3, False
OBJ.WorkBooks.Open BOOK_NM3
Set SHEET3 = OBJ.WorkBooks(2).WorkSheets(1)
SHEET3.Rows(2 & ":" & w_IPCNT3).Copy '1行目:HD
'xlPasteValues = -4163, xlNone = -4142
SHEET.Rows(3).PasteSpecial Paste:=-4163, Operation:=-4142, SkipBlanks:=False, Transpose:=False
OBJ.CutCopyMode = False '切り取りモードを解除する
OBJ.WorkBooks(1).SaveAs BOOK_NM2
OBJ.DisplayAlerts = True '-->戻す
OBJ.WorkBooks(2).Close
Kill BOOK_NM3
OBJ.WorkSheets(1).Select '複数シートの時は一旦シートを選択しないとセルを選択できない!
SHEET.Cells(1, 1).Select '※上記「貼り付け」時は範囲選択も解除する事!(処理が異常に遅くなる)
'---(時間短縮 End)--------------------------------------------------------------
sheet_2:
---
何をやってるかって言うと、、、
ms さんのエクスポート機能を使っています
これ実際に手動で使えば分かりますが、ms 想定内の件数であれば、エクスポートがメチャクチャ速いです
細かい制御を調べても良いのですが、そんな時間をかけるより、これをそのまま使えば良いです
ACCESS DB のテーブル、クエリ、を選択-->右クリック-->エクスポート と同じです
これを一旦行なって、この全てを選択(EXCELの左上)
その後、、、
所定のEXCEL Sheet に値の貼り付け を行なっています
これが、一番効果的でした
但し、環境に依る事があるかもしれませんので、ダメなPC環境用にも、元々の処理は残しておきます
実際は、出力画面のオプションで、高速印刷チェック ON/OFF を入れています
規定値は、ON
かなり古いPCでも、引っかかった事はないのですが、項目数、レコード数、に依るかもしれませんので、その辺りは事前によくテストして見ましょ
まぁ、最近のPC で引っかかる事はないとと思いますが、VISTA、win7 なら有るかもしれません
Office のバージョンも重要です
win8 はかなり軽いですが、win7系は元々がVISTAでしょうから、かなり効率が悪いでしょうし、オフィースに至っては、年々余計なお世話機能が入りますので、その辺りは十分なテストが必要です
w_IPCNT3 = REC.RecordCount + 1
プラス1 してるのは、タイトル行を除くため
他は、特に難しくないと思います
同じ事をするのにも、イロイロ有るでしょ!
こうやって、1つづつ、プログラムも大人になります
(^^)
明日見むら
村長さんでした
(^^)vba
asumi-mura