前提・実現したいこと
はじめまして、なんとかvbaを数日前から触っています。
以下、コードは問題ないように見えるのですが、実行が中断されます。なぜでしょうか・・・
発生している問題・エラーメッセージ
コードの実行が中断されました (ハイライト箇所は以下)
VBA
Sub test() Dim R As Range, Row As Long i = 0 Set R = Range("B14:L1000") 'チェックする範囲を指定 Set C = Range("L10") '条件色セルを指定 For y = 1 To R.Columns.Count For x = 1 To R.Rows.Count Row = 13 + x If R(x, y).DisplayFormat.Interior.ColorIndex = "44" Then Range("M" & Row).Value = "○" Next x Debug.Print "xは" & x Next y Debug.Print "yは" & y MsgBox ("一致セル数 : " & i) Range("M10") = i End Sub
試したこと
ステップインでデバックしている間は止まりません
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/31 02:27
2019/01/31 02:46
2019/01/31 02:58
回答5件
0
提示のコード自体に止まる原因があるようには思えません。
一つ気になるといえば、
If R(x, y).DisplayFormat.Interior.ColorIndex = "44" Then
で、ColorIndex に数字の文字列で比較しているところ、ColorIndex は数値型のプロパティなので、
If R(x, y).DisplayFormat.Interior.ColorIndex = 44 Then
とすべきです。
ただ、暗黙の型変換が行われるのでエラーにはならないし動作も問題ないですが、気持ち悪いコードです。
新規のシートにたいして、同じコードを走らせみてください。そこで問題なければ、このコード以外に原因があると問題の切り分けができます。
あとコードの前に自動再計算抑止とイベント発生抑止のコードを追加してコードを走らせてみてください。
vba
1Sub test() 2 Application.Calculation = xlCalculationManual 3 Application.EnableEvents = False 4 5'中略 6 7 Application.Calculation = xlCalculationAutomatic 8 Application.EnableEvents = True 9End If
これでうまくいけばいいのですが。
投稿2019/01/31 03:32
総合スコア33715
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/31 04:16
2019/01/31 04:30
2019/01/31 06:31
0
現象は再現しませんでしたが、Excelのバグではないかという情報があります。
http://d.hatena.ne.jp/shouh/20160304/1457097149
コードを入力しなおしたらどうでしょうか?
投稿2019/01/31 03:21
総合スコア13749
0
ベストアンサー
止まるというのを再現できませんでした・・・。
VBA
1Sub test() 2 Dim R As Range, Row As Long 3 i = 0 4 Set R = Range("B14:L1000") 'チェックする範囲を指定 5 Set C = Range("L10") '条件色セルを指定 6 For y = 1 To R.Columns.Count 7 Row = 14 8 For x = 1 To R.Rows.Count 9 If R(x, y).DisplayFormat.Interior.ColorIndex = "44" Then 10 'Range("M" & Row).Value = "○" 11 i = i + 1 12 Else 13 End If 14 Row = Row + 1 15 Next '←ここにハイライトされます 16 Next 17 MsgBox ("一致セル数 : " & i) 18 Range("M10") = i 19End Sub
・・・再現の仕方が悪かったのですかね・・・。
再挑戦
VBA
1Sub test() 2 Dim R As Range, Row As Long 3 i = 0 4 Set R = Range("B14:L1000") 'チェックする範囲を指定 5 Set C = Range("L10") '条件色セルを指定 6 For y = 1 To R.Columns.Count 7 For x = 1 To R.Rows.Count 8 Row = 13 + x 9 If R(x, y).DisplayFormat.Interior.ColorIndex = "44" Then Range("M" & Row).Value = "○" 10 i = i + 1 '抜けてたので追加しちゃいました 11 Next x 12 Debug.Print "xは" & x 13 Next y 14 Debug.Print "yは" & y 15 MsgBox ("一致セル数 : " & i) 16 Range("M10") = i 17End Sub
やっぱり止まりませんでした・・・
適当に塗りつぶしてるだけだと再現できないんですかねぇ・・・。
投稿2019/01/31 02:39
編集2019/01/31 02:54総合スコア2341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/31 02:45
2019/01/31 02:46
2019/01/31 02:55
2019/01/31 02:58
2019/01/31 03:01
2019/01/31 03:28
2019/01/31 04:17
0
たぶんループカウンタが回ってません。
通常は
vba
1For y = 1 To R.Columns.Count 2 3 4Next y
のようにカウンタを次のカウンタ(基本は+1)につなげます。
投稿2019/01/31 02:20
総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/31 02:25
2019/01/31 02:31
2019/01/31 02:32
2019/01/31 02:36
0
解決済のようですが、気になったので。。。
Ctrl + Break
の件ですが、ユーザーにとっては分かり難い挙動ですが、
バグなのか仕様なのかは、ユーザーには解りません。
なので、知っておいて対処するしかないです。
ま、こういう掲示板で聞くより、
「コードの実行が中断されました」
で検索した方が、情報は速く得られます。
それから。。。。
変数の宣言はちゃんとする癖をつけた方がいいと思います。
あと、変数を使うなら、もう少し有効に使いましょう。
それと、セルを見て行く順番も考慮して、
同じセルに何度も同じ内容を書き込まないようにした方がいいと思います。
何度もセルを読み書きするのはかなり処理速度的に不利になります。
VBA
1Option Explicit 2 3Sub test() 4 Dim r As Range 5 Dim Iro As Long 6 Dim Cmax As Long 7 Dim x As Long, y As Long 8 Dim i As Long, j As Long 9 10 Set r = Range("B14:L1000") 'チェックする範囲を指定 11 Iro = Range("L10").DisplayFormat.Interior.Color '条件色を指定 12 Cmax = r.Columns.Count 13 14 For x = 1 To r.Rows.Count 15 j = i 16 For y = 1 To Cmax 17 If r(x, y).DisplayFormat.Interior.Color = Iro Then i = i + 1 18 Next 19 If i > j Then r(x, Cmax + 1).Value = "○" 20 Next 21 22 Range("M10").Value = i 23End Sub
参考までに、こんな書き方もできるかなぁ。。。
VBA
1Sub test2() 2 Dim Rng As Range 3 Dim r As Range, c As Range 4 Dim myCollar As Long 5 Dim flg As Boolean 6 Dim vResult() As Variant 7 8 Set Rng = Range("B14:L1000") 9 myCollar = Range("L10").DisplayFormat.Interior.Color 10 ReDim vResult(1 To Rng.Rows.Count, 1 To 1) 11 12 For Each r In Rng.Rows 13 flg = False 14 For Each c In r.Cells 15 If c.DisplayFormat.Interior.Color = myCollar Then 16 myCount = myCount + 1 17 flg = True 18 End If 19 Next 20 If flg Then v(r.Row - Rng.Row + 1) = "○" 21 Next 22 With Rng 23 .Columns(.Columns.Count + 1).Value = vResult 24 End With 25End Sub
※注意
動作確認をしてません。
ちゃんと動かなかったらごめんなさいです。
投稿2019/01/31 11:38
総合スコア2136
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。