マクロを自分で組む知識がないので、マクロの記録で強引に
やりたい操作を実行できるようにしました。
シート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

このQ&Aに関連する最新のQ&A

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
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

QExcel でシート間の重複データ(Sheet1のA=Sheet2のA かつ Sheet1のB=Sheet2のB)

Excel2000です。

Sheet1のA列・B列・C列・・・にデータが入っています。
Sheet2のA列・B列・C列・・・にデータが入っています。

Sheet1のA列とSheet2のA列は、似たようなデータが入っています。
Sheet1のB列とSheet2のB列も、同様です。
C列以降のデータは、シート間で全然関係ありません。

Sheet1の行データ(A列・B列)が、Sheet2(A列・B列)にも存在しているかどうか、
を知るには、どうすればよいですか。
C列以降の列のデータは、比較する際に使いません。

つまり、
Sheet1のA = Sheet2のA
かつ
Sheet1のB = Sheet2のB
であるような行を知りたいのですが、

どうすればよいのでしょうか。

Aベストアンサー

Sheet1、Sheet2 ともに空いている列に =A1&B1 のような連結データを作り、Matchなどで比較するとか、、、

Sheet1 の E1 =A1&B1
Sheet2 の E1 =A1&B1
Sheet1 の F1 =MATCH(E1,Sheet2!E:E,0)

QRange("AQ" & TR).Formula =の右辺に書く式を教えてください

よろしくお願いします
いつもgooの皆さんには大変お世話になっております
お陰様で全く知識ゼロだったマクロが少しですが書けるようになりました
エクセルも大分わかってきました
win8.1でエクセルは2013です

式の中身です(日本語表示)
もしも、AN42の値が1で、なおかつ、M42とO42とAO42とAP42の値がすべて同じなら1
そうでなければ0

教えていただきたい事
上記の内容の式を
Range("AQ" & TR).Formula =
の右側に書くにはどう書いたらよいでしょうか?
TRは行番号で42です

以上です
うまく説明できなくて迷惑をかけるかもしれませんが
よろしくお願いします

Aベストアンサー

当方、初心者のくせにメッセージ失礼いたします。

セルAQ42にコチラの関数を入れました。
=IF(AND(AN42=1,M42=O42,O42=AP42),1,0)

こちらをVBAに直すとこうなりました。
"=IF(AND(RC[-3]=1,RC[-30]=RC[-28],RC[-28]=RC[-1]),1,0)"

マクロに詳しい方ならもっと綺麗なVBAを記載してくださるかと思います。。。

QRange("BI" & TR).Formula = に続く式の書き方を教えてください

よろしくお願いします。いつもgooの皆さんには大変お世話になっております
win8.1でエクセルは2013です

Private Sub Worksheet_Change(ByVal Target As Range)内のマクロです

マクロでセルに式を書き込みたいのですがエラーになってしまいます
一度使った書き方はメモを見てすぐかけるのですが
初めてのスタイルだと書けません
&でつなげるのに規則がありますが、頭で整理できていません

TRはTarget.Rowのことで宣言済みです
Dim TR As Long
TR = Target.Row

書きたいのは
BKのTRからBTのTRまでの合計を求めてエラーならERRと表示する
です
以下をどう直せばよいでしょうか?
教えてください

Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR )",""ERR"")"

Aベストアンサー

こんばんは。

Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR )",""ERR"")"
   ↓
Range("BI" & TR).Formula = "=IFERROR(SUM(BK" & TR & ": BT" & TR & "),""ERR"")"

後ろのTRの後の「 & "」 が抜けているようです。

本格的なマクロするなら、数式を入れるのではなくて、SUMの値を変数に入れたほうがよいですね。
その値は、Variant 型にしておけば、エラー値も取れますから、エラーになったら、ERRの文字を代入すれば、Formula で数式を入れる必要はありませんね。

QRange("K" & TR).Formula = で、セルにマクロで式を書きたいのですが

よろしくお願いします。いつもgooの皆さんには大変お世話になっています
エクセルは2013です

わけあって、セルにマクロで式を書いています
例えば TRは行を表す変数ですが
Range("K" & TR).Formula = "=IFERROR(AY" & TR & ","""")" と書いたマクロの結果は
=IFERROR(AY43,"") という式がRange("K" & TR) に書かれます

それでは、いま、マクロで下記のように書いているコード(TRは行を表す変数です)
Range("Z" & i) = Range("Z" & i - 1) - Range("AG" & TR) * 10000 は
Range("Z" & i).Formula = 
で書く場合、=の右側をどう書いたら良いでしょうか

色々とやってみたのですが狙った式になりません

この場合 変数 i を使っているので、もしかしたら、そもそも無理なことでしょうか

うまく説明できていませんがよろしくお願いします

Aベストアンサー

No.1です。申し訳ありません大ボケな回答をしていましました。

要するに↓ってことですよね? また勘違いしていたらスミマセン。

Range("Z" & i).Formula = "=Z" & i - 1 & "-AG" & TR & " * 10000"


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報