- ベストアンサー
エクセルVBA ブック間のコピー
- エクセルVBAでブック間のコピーを行う方法を学んでいますが、コンパイルエラーが発生してしまいます。
- Opentxtマクロは正常に動作していますが、Copyマクロで問題が発生しています。
- 変数の型などを確認してもエラーの原因がわかりません。Excel 2007を使用しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
変数「wb1」「wb2」は文字列型として宣言していますので、wb2.Sheets("一覧表") こんな使い方は出来ません。この様に使うためにはWorkbookオブジェクトにする必要があります。 次に、質問文が正しいとすると、Copy関数の使い方が逆です。 例:Worksheets("Sheet1").Range("A1").Copy Worksheets("Sheet2").Range("B2") Sheet1のセルA1からSheet2のセルB2にコピー また、開いたテキストファイルのシート名を「Sheet1」としていますが、テキストファイルはファイル名がシート名になります。 シート名を指定するよりはSheets(1)の様にして1番目のシートと指定した方が良いと思います。 また、悪いわけではありませんがCopyの様に他でも良く使う名前をプロシージャ名に使うのは混乱の元です(以下の例ではDataCopyに改名しました)。なるべく使わない方が良いです。 Dim wb1 As String Dim wb2 As String Dim wWb1 As Workbook Dim wWb2 As Workbook Sub Opentxt() wb1 = Application.GetOpenFilename("テキストファイル,*.txt") If wb1 <> "False" Then Workbooks.OpenText Filename:=wb1, DataType:=xlDelimited, comma:=True Set wWb1 = ActiveWorkbook End If End Sub Sub DataCopy() Dim LastRow As Long wb2 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If wb2 <> "False" Then Workbooks.Open wb2 Set wWb2 = ActiveWorkbook LastRow = wWb2.Sheets("一覧表").Range("A" & Rows.Count).End(xlUp).Row wWb1.Sheets(1).Range("B33").Copy wWb2.Sheets("一覧表").Range("A" & LastRow + 1) End If End Sub
その他の回答 (1)
- qualheart
- ベストアンサー率41% (1451/3486)
前の方の回答でOKだと思いますが、敢えて言うならCopyはあまり使わない方が良いと思います。 クリップボードを使うのは重くなるだけなので。 セルの値を他のセルに入力したい場合は、単純に.valueで値を参照すればできます。 コピーを実行している部分を、 wWb2.Sheets("一覧表").Range("A" & LastRow + 1).Value = wWb1.Sheets(1).Range("B33") のように、 値を入れるセル.Value=値の参照元セル とすればOKです。 ご参考まで。
お礼
ありがとうございます。 どちらも試してみて、具合の良い方を選択したいと思います。
お礼
とても分かりやすくご説明いただきまして、無事解決できました。 質問以外にもご指摘をいただき、ありがとうございました。