三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ ブック間コピーについて オブジェクトを分けて作成してみました

下記の質問をいただきました 質問:ブック間コピーを行いたい

突然で申し訳ございませんが、ブック間コピーを行いたいのですが、上手くいきません。
お力添えください。よろしくお願い致します。
もしできたら、コピー元を最終行最終列を選択できるとうれしいです。

Public Function copyXLSheet_OK()

'Access から2つのBookを開きSheetをコピーする

    Dim MyXl As Object                  'Excel.Application
    Dim myXLName1 As String             'コピー元Bookのフルパス
    Dim myXLName2 As String             'コピー先Bookのフルパス
    Dim myXLShName1 As String            'コピーするSheet名
    Dim myXLShName2 As String            'コピーするSheet名

    myXLName1 = CurrentProject.Path & "\AAA.xlsx"
    myXLName2 = CurrentProject.Path & "\BBB.xlsx"
    myXLShName1 = "コピー元"
    myXLShName2 = "コピー先"
    
    '保存したファイルを開く
    Set MyXl = CreateObject("Excel.Application")
    With MyXl
        'コピー元 Book Open
        .Workbooks.Open (myXLName1)
        'コピー先 Book Open
        .Workbooks.Open (myXLName2)
        
        
        .Workbooks(2).Sheets(myXLShName2).Range(.Cells(1, 1), .Cells(8, 10)).ClearContents
       
        'Sheet Copy
        .Workbooks(1).Sheets(myXLShName1).Range(.Cells(1, 1), .Cells(8, 10)).Copy .Workbooks(2).Sheets(myXLShName2).Range(.Cells(1, 1))

        
        'コピー元は保存せず終了
        .Workbooks(1).Close SaveChanges:=False  '※
        'コピー先は上書き保存(閉じない)
   '★終わったら、閉じる★
   '-----------
      .ActiveWorkbook.Close SaveChanges:=True
      .Quit
        
    End With
    
  Set MyXl = Nothing
    
End Function


回答:オブジェクトを分けて、長いコードにしてみました。


こんにちは

.Workbooks(1).Sheets(myXLShName1).Range(.Cells(1, 1), .Cells(8, 10)).Copy .Workbooks(2).Sheets(myXLShName2).Range(.Cells(1, 1))


なんかうまく動作していなかったみたいなので、

    Dim myBK1 As Object  'コピー元Excelブック
    Dim myBK2 As Object  'コピー先Excelブック

    Dim mySH1 As Object  'コピー元シート
    Dim mySH2 As Object  'コピー先シート

とオブジェクトを分けて、長いコードにしてみました。

なぜだろう?
ネットでも一行で
.Copy コピー先 .Workbooks(2).Sheets(myXLShName2).Range(.Cells(1, 1))
みたいなコードをみるし・・・

シンプルな一行コードを長くしてすみません。
下記、修正したコードです、試してみてください。
解決のヒントとなれば幸いです。三流プログラマー Ken3

'ここからテストコード

Public Function copyXLSheet_OK()

'Access から2つのBookを開きSheetをコピーする

    Dim MyXl As Object                  'Excel.Application
    Dim myXLName1 As String             'コピー元Bookのフルパス
    Dim myXLName2 As String             'コピー先Bookのフルパス
    
    Dim myBK1 As Object  'コピー元Excelブック
    Dim myBK2 As Object  'コピー先Excelブック
    
    Dim myXLShName1 As String            'コピーするSheet名
    Dim myXLShName2 As String            'コピーするSheet名

    Dim mySH1 As Object  'コピー元シート
    Dim mySH2 As Object  'コピー先シート
    
    'パラメーターを頭でセット
    myXLName1 = CurrentProject.Path & "\AAA.xlsx"
    myXLName2 = CurrentProject.Path & "\BBB.xlsx"
    myXLShName1 = "コピー元"
    myXLShName2 = "コピー先"
    
    '保存したファイルを開く
    Set MyXl = CreateObject("Excel.Application")
    MyXl.Visible = True
    
    'コピー元Sheetの用意
    Set myBK1 = MyXl.Workbooks.Open(myXLName1)  'ファイルを開き
    Set mySH1 = myBK1.Sheets(myXLShName1) 'シートをセット
    
    'コピー先シートの用意
    Set myBK2 = MyXl.Workbooks.Open(myXLName2)  'ファイルを開き
    Set mySH2 = myBK2.Sheets(myXLShName2) 'シートをセット
    mySH2.select  'シートも選択しとくか念のため・・・
    
    'コピー先を先にクリアする .ClearContents
    mySH2.Range(mySH2.Cells(1, 1), mySH2.Cells(8, 10)).ClearContents
    
    'コピーする 元のSH1からSH2へ
    'Sheet Copy Paste コピペ
    mySH1.Range(mySH1.Cells(1, 1), mySH1.Cells(8, 10)).Copy
    '元SH1↑をコピー 先SH2↓にペースト 合わせるとコピペと人は言う
    mySH2.Cells(1, 1).select
    mySH2.Paste

    'コピー元 BK1は保存せず終了
    myBK1.Close SaveChanges:=False  '※
        
    'コピー先 Bk2は上書き保存(閉じない)
    '-----------
    myBK2.Save  'コピー先BK2を保存
    
    '最終行を選択
    Dim y As Long   '最終行 End(xlDown).Row
    y = mySH2.Cells(1, 1).End(-4121).Row  'xlDown : -4121 なので
    mySH2.Rows(y).select  '行選択にしたけど
    mySH2.select  'シートも選択しとくか念のため・・・

    'コードを抜けた後そのままにしたい
    MyXl.UserControl = True  'Userのコントロールを受け付けるようにする
    
    'そして変数解放
    Set mySH1 = Nothing
    Set myBK1 = Nothing

    Set mySH2 = Nothing
    Set myBK2 = Nothing

    Set MyXl = Nothing
    
End Function

Private Sub コマンド0_Click()
    Call copyXLSheet_OK  'コピー処理を呼ぶ
    MsgBox "確認してね"
End Sub

'ここまで


あっ、

>コピー元を最終行最終列を選択

最終列を忘れてた・・・、また、仕様の確認をミスった・・・

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)