[[20060327162430]] 『またまた転記』(ばんばん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『またまた転記』(ばんばん)
 いつもお世話になっております。
先日は[[20060220171324]]『VBAで別表へコピー』では大変お世話になりましたペコリ(o_ _)o))
なんとかマクロをそれなりに(?)作り上げることができ、活用中です。

 早速ですが、またもや転記で質問があります。
下記のコードを作成したのですが、思うように動きません。
シートサトシもロケット団もレイアウトは同じです。
H列に“必殺”と記入されているものだけを抽出用シートに転記するのですが、
作成途中、サトシだけでステップイン(F8)で一行ずつ実行していったら、
うまく抽出されたので、それをコピーしシート名をサトシ→ロケット団へ変更しました。
当然、うまくいくと思ったのですが、コピーされる範囲がD3だけで、貼り付けられたセルは
B4でした。
どこに不具合があるのか検討がつかないのですが、ご教授頂けるでしょうか?
抽出の順序はどちらからでもいいのですが、後から抽出する方は、先に抽出した
行の最後に付け足すような形で考えています。
1行が多段になっており、B列は多段のうち1段目のみ記入がされています。

 Sub FJ()

 Worksheets("抽出用").Range("B4:U65536").End(xlUp).ClearContents
 With Worksheets("サトシ")
     If .AutoFilterMode = False Then
     .Rows(3).AutoFilter
     End If
     .Columns(8).AutoFilter field:=8, Criteria1:="必殺"
         If .Range("U65536").End(xlUp).Row > 1 Then
         Worksheets("サトシ").Range("D4:W65536").End(xlUp).Copy
         Worksheets("抽出用").Range("B4").PasteSpecial xlValues
         End If 
 End With
 With Worksheets("ロケット団")
     If .AutoFilterMode = False Then
     .Rows(3).AutoFilter
     End If
     .Columns(8).AutoFilter field:=8, Criteria1:="必殺"
         If .Range("U65536").End(xlUp).Row > 1 Then
         Worksheets("ロケット団").Range("D4:W65536").End(xlUp).Copy
         Worksheets("抽出用").Range("B4").End(xlUp).PasteSpecial xlValues
         End If
 End With
 End Sub

 いつも、ご面倒なお願いばかりで申し訳ないのですが、どうかよろしくお願い致します。


 Endプロパティの使い方がよく分かりません。
あと、SpecialCellsメソッドがありませんが、抽出されていますか?
(ROUGE)

 お邪魔します〜

 >Worksheets("サトシ").Range("D4:W65536").End(xlUp).Copy
 の上に、
 Worksheets("サトシ").Range("D4:W65536").End(xlUp).Select
 Worksheets("サトシ").Range("D4:W65536").Select
 としてみると何処を選択しているかわかるかもしれませんね^^

 (キリキ)(〃⌒o⌒)b

 ROUGEさん、お返事ありがとうございます。
 >Endプロパティの使い方がよく分かりません。
と言う事なのですが、どの辺がでしょうか?
コードを書いてみたものの、記述の仕方が違っていると思います。
具体的にご指摘頂けると嬉しいのですが。

 キリキさん、いつも拝見させて頂いております。
お返事を頂いた
 >Worksheets("サトシ").Range("D4:W65536").End(xlUp).Select
 >Worksheets("サトシ").Range("D4:W65536").Select
ですが、早速試してみました。
確かに選択されている範囲はD4:W65536であっている様なのですが、なぜかコピーされるのは、
D3のみです。
どうしてそうなってしまうのかさっぱりです。

 お手数をおかけ致しますがよろしくお願い致します。
(ばんばん)


 σ(^o^;)は、お休み&携帯からですし、スラスラリン♪とコードを書くスキルもありませんが、上記の二つの違いはわかりました?
