関工健児誇りあれ!?

下関のブログです(^^)v 明日見村 MotoG5Plus Windows10 Kindle iPhone Access Excel VBA ALCATEL IDOL4 Zenfone2 ZE551ML CHUWI Hi8 目標は?100kb/s でも読めるアホblog です

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 で引っかかる事はないとと思いますが、VISTAwin7 なら有るかもしれません

Office のバージョンも重要です

win8 はかなり軽いですが、win7系は元々がVISTAでしょうから、かなり効率が悪いでしょうし、オフィースに至っては、年々余計なお世話機能が入りますので、その辺りは十分なテストが必要です

    w_IPCNT3 = REC.RecordCount + 1

プラス1 してるのは、タイトル行を除くため

他は、特に難しくないと思います

同じ事をするのにも、イロイロ有るでしょ!

こうやって、1つづつ、プログラムも大人になります

(^^)

 

明日見むら

村長さんでした

(^^)vba

asumi-mura

by. EXCEL VBA Copy & Paste