質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

3582閲覧

エラーではないようですがVBAの実行がとなります

yumeno

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/31 02:10

編集2019/01/31 02:57

前提・実現したいこと

はじめまして、なんとか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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumeno

2019/01/31 02:27

ありがとうございます。2列目(C列)に対する1回目のnextでエラーが出ているみたいでした
ttyp03

2019/01/31 02:46

不要なタグVB.NETは削除してください。Excelのタグを追加してください。
yumeno

2019/01/31 02:58

不要でしたか、修正しました。ありがとうございます。
guest

回答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

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumeno

2019/01/31 04:16

すごいです!!!!!なぜでしょう、難解まわしても問題なくなりました! さっきまでは解決したと思ったけどエラーが出るのでいちいち再起動しなければいけなくてこまっていました。イベント抑止コード、初めて見ました。 ポップアップを無視するコードなのでしょうか?非常に勉強になります。
yumeno

2019/01/31 04:30

コードが長くなると同じ問題が発生してしまうのですね、難しい・・・
hatena19

2019/01/31 06:31

シートのイベント(SelectionChange とか Change とか・・・)にプロシージャが設定されている場合、コード中でシートを編集する場合、干渉して不具合が発生するのを抑制します。ブックとかシートのイベントになにかコードを設定していませんか。 あと、下記の画面更新抑制のコードもシートを編集するようなコードの前に記述しておくと、 高速化できます。 Application.ScreenUpdating = False
guest

0

現象は再現しませんでしたが、Excelのバグではないかという情報があります。
http://d.hatena.ne.jp/shouh/20160304/1457097149

コードを入力しなおしたらどうでしょうか?

投稿2019/01/31 03:21

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumeno

2019/01/31 03:27

バグだったみたいです!!!!!!解決しましたありがとうございます!!!!!!
guest

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
azuapricot

総合スコア2341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumeno

2019/01/31 02:45

すいません・・・then以降が正しくありませんでした。デバックも加えましたので、可能であればサイド再現していただけますと幸いです・・・
azuapricot

2019/01/31 02:46

あ、ありがとうございます~!
azuapricot

2019/01/31 02:55

カウンタも回ってるし、数字はとれてるのですがなぜでしょう~~~~~・・・・再現できません・・・。
yumeno

2019/01/31 02:58

エクセル側に何かあるんですかね・・・再起動してみます!
azuapricot

2019/01/31 03:01

それかyumenoさんが実際にマクロ実行で使用している表だと状況が再現する・・・とかですかね? とりあえずご提示のコードでは動くようです・・・。あとはエクセルのバージョンとか・・・(?)
yumeno

2019/01/31 03:28

再起動したら直りました!最後までお付き合いくださりありがとうございます!!!!!再現までしてくださったので、ベストアンサーにさせていただきます
azuapricot

2019/01/31 04:17

あ、よかったです~~~!再起動したら直るとかあるんですね・・・笑 うまく保存されてなかったとかでしょうか。 私も謎エラーにぶちあたったら再起動するようにします!
guest

0

たぶんループカウンタが回ってません。

通常は

vba

1For y = 1 To R.Columns.Count 2 3 4Next y

のようにカウンタを次のカウンタ(基本は+1)につなげます。

投稿2019/01/31 02:20

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumeno

2019/01/31 02:25

Sub エラーカウントファンクション() 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 Next y MsgBox ("一致セル数 : " & i) Range("M10") = i End Sub と改修しましたが、やはりNext x でとまってしまいます・・・・
m.ts10806

2019/01/31 02:31

あとはデバッグですね。それぞれのループカウンタをnextの前で Debug.Print で出力してどこで止まってるか確認してください
m.ts10806

2019/01/31 02:32

それぞれのループ回数はきちんと取れてるんですよね?
yumeno

2019/01/31 02:36

Debug.Printを使ってみたところ、2列目(C列)に対する1回目のnextでエラーが出ているみたいでした。うまく列移動できていないということですかね・・・
guest

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

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問