こんばんは。Wendy02です。
>オートフィルタのプルダウンメニューなどを含む領域が選ばれてしまい、結局すべてのデータ(ある意味シート丸ごと)がコピーされてしまったのであきらめていました。
気が付かなくてすみません。
>currentregionでなんとかなるとは思ったんですけどね・・・
CurrentRegion で範囲を取る場合は、Offset で一行下げて(-1)、Resizeで、CurrentRegion の行数(Rows.Count)から-1を引くと、タイトル行がない部分の範囲が取れます。コードの中に、二種類の方法が書いてありますので、研究してみてください。今回は、AutoFilterのRangeを使っています。
それから、バグを見つけましたので、最初から書き直しました。定数で設定するのはやめることにしました。他のフォルダにある場合、既に開いていた場合に、設定できないことが分りました。なお、ご自分でマクロをお作りになる場合は、二つのブックを開いておけば、単に、Set Bk1 = Workbooks(Book_A) : Set Bk2 = Workbooks(Book_B) だけで、その前の部分は、まったく必要ありません。
'--------------------------------------------------
Sub CopySelectedRangeR()
'オートフィルタの領域をコピーする
Dim BK1 As Workbook
Dim BK2 As Workbook
Dim dummy As Variant
Dim Book_A As String
Dim Book_Ar As String
Dim Sheet_A As String
Dim Cell_A As String
Dim Cell_A_Last As String
Dim Book_B As String
Dim Book_Br As String
Dim Sheet_B As String
Dim Cell_B As String
'設定項目
Book_A = "A.xls"
Sheet_A = "a"
Cell_A = "A7"
Cell_A_Last = "L300" 'CELL_Aの終点
Book_B = "C:\MY Documents\B.xls"
Sheet_B = "a"
Cell_B = "A7"
'ブックの存在の確認
If Dir(Book_A) = "" Then _
MsgBox Book_A & " は、同じフォルダにないか、ブックが見当たりません。", vbInformation: Exit Sub
If Dir(Book_B) = "" Then _
MsgBox Book_B & " は、同じフォルダにないか、ブックが見当たりません。", vbInformation: Exit Sub
On Error GoTo Quit
'ブック名を取る
If InStr(Book_A, "\") > 0 Then
Book_Ar = Mid$(Book_A, InStrRev(Book_A, "\") + 1)
Else
Book_Ar = Book_A
End If
If InStr(Book_B, "\") > 0 Then
Book_Br = Mid$(Book_B, InStrRev(Book_B, "\") + 1)
Else
Book_Br = Book_B
End If
dummy = Evaluate("[" & Book_Ar & "]" & Sheet_A & "!" & Cell_A)
If IsError(dummy) Then
Set BK1 = Workbooks.Open(Book_A)
Else
Set BK1 = Workbooks(Book_Ar)
End If
dummy = Evaluate("[" & Book_Br & "]" & Sheet_B & "!" & Cell_B)
If IsError(dummy) Then
Set BK2 = Workbooks.Open(Book_B)
Else
Set BK2 = Workbooks(Book_Br)
End If
'実行準備
If BK1.Worksheets(Sheet_A).AutoFilterMode = False Then
Application.Goto BK1.Worksheets(Sheet_A).Range(Cell_A)
MsgBox "オートフィルターモードになっておりません。": GoTo Quit
Else
If BK1.Worksheets(Sheet_A).FilterMode = False Then
Application.Goto BK1.Worksheets(Sheet_A).Range(Cell_A)
If MsgBox("オートフィルタが選択モードになっておりませんが、続行しますか?", vbOKCancel) = vbCancel Then GoTo Quit
End If
End If
If WorksheetFunction.CountA(BK2.Worksheets(Sheet_B).Range(Cell_B).CurrentRegion) > 0 Then
Application.Goto BK2.Worksheets(Sheet_B).Range(Cell_B)
If MsgBox("データがあるようです。データを削除してよろしいですか?", vbOKCancel) = vbOK Then
BK2.Worksheets(Sheet_B).Range(Cell_B).CurrentRegion.ClearContents
Else
GoTo Quit
End If
End If
'領域をコピー
With BK1.Worksheets(Sheet_A).AutoFilter.Range
.Offset(1).Resize(.Rows.Count - 1).Copy _
BK2.Worksheets(Sheet_B).Range(Cell_B)
End With
'' 以下の方が一般的です。
' With BK1.Worksheets(SHEET_A).Range(CELL_A).CurrentRegion
' .Offset(1).Resize(.Rows.Count - 1).Copy _
' BK2.Worksheets(SHEET_B).Range(CELL_B)
' End With
Application.Goto BK2.Worksheets(Sheet_B).Range(Cell_B)
MsgBox "コピー完了しました。" & vbCrLf & "保存は、手動で行ってください。" & vbCrLf & "終了!"
Quit:
If Err.Number > 0 Then
MsgBox Err.Number & ": " & Err.Description
End If
Set BK1 = Nothing: Set BK2 = Nothing
End Sub
'--------------------------------------------------
お礼
何度も何度もありがとうございました。 本当に親切にして頂いて感激です。 設計して頂いたコードを使わせて頂きます。 m(_ _)m