.END(xlup)の有無の違いです。
それがわかれば何か掴める気がします!
(キリキ)(〃⌒o⌒)b

 >Worksheets("サトシ").Range("D4:W65536").End(xlUp).Select
 >Worksheets("サトシ").Range("D4:W65536").Select
 それぞれの行でストップさせて結果を見てみましょう。
 (やっちん)

 あと、新規ブックを開いて、以下のことを自動記録してコードを確認してみて下さい。
A4、A5、B4、B5に何か入力して、A4:B6を選択した状態にする。
  
@Ctrl+↑
  
ACtrl+Shift+↑
  
(ROUGE)

 きりきさん、お休み中にお返事頂きありがとうございました。
やっちんさん、お返事ありがとうございました。
お二方にアドバイス頂いたように違いを見てみたのですが、
 >Worksheets("サトシ").Range("D4:W65536").Select
では、65536行までが範囲指定されていました。
 >Worksheets("サトシ").Range("D4:W65536").End(xlUp).Select
では、デバッグ中に.End(xlup)にポインタを合わせてみるとxlup=-4162と
出てきます。
 .Selectはわかるのですが、
.End(xlUp).Selectはどうしてマイナスになってしまうのでしょうか?
ご教授頂けたらお願い致します。

 ROUGEさん、いつもありがとうございます。
@は、    Range("A4:B6").Select
    Selection.End(xlUp).Select
となり、A4:B5までが範囲指定されました。
しかし、そのマクロを3度ほど繰り返し行うと、毎回違うセルが範囲指定されるのですが、なぜですか?
Aは、    Range("A4:B6").Select
    Range(Selection, Selection.End(xlUp)).Select
