アプリ版:「スタンプのみでお礼する」機能のリリースについて

マクロを自分で組む知識がないので、マクロの記録で強引に
やりたい操作を実行できるようにしました。
シート2の4行目に空行を挿入してから、
シート1のA3~AK3を、シート2の4行目、シート3,4の3行目に値の貼付けをして、
シート1内の複数のセルを空白にする動作です。

出来上がったマクロを見ると130行以上あったので、
不要な部分や省略できる部分の削除を調べながらやってみますが、
どうしてもエラーが起きます。
エラーが起きても起きなくても、何が良くて何が悪いかわからないので、
初心者向きの正解を教えていただきたいです。
以下に一部省略した130行程を貼付けますのでお願いします!

Sub 登録完了ボタン()
'
' 登録完了ボタン Macro
'

'
Application.ScreenUpdating = False
Sheets("会員情報一覧").Select
Rows("4:4").Select
Selection.Insert Shift:=xlDown
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 3
          ↓2~33まで続く。
ActiveWindow.ScrollColumn = 32
ActiveWindow.ScrollColumn = 33
Range("AL5:DN5").Select
Selection.Copy
Range("AL4").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWindow.ScrollColumn = 31
ActiveWindow.ScrollColumn = 30
          ↓31~1まで続く。
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 1
Range("A6").Select
Sheets("顧客情報入力").Select
Range("A3:AK3").Select
Selection.Copy
Sheets("会員情報一覧").Select
Range("A4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A4").Select
Sheets("個別情報(閲覧・印刷)").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("B7").Select
Sheets("配布(メール送信・印刷)").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("B9").Select
Sheets("顧客情報入力").Select
Application.CutCopyMode = False
Range("H6:I7").Select
Selection.ClearContents
ActiveWindow.SmallScroll Down:=9
Range("C18:C20").Select
Selection.ClearContents
ActiveWindow.SmallScroll Down:=6
Range("C24:D24").Select
Selection.ClearContents
Range("C26:F38").Select
Selection.ClearContents
ActiveWindow.SmallScroll Down:=9
Range("D39:F42").Select
Selection.ClearContents
Range("C39").Select
ActiveCell.FormulaR1C1 = "-"
Range("C40").Select
ActiveCell.FormulaR1C1 = "-"
Range("C41").Select
ActiveCell.FormulaR1C1 = "-"
Range("C42").Select
ActiveCell.FormulaR1C1 = "-"
Range("C43").Select
ActiveCell.FormulaR1C1 = "-"
Range("C44").Select
ActiveWindow.SmallScroll Down:=-36
Range("F14").Select
End Sub

よろしくお願いします。

