こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA ブック間のコピー

選択したテキストファイルをエクセルで開いたコピーし、
もう一つ開いたエクセルファイルにペーストするというマクロをVBAで
作成していますが、つまずいてしまいました。

-----------------------------------
Dim wb1 As String
Dim wb2 As String

Sub Opentxt()

wb1 = Application.GetOpenFilename("テキストファイル,*.txt")
If wb1 <> "False" Then
Workbooks.OpenText Filename:=wb1, DataType:=xlDelimited, comma:=True

End If

End Sub

Sub Copy()

Dim LastRow As Long

wb2 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If wb2 <> "False" Then
Workbooks.Open wb2

LastRow = wb2.Sheets("一覧表").Range("A" & Rows.Count). End(xlUp).Row

wb2.Sheets("一覧表").Range("A5:A" & lastRow).Copy _
wb1.Sheets("Sheet1).Range("B33")

End If

End Sub
-----------------------------------
Opentxtの方は問題ないですが、Copyの方を実行すると
wb1とwb2で引っかかって「コンパイルエラー/ 修飾子が不正です」と
表示されて、エラーになってしまいます。

この場合変数の型などがおかしいのでしょうか?
excel2007を使用しています。

よろしくお願いします。

投稿日時 - 2015-05-19 11:56:04

QNo.8977916

困ってます

質問者が選んだベストアンサー

変数「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

投稿日時 - 2015-05-19 13:37:20

お礼

とても分かりやすくご説明いただきまして、無事解決できました。
質問以外にもご指摘をいただき、ありがとうございました。

投稿日時 - 2015-05-19 21:50:02

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

前の方の回答でOKだと思いますが、敢えて言うならCopyはあまり使わない方が良いと思います。
クリップボードを使うのは重くなるだけなので。

セルの値を他のセルに入力したい場合は、単純に.valueで値を参照すればできます。

コピーを実行している部分を、
wWb2.Sheets("一覧表").Range("A" & LastRow + 1).Value = wWb1.Sheets(1).Range("B33")
のように、
値を入れるセル.Value=値の参照元セル
とすればOKです。

ご参考まで。

投稿日時 - 2015-05-19 14:20:24

お礼

ありがとうございます。
どちらも試してみて、具合の良い方を選択したいと思います。

投稿日時 - 2015-05-19 21:50:54

あなたにオススメの質問