プロが教えるわが家の防犯対策術!

マクロについて、質問があります。初めて作りました。
ステップインも実行も問題なく出来るが、使っているうちにデバックエラーが頻発するようになる。デバックエラーで確認するとInsertの行で止まっている。
デバックを終了すると固まってしまい、タスクマネージャーでタスク終了するしかなくなってしまう。
デバック終了後時々、考え中で点滅しながらずっと考え中のままになってしまう時がある。
構文がまちがっているのでしょうか。20個程度のマクロ、条件付き書式・関数を多用している表の中に組み込んでいるマクロなので、パソコンの処理能力とか重いとかそういうことでしょうか。
どうしてこうなるのかさっぱりわかりません。
構文を記載いたします。どなたかアドバイスをお願いいたします。

「アクティブセルの行をコピーして下の行に挿入し、不必要なところを削除する。」

Sub CommandButton1_Click()

Dim rowno As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
rowno = ActiveCell.Row
Rows(rowno).EntireRow.Copy
Rows(rowno + 1).Insert
Rows(rowno + 1).Columns("I:O").ClearContents
Rows(rowno + 1).Columns("I").Select
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

A 回答 (4件)

私も少し考えてみました。



#1様の
Application.CutCopyMode = False を追記する。
は入れてみましたね。

まあ、私は、ActiveX コントロールには懲りていますから、使いません。
なお、ActiveX コントロールを起動中は割り込みが効かないはずですから、イベントではあっても、イベントの再帰の恐れはないはずです。
とはいうものの「20個程度のマクロ、条件付き書式・関数を多用」では、どこが原因とか、手元においてしばらく使ってみないとなんとも言えないと思うのです。

.Cellsの前の「.(ピリオド)」が抜けるとあらぬところを指しますからご注意を。

'//
Sub CommandButton1_Click()
Application.Calculation = xlCalculationManual
With ActiveCell.EntireRow
 .Copy
 .Offset(1).Insert
 .Cells(1, "I").Resize(, 8).ClearContents
 .Cells(1, 8).Select
 Application.CutCopyMode = False
End With
Application.Calculation = xlCalculationAutomatic
End Sub
    • good
    • 0

Private Sub CommandButton1_Click()



CommandButton1.Enabled = False
ActiveSheet.Activate
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
kkcs = Selection(1).Row + 1
kkie = Selection(Selection.Count).Row + 1
Cells.Select
ActiveSheet.Rows(kkcs).Select
Rows(kkcs - 1).EntireRow.Copy
Rows(kkcs & ":" & kkie).Insert Shift:=xlDown
Rows(kkcs & ":" & kkie).Columns("I:O").ClearContents
CommandButton1.Top = Rows(kkcs - 1).Columns("I").Top
Rows(kkcs).Columns("I").Select
Rows(kkcs + 1).Columns("I").Select
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
CommandButton1.Enabled = True

End Sub

こんなのではどうでしょうか。
ただし
「アクティブセルの行をコピーして下の行に挿入し、不必要なところを削除する」
ではなくて、
「選択していた範囲の最上位の行をコピーして、選択していた範囲のすべての行に貼付け、選択していた範囲の2行目以降はその下に移動させる。選択していた範囲のすべての行に貼付けたところは、"I:O"列はデータの値を消す」
  コマンドボタンを押す前に選択していたのが5行なら、最初の1行目のあとに5行増やしてしまいます。
  コマンドボタンを押す前に選択していたのが1行なら、最初の1行目のあとに1行増やします。
  目的がわからないのですが、「使っているうちにデバックエラーが頻発する」のなら、
  操作回数を減らしたら、エラーが減るのではないかと思ったからです。

Cells.Select
ActiveSheet.Rows(kkcs).Select
これは何の意味もない無駄な操作に思えるのですが、選択を変えると、もしかすると、エラーが起きにくくなるのではないかと、適当にやったものです。

CommandButton1.Enabled = False
これも、エラーで途中で止まるとやや困るコードですが、まだマクロ実行中にコマンドボタンをクリックして、それがおかしなエラーの原因になるのことは、、、と思って書き加えました。
最後に、マクロ実行が終わるときに、
CommandButton1.Enabled = True
で、正常に戻し、コマンドボタンをクリックできるようにしています。

CommandButton1.Top = Rows(kkcs - 1).Columns("I").Top
Rows(kkcs).Columns("I").Select
Rows(kkcs + 1).Columns("I").Select
これも余計なことですが、次々と行を増やしていくと、コマンドボタンの位置が前のママだと使いにくかったので、入力待ちの行の付近に移動させました。

一応エラーは私の試した範囲では出ませんでしたが、元の状態だと、十数回繰り返すと、実行時オートメーションエラーがでて、その後、どうにもならない状態になって、確かに困りました。 実行時オートメーションエラーがなんででるのか、どうすれば対処できるのかわからなかったので、ガチャガチャ余計なコードを入れてみたら、エラーの出現は少なくはなっているように思います。 ただ、本当に対策になっているのかは、わかりません。
    • good
    • 0
この回答へのお礼

御回答頂きありがとうございます。
動作確認いたしました。元の内容よりも進化していてとても満足しています。ありがとうございます。
エラーの原因が分からないのはもやもやしますが、yoreyore様の入れて下さった内容でしばらく使ってみます。

お礼日時:2018/05/31 08:45

も一つ、ファイルサイズが異常に大きくなっていたら、新規ブックにコピペで作り直す。

    • good
    • 0

Option Explicit を使う。


順次コンパイルのチェックを外す。
Application.CutCopyMode = False を追記する。
あとは、イベントプロシージャを全部見せてくれないと判らん。
    • good
    • 0
この回答へのお礼

御回答頂きありがとうございます。
試してみました。
エラーの原因とよろずや様が入れて下さった内容の意味合いがまだまだ自分の勉強不足で分からず。
まだ、いろいろ試してみます。
ありがとうございます。

お礼日時:2018/05/31 08:41

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