[[20040628191821]] 『マクロの体裁について』(川野鮎太郎) ページの最後に飛ぶ

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

 

『マクロの体裁について』(川野鮎太郎)
 みなさん、お疲れ様です。

 標記の件ですが、マクロを記述するのは少しぐらいは出来るのですが、
 なにぶん見よう見まねでやってるものですから、自分でも恥ずかしいぐらい体裁が悪く
 不細工な感じになってしまいます。
 みなさんのマクロを見ると、非常にスマートな感じがするのですが、
 段落(階段状?)と言っていいのか判りませんが、どこでどんな風にするのか
 基本的なことを教えていただけませんでしょうか。
 仮に以下のようなマクロがあるとして、どんな風に体裁を整えるほうが良いのでしょうか。

 Sub test()
 SN = ActiveSheet.Name
    Sheets(SN).Select
    Sheets(SN).Copy Before:=Sheets(2)
        Columns("A:BM").Select
            Selection.Copy
        Columns("BO:BO").Select
            ActiveSheet.Paste
    Application.CutCopyMode = False
        Selection.Clear

 For i = 0 To 3
    row1 = 41 * 4 * i
        Range(Cells(41 * 4 + row1 + 1, 1), Cells(41 * 7 + 41 * 4 * i, 65)).Select
            Selection.Cut
    Cells(row1 + 1, 67).Select
        ActiveSheet.Paste
    Rows(41 * 4 + row1 + 1 & ":" & 41 * 7 + row1).Select
        Selection.Delete Shift:=xlUp
 Next i
 End Sub
 (川野鮎太郎)


 このような[字下げ]を[インデント]と言います。
 一般的には↓こんな感じでしょうか?(kazu)

 Sub test()
    SN = ActiveSheet.Name
    Sheets(SN).Select
    Sheets(SN).Copy Before:=Sheets(2)
    Columns("A:BM").Select
    Selection.Copy
    Columns("BO:BO").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Clear
    For i = 0 To 3
        row1 = 41 * 4 * i
        Range(Cells(41 * 4 + row1 + 1, 1), _
            Cells(41 * 7 + 41 * 4 * i, 65)).Select
        Selection.Cut
        Cells(row1 + 1, 67).Select
        ActiveSheet.Paste
        Rows(41 * 4 + row1 + 1 & ":" & 41 * 7 + row1).Select
        Selection.Delete Shift:=xlUp
     Next i
 End Sub

 おおおお、校長先生自らの回答ありがとうございますm(_ _)m
 なるほど、インデントですね。_〆\(..;) メモメモ
 そこでそのインデントする場合の決まりごとというか、何かありますでしょうか。

 For i 
   For ii
        こんな感じになるのは、なんとなくわかるのですが、
   Next ii
 Next i

 何度も申し訳ございません。
 (川野鮎太郎)


 こんばんは。
とくに決め事はないと思いますが、
私の場合は
 
IF〜End If や For 〜 Nextなどをいくつも「入れ子」にする場合は
最初のキーワードとシメのキーワードを見失ってしまうととんでもな
いことになるので、それだけは気に注意しています。
 
あとは記録なんかするとやたらと引数がたくさんでてくる場合がありますが、
    Range("A1:A9").Select
    Selection.Find(What:="1", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , MatchByte:=False).Activate
 
こんなときは引数をあとで編集しやすいように同じレベルでそろえるのは
私の癖です。
    Range("A1:A9").Select
    Selection.Find(What:="1", _
                   After:=ActiveCell, _
                   LookIn:=xlValues, _
                   LookAt:=xlPart, _
                   SearchOrder:=xlByRows, _
                   SearchDirection:=xlNext, _
                   MatchCase:=False, _
                   MatchByte:=False _
                   ).Activate
 
川野鮎太郎さんのサンプルの場合は、インデントをするよりも
処理をするオブジェクトの切替のときに行空けしたほうが
何に対してどんな処理をしているのかわかりやすいかもしれません。
 Sub test()
     SN = ActiveSheet.Name
         Sheets(SN).Select
         Sheets(SN).Copy Before:=Sheets(2)

         Columns("A:BM").Select
         Selection.Copy

         Columns("BO:BO").Select
         ActiveSheet.Paste
         Application.CutCopyMode = False
         Selection.Clear

     For i = 0 To 3
         row1 = 41 * 4 * i
         Range(Cells(41 * 4 + row1 + 1, 1), Cells(41 * 7 + 41 * 4 * i, 65)).Select
         Selection.Cut

         Cells(row1 + 1, 67).Select
         ActiveSheet.Paste

         Rows(41 * 4 + row1 + 1 & ":" & 41 * 7 + row1).Select
         Selection.Delete Shift:=xlUp
     Next i
 End Sub