質問者からの補足コメント

  • 回答ありがとうございます!

    素人目にも、 ActiveWindow.ScrollColumnの連続は省略できそうだと思い、
    調べながら書き換えましたが、構文エラーやプロパティの使い方が不正です、
    と出てしまいました。
    基本的な構文の作り方がなっていないせいだと思い、正解を見ながら解釈したくなったので、
    質問させていただきました。

    二つの謎操作(コピペ操作)と(セルクリア、「-」入力)は、添付した図のとおりです。
    見えますでしょうか?

    ちょこちょこセルを選択しているのは、4行目くらいまで非表示にするため、
    それ以下のセルを一応選択したためです。

    教えていただいたやり方で、1行づつ理解しながら追ってみたいと思います。
    時間がかかると思いますが、終わったら、また補足か御礼いたしますので、
    よろしくお願いします!

    「マクロの整理、正解を教えてください。」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2017/04/17 14:39
  • うれしい

    おはようございます。
    教えていただいたマクロと旧マクロを見比べながら、1行づつ解読しました。
    表が変更になったので、それに合わせてマクロも変えましたが、
    無事に実行できました!

    ”-”の繰り返し入力の省略もしてみようと思いやってみました。
    Dim i
    For i = 1 To 5
    Range("c42:c46").FormulaR1C1 = "-"
    Next i
    Range("F7").Select

    バッチリ正解はこれ!とは、自分ではわからないのですが、
    これでもできました!チグハグですかね??(汗

    正解を示していただき、とてもわかりやすく勉強できました!
    ありがとうございました!

      補足日時:2017/04/18 08:58

A 回答 (2件)

回答者に丸投げする質問じゃないのに好感を感じましたので、またおせっかいさせていただきます。



補足にあった、c42:c46の範囲に"-"を書き込むマクロだと、
「c42:c46の範囲に"-"を書き込む」を5回繰り返しているだけなんです。

Range("c42:c46").FormulaR1C1 = "-"
だけで目的の処理はできちゃってて、無駄に5回繰り返してるのね。

もしForを使うとしたら

For i = 0 To 4
Range("c" & 42 + i) = "-"
Next i

こんな感じ。
For を1じゃなく0からにしてるのは、
41にi(1~5)を足すより、
範囲の最初のセルアドレスの数値42にi(0~4)を足したほうが、
式を理解しやすいと思ったから。
この辺はFor~Next間の処理内容や、好みもありますが。

こういう部分での個性(好み)が出るから、他人の作ったものに手を加えるのが面倒くさかったりします。(笑)

Range("F7").Selectは意図的なセル移動?
マクロ記録のゴミならな消すようにしていきましょう。

前の回答で敢えて書かなかった部分ですが…
複数範囲のクリア部分は、範囲をカンマで続けて書き並べ、一度に処理出来ます。
Range("H6:I7,C18:C20,C24:D24,C26:F38,D39:F42").ClearContents


質問にかかれていたもと、私の回答に書いたものの動作ではエラーはでませんでしたので、
エラーが出た時や、「もっとシンプルな書き方にできないか」と疑問を持たれた時に
再質問されると良いでしょう。

「質問&回答」じゃなく、個人レクチャーみたいになっちゃうので。
がんばってください!
    • good
    • 0
この回答へのお礼

再度の詳しい回答ありがとうございました!
私も補足に質問を上乗せするのが気になりましたが、
つい質問を締め切らずに期待していました。
とても分かりやすく、勉強になりました!
がんばります!ありがとうございました!

お礼日時:2017/04/18 10:53

セルの移動操作もマクロに含まれているので、それは全部削除可能です。


質問だとシート1,2…と書いてますがシート名指定で良いのですよね?

いきなり、
Range("AL5:DN5")をコピーしてAL4に貼り付ける謎の操作が登場してますが…。

移動操作の記録はほぼ不要。
ActiveWindow.ScrollColumn = 3

コピペ後のセル選択も不要。
(だけど、選択セルがあちこちになっちゃってるのでA1セルを選択させてます)

Select直後のSelectionも省略可能。
「この範囲を選択」→「選択した範囲に処理」 という流れを、
「この範囲に処理」と直接処理するイメージ。

Range("C39").Select
ActiveCell.FormulaR1C1 = "-"

これも、
「C39セルを選択」→「アクティブセル(選択したセル)に"-"を書き込む」を
「C39セルに"-"を書き込む」と短縮しています。

『Application.ScreenUpdating = False』
を書くと、処理中の動作が画面に表示されないので、
動作検証の際は頭に「'」を付けてコメントアウトすると、
どこでまで処理が進んでいるかわかりやすいです。
(下記のマクロにでは「'」付けてます)

マクロの画面で。[F8]を押せば、1行ずつ実行してくれるので、
以上な挙動がわかりやすいです。
最初から[F8]で動作を見続けるのも大変なので、
疑わしい行で[F9]を押すとブレークポイントが設定されます。
マクロを実行すると、ブレークポイントで一度停止します。
そこから[F8]で1行ずつ追うのが良いでしょう。
・・・この辺の機能も利用しましょう。

で、整理してみたのがこちら。
--------
Sub 登録完了ボタン()
'Application.ScreenUpdating = False
Sheets("会員情報一覧").Select
'行挿入
Rows("4:4").Select
Selection.Insert Shift:=xlDown

'謎操作(コピペ操作)
Range("AL5:DN5").Copy
Range("AL4").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

Sheets("顧客情報入力").Select
Range("A3:AK3").Copy
Sheets("会員情報一覧").Select
Range("A4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select '貼り付け後にA1を選択
Sheets("個別情報(閲覧・印刷)").Select
Range("A3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select '貼り付け後にA1を選択
Sheets("配布(メール送信・印刷)").Select
Range("A3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select '貼り付け後にA1を選択

'謎操作(セルクリア、「-」入力)
Sheets("顧客情報入力").Select
Application.CutCopyMode = False
Range("H6:I7").ClearContents
Range("C18:C20").ClearContents
Range("C24:D24").ClearContents
Range("C26:F38").ClearContents
Range("D39:F42").ClearContents
Range("C39") = "-"
Range("C40") = "-"
Range("C41") = "-"
Range("C42") = "-"
Range("C43") = "-"
Range("A1").Select '貼り付け後にA1を選択
End Sub
--------
最後の方の、複数セルに同じ処理をする部分もまとめられますが、
質問者様のスキルだと、このまま分けていた方が認識しやすと思い、
そのままにしています。

さて・・・
質問に情報無かったのですが、

どんなエラーが出てるの?

そこ大事。
取り敢えず、上に書いたようなマクロ検証操作をしながら、
エラー元を探ってみて下さい。
この回答への補足あり
    • good
    • 1

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