ここから本文です

Sub test() Dim myRng As Range Dim cnt As Long, i As Long Set myRng = Ac...

haryonpiさん

2017/7/1621:56:37

Sub test()
Dim myRng As Range
Dim cnt As Long, i As Long
Set myRng = ActiveCell

If (myRng.Row <= 16) Then Exit Sub
With ActiveSheet
cnt = 0
For i = myRng.Row To 16 Step -11
With .Cells(i - 11, myRng.Column)
Select Case .Interior.ColorIndex
Case 4
If (.Value = myRng.Value) Then Exit For
Case 33, 38
cnt = cnt + 1
End Select
End With
Next i
If (i < 16) Then cnt = 0
.Range("F2").Value = cnt
End With
End Sub
上記マクロの11行目、Case 4の箇所に、カラーナンバーを追加したくて、知識が有りませんので単純な考えで、Case 4,33,38この様に追加してみましたが、セルF2には個数0が出るだけです。
何処をどの様にしたら正確な個数が出る様になりますか。
アチコチいじってみましたが、自分ではどうする事も出来ませんでした。
回答宜しくお願い致します。Excel2016です。

補足マクロの内容は、アクティブセルから上に11個刻みで検索し、11個刻み上に存在する直近の、アクティブセルと同数が入力された4で着色されたセルを見付け、そのセルと、アクティブセルの間の11個刻み上に存在する、33と38で着色されたセルの合計個数をF2セルに入力、この様な内容です。マクロの11行目のカラーナンバー4の箇所に33と38をを書き加えても正確に動く様にして頂きたいのです。

閲覧数:
131
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

vcx000xcvさん

2017/7/1703:11:31

haryonpiさん

アクティブセルから上方向に11個刻みでループし、色番号が 4, 33, 38 のセルが何個あったかを出したいって事ですか?

個数を数える色番号もループ脱出の判定に使う色番号も同じなら、最後のセルはカウントすべきか否か?、アクティブセルに入っている値と同じ値が見つからなかったら、個数を数えるべきセルがあっても無視して良いのか?

など、あなたの頭の内で仕様は完成されているのでしょうけど、他人にはどういう動作が「正確に動く」状況なのかを判断出来ません。

サンプルデータで良いのでシート状況とビフォーアフターを載せると実物を見ていない者にも伝わりやすいです。

以下で、望む動作になっているか解りませんけど、、、

Sub test1()
Dim myRng As Range
Dim cnt As Long, i As Long
Set myRng = ActiveCell
If (myRng.Row <= 16) Then Exit Sub
With ActiveSheet
cnt = 0
For i = myRng.Row To 16 Step -11
With .Cells(i - 11, myRng.Column)
Select Case .Interior.ColorIndex
Case 4, 33, 38
If (.Value = myRng.Value) Then Exit For
cnt = cnt + 1
End Select
End With
Next i
If (i < 16) Then cnt = 0
.Range("F2").Value = cnt
End With
End Sub

  • 質問者

    haryonpiさん

    2017/7/1714:32:25

    説明が稚拙で済みません。再説明させて下さい。アクティブセルから上方向に11個目のセル、そこから又11個目、又そこから11個目、この様に11個間隔で上に検索して行き、一番最初に見つけたカラーNO.4で、尚且つアクティブセルと同じ数字が入力された11個刻み上に存在するセル、これが11行目のCase 4(自分ではこの個所だと思っているんですが)、このセルとアクティブセルの間に存在するカラーNO.33,38で着色されたセルの個数合計、但し、これも全ての33,38着色セルではなくて、11個間隔状に存在するセルです。この個所が上記マクロの13行目のCase 33, 38と14行目のcnt = cnt + 1(自分ではそう思っています)。この個所をCase 4,33, 38に変えるのではなく、上記マクロの11行目の最初に検索するCase 4の箇所にカラーNO.33と38を付け足して頂きたいのです。この33と38もアクティブセルと同じ数字が入力されたセルです。


  • その他の返信(5件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/7/17 21:22:16

vcx000xcvさん、kiku30246さん 、iss_zstoxさん 、回答有難う御座いました。解決までお付き合い下さったvcx000xcvさんをBAとさせて頂きました。
説明が下手でご迷惑お掛けし済みませんでした。
皆様、本当に有難う御座いました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

kiku30246さん

2017/7/1709:29:36

Excel マクロでの処理時間に関しての質問です。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q121715966...

上記の方と同じ方でしたか?


> 何処をどの様にしたら正確な個数が出る様になりますか。

何をしたいかを伝えられたらと・・・・・

もしくは、
やりたいことと、
Select Case の動きを理解して組まれればと・・・・

Select Case .Interior.ColorIndex
   Case 4 ' ★1
      If (.Value = myRng.Value) Then Exit For
   Case 33, 38 ' ★2
      cnt = cnt + 1
End Select

の記述では、
★1 の 4 でなければ、次の Case ★2 に移り 33, 38 で比較します

もし、★1 を Case 4, 33, 38 に変更したとすると、
4, 33, 38 でなければ、★2 の判別に移りますが、
33, 38 は ★1 で一致/処理するので、スルー(記述自体無駄)
この状態では cnt の値は更新されることは無く・・・

もし、4 の時でも、値が異なるのなら cnt 更新・・・ とするなら

Select Case .Interior.ColorIndex
   Case 4
      If (.Value = myRng.Value) Then Exit For
      cnt = cnt + 1 ' ★
   Case 33, 38
      cnt = cnt + 1
End Select


もし、33, 38 の時にも値が同じなら、そこまでで終了・・・・
既出ですね・・・

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

iss_zstoxさん

2017/7/1623:11:47

For文というのは、Next句の部分を通過した時に変数の値を変化させます。

提示されたプログラムを例にしますと、変数iの挙動は以下のようになります。

myRng = 29と仮定
最初のFor文に入った時 → i = 29
Next句 → i = 29 - 11 = 18
i ≧ 16 が成立するのでループ続行
Next句 i = 18 - 11 = 7
i ≧ 16 が成立しないのでループ離脱

となり、ループを抜けた時の値は必ず16より小さくなります。
しかし、Next句の後に、i が16未満ならcntを0にすると書いてありますので、ここで必ずcntが0になります。

よって出力される値が0になってしまうということではないかと思います。

プログラムの詳しい挙動については、デバッグ機能を使うとわかりやすいと思います。(実行時にステップインのボタンを押すとデバッグできると思います)

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。