プロが教える店舗&オフィスのセキュリティ対策術

ある表(A3:X5000とします。)で、フィルタで絞り込んだ状態の表(Aの先頭行:Xの最終行)を選択し、別のシートにコピーする方法を探しております。

表があるシートを”作業”、コピー先のシートを”データ”とします。
”データ”に上記内容のボタンを作り、それを押すと”作業”からコピーして”データ”のA2にペーストするようにしたいのですが、なかなかうまくいきません。
ペーストしたいのは、表の値です。
先人様が作った同じようながあったのでそれを拾ってなんだかんだやってみたのですが、
どうやってもエラー400になってしまい困っております。
以下がそのマクロです。
Public Sub テスト()

Dim gyouue As String
Dim gyoushita As String
Dim sentou As String
Dim saikoubi As String
Dim hani As String

Sheets("作業").Select
Range("A4").Select

Selection.End(xlDown).Select
gyouue = ActiveCell.Row
sentou = "A" & gyouue

'Selection.End(xlDown).Select
Range("A65536").Select(←私はexcel2010なのですが、拾った先が2003なのでそのままにしてます)
Selection.End(xlUp).Select
gyoushita = ActiveCell.Row
saikoubi = "X" & gyoushita

hani = sentou & ":" & saikoubi

Range(hani).Select
Selection.Copy
Sheets("データ").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

ちなみに、私はVBA初心者です。
上記内容は調べながらやったので、”なんとなく”わかる程度です。
詳しい方のお力添えを頂ければ幸いです。
拙い文章で私がやりたいことが伝わっているかどうか不安ではありますが、
もっと必要な情報がありましたら、都度返信致しますので、
宜しくお願い致します。

A 回答 (2件)

No.1です。



もしかしてシートモジュールにしていませんか?

前回のコードの場合オートフィルタの設定をしていないとエラーになりますので、
コードを少し変えてみました。
↓のコードを標準モジュールにしてみてください。

Sub Sample2()
Dim lastRow1 As Long, lastRow2 As Long
Dim myRng As Range, wS As Worksheet
Set wS = Worksheets("データ")
With Worksheets("作業")
If .AutoFilterMode Then '//追加★//
If .AutoFilter.FilterMode Then
lastRow2 = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow2 > 1 Then
Range(wS.Cells(2, "A"), wS.Cells(lastRow2, "X")).ClearContents
End If
lastRow1 = .Cells(Rows.Count, "A").End(xlUp).Row
Set myRng = Range(.Cells(4, "A"), .Cells(lastRow1, "X"))
myRng.SpecialCells(xlCellTypeVisible).Copy wS.Range("A2")
Else
MsgBox "絞り込まれていません"
End If
Else
MsgBox "オートフィルタが設定されていません"
End If
End With
End Sub

今度はどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

おおおお!できました!
シートモジュールと標準モジュールの違いすらわかってませんでした…
まだまだ勉強が足りませんね^^;

ありがとうございます!
ほんとうに助かりました!

お礼日時:2017/05/29 12:17

こんばんは!



まず、変数の宣言に間違いがあります。
String型の「文字列型」の宣言を整数型の「Integer」または長整数型の「Long」にしなければならないと思います。

他の方がお考えになったコードに手を加えるのは好きではないので
勝手にコードを考えてみました。
標準モジュールです。

Sub Sample1()
Dim lastRow1 As Long, lastRow2 As Long
Dim myRng As Range, wS As Worksheet
Set wS = Worksheets("データ")
With Worksheets("作業")
If .AutoFilter.FilterMode Then
lastRow2 = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow2 > 1 Then
Range(wS.Cells(2, "A"), wS.Cells(lastRow2, "X")).ClearContents
End If
lastRow1 = .Cells(Rows.Count, "A").End(xlUp).Row
Set myRng = Range(.Cells(4, "A"), .Cells(lastRow1, "X"))
myRng.SpecialCells(xlCellTypeVisible).Copy wS.Range("A2")
End If
End With
End Sub

※ オートフィルタで絞り込まれていない(フィルタがかかっていない)と何も変化がありません。
(単にオートフィルタの設定だけでは変化なし)
こんな感じで良いのでしょうか?

※ お示しのコードを詳しく見てないので
間違っていたらごめんなさい。m(_ _)m
    • good
    • 0
この回答へのお礼

できませんでした。。
いただいたものまるっとコピペで使ってみましたが、エラー400になりました。
フィルタはかかっています。
何がいけないんでしょう。。

お礼日時:2017/05/26 11:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!