下記の質問をいただきました 質問:ブック間コピーを行いたい
突然で申し訳ございませんが、ブック間コピーを行いたいのですが、上手くいきません。
お力添えください。よろしくお願い致します。
もしできたら、コピー元を最終行最終列を選択できるとうれしいです。
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 'ここまで
あっ、
>コピー元を最終行最終列を選択
最終列を忘れてた・・・、また、仕様の確認をミスった・・・