(KAMIYA)

 早速の回答ありがとうございます。
 いつもKAMIYAさんのマクロなど拝見して、うーんとうなりながら
 何でこんなにスマートなんだろって感心してました(^_^A;
 上の記述にしても、見た目が全然違いますよね(^_^A;
 目からウロコ状態です。
 大変参考になりました。
 今後もよろしくお願いします。
 (川野鮎太郎)


 >仮に以下のようなマクロがあるとして 
 サンプルのコードなので、あえて書くこともないかもしれませんが、
 初心者の方のために一応書いておきます。 

 Select や Activate が多用されていると、
 コードが冗長になって、見た目が悪くなります。
 (当然、不要な選択行為の分だけ、処理も遅くなります)

 変数を宣言していないのも、
 コードの可読性が低下するので良くないです。
 (予想外の動作や、エラーの原因、デバッグ効率の低下にもなります)

  (INA)

 回答ありがとうございます。
 INAさんのおっしゃるとおりなんですよね。
 SelectやActivateの多用は処理が遅くなるのは判ってても、どこが不要なのかが
 今ひとつ理解できていないんですよね(^_^A;
 以下のように修正してみましたけど、まだ簡略化できるところはありますでしょうか。

 Option Explicit
 Sub test1()

 Dim SN As String
     SN = ActiveSheet.Name
         Sheets(SN).Copy Before:=Sheets(2)

         Columns("A:BM").Copy

         Columns("BO:BO").Select
         ActiveSheet.Paste
         Application.CutCopyMode = False
         Selection.Clear

     For i = 0 To 3
         row1 = 41 * 4 * i
         Range(Cells(41 * 4 + row1 + 1, 1), Cells(41 * 7 + 41 * 4 * i, 65)).Cut

         Cells(row1 + 1, 67).Select
         ActiveSheet.Paste

         Rows(41 * 4 + row1 + 1 & ":" & 41 * 7 + row1).Delete Shift:=xlUp
     Next i
 End Sub
 (川野鮎太郎)


 Copy や Cut は、引数に Destination として、
 貼り付け先を指定できますので、Selectを減らすことが出来ます。

 Sub test1改()
 Dim i As Long, row1 As Long

        ActiveSheet.Copy Before:=Sheets(2)
        Columns("A:BM").Copy Destination:=Columns("BO")
        Columns("BO").Clear

    For i = 0 To 3
        row1 = 41 * 4 * i

        Range(Cells(41 * 4 + row1 + 1, 1), Cells(41 * 7 + 41 * 4 * i, 65)).Cut _
        Destination:=Cells(row1 + 1, 67)

        Rows(41 * 4 + row1 + 1 & ":" & 41 * 7 + row1).Delete Shift:=xlUp
    Next i

 End Sub 

   (INA)

 ちなみに私はSelectを思うように省略できるまでにはかるく
2年間はかかっています。だから、
のんびりモードの人の意見だと思っていただきたいのですが、
初心者のうちは「ステップイン」でデバッグするとき
Select 、 Activate あったほうがオブジェクトの取得が
うまく出来ているかどうか目で見て確認できるのでいい場合
もあるのですよ。
冗長には冗長なりのメリットというか・・・。
逆に処理速度が目に見えて遅くなるようなマクロを初心者の
方がそうそう組めるとは思えませんし・・・。
 
Select、Activateを略するのはオブジェクトの取得を思うよ
うに出来るようになってからでもいいと思いますよ。
そのうち、Selectだと画面がちらつくので「どうしよう」。
必要に迫られてからやってもいいのではないかな、と思っています。
(KAMIYA)

 INAさんへの回答中に衝突してしまいました。
 __________________________
 早々の回答ありがとうございます。(o_ _)o))
 なるほど、随分簡単になるものですね(^_^A;
 大変勉強になりました。今後ともご指導お願いします。
 (川野鮎太郎) ここまでINAさんへ
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

 確かに作っている途中では、ステップインして確認しながらやるので、KAMIYAさんの
 おっしゃることも必要ですね^^
 私の場合は、動くのが楽しいときもありそのまま使うこともあれば、
 Application.ScreenUpdating = False を入れて、
 一気にやったりもしています。
 今回の場合は、自分の勉強のためにINAさんの回答大変参考になりました。^^
 (川野鮎太郎)

コメント返信:

[ 一覧(最新更新順) ]


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