となり、A1が範囲指定されました。
基礎を知らないでマクロを使い始めたので、ご教授の皆さまにご迷惑をおかけしていますが、
よろしくお願い致します。
(ばんばん)


 おかしいですね(^^ゞ
@の結果と、Aの結果は反対ではありませんか?
(ROUGE)

 ROUGEさんお返事ありがとうございます。
@とAが分からなくなってしまったのでもう一度記録しなおしました。
@
Sub Macro11()
' @ctrl+↑
' Macro11 Macro
' マクロ記録日 : 2006/3/28  ユーザー名 : banban
'

'

    Range("A4:B5").Select
    Selection.End(xlUp).Select
End Sub
となり、A1のみ範囲選択されました。
A
Sub Macro10()
'
' Macro10 Macro
'Actrl+shift+↑
' マクロ記録日 : 2006/3/28  ユーザー名 : banban
'

'

    Range("A4:B6").Select
    Range(Selection, Selection.End(xlUp)).Select
End Sub
になりました。
そして、A1:B6までが範囲選択されました。
・・・さっきと結果がちなう<(; ^ ー^) ・・・
ご教授頂けるまでの間、いろんなサイトでセル範囲の取得方法などを読んでみました。
色々方法はあったのですが、今回のこの質問を理解したうえで、進めない事には、
この先も同じとこで躓きそうです。
宜しければ違いをお教え下さい。
 お手数ばかりで(どうしようもない質問ばかりで)すみませんがご教授下さい。
(ばんばん)

 要はEndプロパティで取得できるのはたった一つのセル範囲だけ、ということです。
基準となるセル範囲が複数セルでもそれは同じです。(左端上端セルが基準になるだけ)
矩形(四角形)範囲を取得する基本は対角にある二つのセルを取得することです。
複数セル取得した状態からの範囲取得は(初心の方には)結果がわかりにくいかも。
「D4を左上とする、W列のデータの入力されたセルまで」と考えてください。
 
Range(Range("D4"), [W列のリスト最下端セル])
 
[W列のリスト最下端セル]は(歯抜けのないリストなら)
W65536からCtrl+↑で取得できるセルになるはずです。
Range(Range("D4"), Range("W65536").End(xlUp))
 
正式に書くと
Worksheets("サトシ").Range(Worksheets("サトシ").Range("D4"), Worksheets("サトシ").Range("W65536").End(xlUp))
 
私は、上記の書き方が長ったらしい、と感じるので
Worksheets("サトシ").Range("D4:W" & [W列のリスト最下端セルの行番号])
とすることが多いのですが。
(みやほりん)(-_∂)b

 みやほりんさん
補足ありがとうございます<(__)>
  
σ(^-^ )が言いたかったのは、コードが分からないけどやってみたいこと、は、
一度自動記録してみるということでした。
これで結構解決することが多いと思いましたので・・・。
あとは応用して、コードを簡略化していけばいいのだと思います。
  
SpecialCellsメソッドについても同じで、
オートフィルタで抽出したあと、抽出していない範囲をコピーしているようでしたので
指摘致しました。
一度、オートフィルタをかけた状態で範囲を選択し、Alt+;(セミコロン)を押したもの
を自動記録してみて下さい。
(ROUGE)

 σ(^o^;)も、ROUGEさんの仰っている
 >一度自動記録してみる
 と言うのは大賛成!
 そして、
 >デバッグ中に.End(xlup)にポインタを合わせてみるとxlup=-4162と出てきます。
 と言うように、わからない場合は
 上記の様に、Select したり Msgbox を使用したりすると良いかもしれませんね〜♪ 

 個人的には、Resize が好きですかね〜♪
 Worksheets("サトシ").Range("D4").Resize(.Range("D" & Rows.Count).End(xlUp).Row, 20).Copy
 こんな感じ〜

 (キリキ)(〃⌒o⌒)b

 ( ・_・)/ネエネエ(〃⌒o⌒)b
キリキさ〜ん
 >Worksheets("サトシ").Range("D4").Resize(.Range("D" & Rows.Count).End(xlUp).Row, 20).Copy
 ここ1じゃないよ〜(・_・ )_/~~                 だからここ、ネ♪(・_・ )_/~~~
(ROUGE)

 >>Worksheets("サトシ").Range("D4").Resize(.Range("D" & Rows.Count).End(xlUp).Row, 20).Copy
 >ここ1じゃないよ〜(・_・ )_/~~                 だからここ、ネ♪(・_・ )_/~~~

 そやね・・・
 また、やっちまったい!!
 ROUGEさんに感謝〜☆

 ROUGEさん、そうするとこんな感じでしょうか?
 Worksheets("サトシ").Range("D4").Resize(.Range("H" & Rows.Count).End(xlUp).Row - 3, 20).Copy

 (キリキ)(;ToT)b

 そうですね!
(ROUGE)

 ROUGEさんありがとう〜♪

 ばんばんさん、スレお借りいたしました〜
 (キリキ)(〃⌒o⌒)b

 ROUGEさん、キリキさん、みやほりんさんお返事遅くなりました。
昨日の朝、スレッドを拝見してから今までマクロの記録・Endプロパティを勉強していました。
いろんなサイトを参考にしたり、お二方のスレを何度も読み返し、ROUGEさんにご指摘頂いたように、
マクロの記録を繰り返ししてみました。

 大分、時間が掛かりましたが(;^_^A アセアセ・・・
少し分かった気がします。
 >要はEndプロパティで取得できるのはたった一つのセル範囲だけ・・・
ようやく分かりました。
Range("D4:W65536").End(xlUp)と言う記述ではダメだったのですね。
私は、↑のコードを書けば、D4:W65536の間でデータがある範囲を取得できるものと思っていました。
初めはみやりほんさんのスレを読んでも、(・_・o)ン? (o・_・)ン? (o・_・o)ン?
って感じだったのですが、やっちんさん・ROUGEさんのスレを読み、
わかるまで何度も記録してみました。
(時折、みやほりんさんのスレを読み返しつつ、いろんなサイトを見つつ)
そしたら、ああ、みやほりんさんの言いたかったことはこういう事なのかなぁ。と・・・。
Endプロパティで取得できるのはたった一つのセル範囲だけなのに、私はDとWの二つの
セルを指定(?)していたんだなと・・・。

 ROUGEさんのスレッドも初めは(・_・o)ン? (o・_・)ン? (o・_・o)ン?でした。
でも、
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_100.html
を読んでみたら、
ROUGEさんが言わんとしていることも分かった気が。。。
Endプロパティではシート上の最終行を取得するので、オートフィルタで抽出された
最終行が取得されていなかった。と言うことでしょうか。

 後でキリキさんがご提示くださった↓はまだ意味を理解できていないので
これから勉強したいと思います。
 Worksheets("サトシ").Range("D4").Resize(.Range("D" & Rows.Count).End(xlUp).Row, 20).Copy

 これだけの事を理解するのに丸2日掛かってしまいました(;^_^A アセアセ・・・
この様子じゃ、マクロを自由に操れるようになるには相当な時間を費やさなければ
無理そうですね。
でも、この学校で教わった事は、今後の為にきちんと整理して、復習して、無駄にならないように
したいと思います。
勉強するのが嫌で就職をしたのですが(遠い昔の話ですが)、以来毎日が勉強です。
でも、学生時代と違って、今の方が理解してから先に進む勉強の仕方が身についた気がします。(今更ながら)

 また、キリキさんに書いて頂いたコードが理解できたら、書き込みます。
今回は本当にありがとうございました。
半ば理解できないとあきらめていたVBAがまた少し楽しくなってきました。
(ばんばん)


 ばんばんさん
ご自身で理解されたことは、必ず今後も覚えていきます。
視覚、聴覚に体験記憶が加わると、8割以上の確率で覚えると聞きます。
今回はEndプロパティの使い方をよく分かっていらっしゃらないんだろうな〜
と思い、敢えてあのような書き込みを致しました。
  
SpecialCellsメソッドについては、せっかくオートフィルタで抽出しているのに、
すべて選択してコピーしていたようなので、可視セルのみを選択(Alt+;)する
ようにとの思いで書きました。
コードで書くとこのようになると思います。
  
With Worksheets("サトシ")
.Range("D4:W" & .Range("W" & Rows.Count).End(xlUp).Row).SpecialCells(xlVisible).Select
End With
  
(ROUGE)


 ROUGEさん、おはようございます。
お返事ありがとうございました。
一応、確認なのですが・・・
今回、私がご教授の方に教わり、理解できた内容は間違ってないでしょうか?
(ばんばん)

 ちょっと気になったので。
 みやほりんさんが仰っているこれは理解できてますか?
 >要はEndプロパティで取得できるのはたった一つのセル範囲だけ、ということです。
 >基準となるセル範囲が複数セルでもそれは同じです。(左端上端セルが基準になるだけ)
                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 (やっちん)

 やっちんさま、おはようございます。

 >要はEndプロパティで取得できるのはたった一つのセル範囲だけ、ということです。
 >基準となるセル範囲が複数セルでもそれは同じです。(左端上端セルが基準になるだけ)
                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~についてですが、
うまく伝わると言いのですが。

 Endプロパティで取得できるのはたった一つのセル範囲だけ。
だから、Range("D4:W65536").End(xlUp)のような記述では最下端は取得できない。
複数セル範囲の最下端を取得する場合は、
Range(Range("D4"),Range(W65536).End(xlUp))と記述し
左上端D4を基点に、Wのデータがある最終端を(下から)取得しそこを終点とする。
と分けて記述しないとダメですよ。
って事ですよね。
・・・一応分かったつもりでいたのですが、違っていたら教えてください
…o(;-_-;)oドキドキ
(ばんばん)

 範囲指定に関しては、ばんばんさんが理解されている通りでいいと思います。
 私が気になったのは
 Range("D4:W65536").End(xlUp) と
 Range("D4").End(xlUp) が同じことだと理解されているのかな?
 というところです。

 >基準となるセル範囲が複数セルでもそれは同じです。(左端上端セルが基準になるだけ)
 (やっちん)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.