[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの体裁について』(川野鮎太郎)
みなさん、お疲れ様です。
標記の件ですが、マクロを記述するのは少しぐらいは出来るのですが、 なにぶん見よう見まねでやってるものですから、自分でも恥ずかしいぐらい体裁が悪く 不細工な感じになってしまいます。 みなさんのマクロを見ると、非常にスマートな感じがするのですが、 段落(階段状?)と言っていいのか判りませんが、どこでどんな風にするのか 基本的なことを教えていただけませんでしょうか。 仮に以下のようなマクロがあるとして、どんな風に体裁を整えるほうが良いのでしょうか。
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.