ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel VBA 製作所コミュのオートフィルタで抽出したデータについて。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして☆マクロ初心者です。
マクロを作ってて壁にぶち当たってしまい途方に暮れています。
皆様に力を貸していただきたいと思いトピを立てました。

オートフィルタで抽出したデータがあります。
そのデータをマクロを使って、抽出した行だけコピーして隣のシートに貼り付けるというものにしました。ここまでは良かったのです。

本来抽出されたデータは1行だけでその1行を隣のシートに貼り付けるのですが、オートフィルタで抽出せずにマクロを実行したら抽出前の全データが隣のシートに貼り付けられてしまいます。この、「抽出せずにマクロを実行する」を防止したいのです。

そこで考えたのが、このマクロを実行する前にif〜thenを使って、
抽出した行が1行だけならコピーして隣のシートに貼り付ける。
そうじゃなかったら(1行より多かったら)「ちゃんと選択してね」というメッセージボックスを出すということ。

でも、うまくいかないんです。抽出した行が1行のときでも、2行以上のときでもメッセージボックスが出てきてしまいます。
If〜Thenの条件の使い方がおかしいのか、抽出された行を読み取ってくれないのか・・・わかりません。
「抽出した行をコピーして隣のシートに貼り付ける」というマクロも色々なネットを読みながら作ってみたので、動きはしますがその中身が間違ってるのか・・・。私にはお手上げ状態になってきてしまいました。
どなたかどうすればいいのか教えて下さい。

一応私が作ったものを貼り付けてみます。

Sub メッセージボックス出す()

'
' メッセージボックス出す Macro

'

'
Worksheets("sheet1").Activate
If Worksheets("sheet1").Range("J65536").End(xlUp).Row = 1 Then
Columns("B:G").EntireColumn.Hidden = False
Selection.EntireColumn.Hidden = False
Range("C12:K25").Select
Selection.Copy
Sheets("Sheet2").Select
Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
ActiveCell.Offset(1, 0).Range("A1").Select
Sheets("Sheet1").Select
ActiveSheet.Range("$G$11:$K$25").AutoFilter Field:=5
ActiveSheet.Range("$G$11:$K$25").AutoFilter Field:=4
ActiveSheet.Range("$G$11:$K$25").AutoFilter Field:=3
ActiveSheet.Range("$G$11:$K$25").AutoFilter Field:=2
ActiveSheet.Range("$G$11:$K$25").AutoFilter Field:=1
ActiveCell.Columns("A:D").EntireColumn.Select
Selection.EntireColumn.Hidden = True
ActiveCell.Offset(4, 4).Range("A1").Select
Else
MsgBox "ちゃんと選択してね!"
End If
End Sub

長文で申し訳ありませんが、よろしくお願いします。

写真左 元のデータC〜F列は非表示状態になっています。
写真中 オートフィルタで抽出した状態。本来J列で1行に抽出されます。
写真右 隣のシート抽出したデータを貼り付けた状態。非表示になっていたC〜F列が表示されています。

コメント(2)

こんにちは たいらです。
正直、全体的にすっきりできていないようですが、質問部分だけ回答させて頂きます。

> If Worksheets("sheet1").Range("J65536").End(xlUp).Row = 1 Then
この意味が理解できていないようです。

〜.Row の意味ですが【行番号】の値が返ってきます。
添付されている例ですと、17行目が抽出されているので【17】です。
よって、〜.Rowsで【1】になることはありえないですね。

以下のようにすれば、できると思います。
if Range("J12:J25").SpecialCells(xlCellTypeVisible).count = 1 then

これは表示されている行(抽出されている行)のJ列のセル数を取得しています。
ただ、全く抽出されていない場合はエラーになります。
もし、0行の可能性があるのなら、タイトル行も含んでセル数を取得した方が安全かも知れません。
if Range("J11:J25").SpecialCells(xlCellTypeVisible).count = 2 then

マクロを覚えるのは大変だと思いますが、命令(プロパティ・メソッド等)の意味やテスト方法をきちんと理解することで技術レベルが上がると思います。

頑張ってください。
たいらさん
ありがとうございましたわーい(嬉しい顔)わーい(嬉しい顔)わーい(嬉しい顔)
ちゃんとできましたよ〜〜〜exclamation ×2
うれしいです。ほんと教えてくださってありがとうございました。
「.Count」を使えばいいのですねあせあせ(飛び散る汗)目からうろこ状態です。
やはり、内容はできていないんですね。
これから猛勉強です。ありがとうございました☆

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel VBA 製作所 更新情報

Excel VBA 製作所のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。