C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

【ExcelVBA】行内の黄色セルのカウント

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■97715 / inTopicNo.1)  【ExcelVBA】行内の黄色セルのカウント
  
□投稿者/ 工場プログラマー (78回)-(2021/07/05(Mon) 09:01:50)

分類:[Microsoft Office 全般] 

Win10

例えば、1行ずつ黄色セルの数を調べていって4以上なら
その行の1列目のセルを赤色セルに変えることはできますか?

いろいろやってみたんですけど1列ずつ調べることしかできなくて、、
どなたか教えてください。
引用返信 編集キー/
■97716 / inTopicNo.2)  Re[1]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ mofuramei (4回)-(2021/07/05(Mon) 10:46:23)
分類がオフィスなのでVBAを使用して取得すると読み取っています
違えば使用されるツールも記載された方が回答が付きやすいです。
後、1行の定義が何列目等を指すのかあいまいなので定義された方が良いかと思います。
※値が無くなる所までとか、最大100列目までとか

セル位置の指定[https://excel-ubara.com/excelvba1/EXCELVBA311.html]
セル色の取得[https://www.tipsfound.com/vba/07005]
セル色の設定[https://www.tipsfound.com/vba/07006]


以上


No97715 (工場プログラマー さん) に返信
> Win10
>
> 例えば、1行ずつ黄色セルの数を調べていって4以上なら
> その行の1列目のセルを赤色セルに変えることはできますか?
>
> いろいろやってみたんですけど1列ずつ調べることしかできなくて、、
> どなたか教えてください。
引用返信 編集キー/
■97717 / inTopicNo.3)  Re[1]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ furu (118回)-(2021/07/05(Mon) 12:08:00)
No97715 (工場プログラマー さん) に返信
> 例えば、1行ずつ黄色セルの数を調べていって4以上なら
> その行の1列目のセルを赤色セルに変えることはできますか?
・全データを行列入れ替えでコピー
・列毎に
  黄色でフィルター
  4以上なら、元データの1列目のセルを赤色セルに変える

これで少なくとも全セルチェックしなくていけます。
引用返信 編集キー/
■97718 / inTopicNo.4)  Re[2]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ メタルスライム (9回)-(2021/07/06(Tue) 00:13:32)
やりたいことは簡単なことなのに
質問の意味がわからない

行とは何か

あなたが当然伝えられていると思っていることは
伝わっていない

もう少し詳しく条件を提示しなければ
そのまま使えるコードが提示されることはないと思います



列ごとに●列から●列まで実行

列に黄色いセルが何個あるか判定
4を超えたら
指定行の色を赤に変更


という処理をするだけです。


引用返信 編集キー/
■97719 / inTopicNo.5)  Re[3]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 工場プログラマー (79回)-(2021/07/06(Tue) 08:49:55)
No97718 (メタルスライム さん) に返信
>
> 列ごとに●列から●列まで実行
>
> 列に黄色いセルが何個あるか判定
> 4を超えたら
> 指定行の色を赤に変更
>
>
> という処理をするだけです。
>

そのまま使えなくてもいいのですが甘えさせていただきますと
7行目から最終行まで実行したいです。

メタルスライムさんの説明に加えさせていただきますと

行ごとに7行目から最終行まで実行
行に黄色いセルが何個あるか判定
4を超えたら
指定行の黄色は残したまま指定行A列のセルを赤色に変更(11行目に黄色が4つあったらA11を赤にする)

みたいな感じです。

わかり辛かったらすいません。
引用返信 編集キー/
■97721 / inTopicNo.6)  Re[4]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 魔界の仮面弁士 (3146回)-(2021/07/06(Tue) 10:06:54)
No97715 (工場プログラマー さん) に返信
> いろいろやってみたんですけど1列ずつ調べることしかできなくて、、

残念ながら、一つずつ調べていくしか無いと思います。

セル値に対する判定処理であれば、データ構造上比較的容易に処理できますが、
セル色に対する判定処理は一括で行えません。ワークブックを作る際には
「色」を識別用途にはせず、セル値として作りこんだ方がプログラム的には処理しやすいです。


No97719 (工場プログラマー さん) に返信
> 指定行の黄色は残したまま指定行A列のセルを赤色に変更(11行目に黄色が4つあったらA11を赤にする)

A 列が黄色だったらどうするんだろう…という思いや、
列数の上限なし(16384列目まで)なのかといった疑問はありますが、それはさておき。

セルの色といっても、「パターンの色」「塗りつぶしの背景色」「文字色」「各罫線の色」などが
ありますが、今回は背景色でしょうか。

条件付き書式による色変化も考慮するとなれば、使用するのは必然的に
.DisplayFormat.Interior.Color プロパティ (あるいは同 ColorIndex) になるでしょう。

条件付き書式を使っていない場合は GET.CELL(63, セル) マクロという選択肢もありますが、
大量に使うとメモリ不足で動かなくなるので実質的に使えないと思います。


そして Interior オブジェクトにせよ GET.CELL マクロにせよ、
複数のセル範囲を一括して処理することはできません。

処理速度が懸念されますが、ループ処理で一つずつ見ていくしか無いと思いますよ。

No97717 の furu さんの方法ならかなり楽にはなりそうですが、それでも
 ・行数上限は 1,048,576 だが、列数上限は 16,384 のため、回転しきれないケースもある
 ・元の行数(回転後の列数)分だけ、フィルターの切り替えが必要
という制限はありますね。
引用返信 編集キー/
■97725 / inTopicNo.7)  Re[4]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ PATIO (3回)-(2021/07/06(Tue) 14:33:42)
No97719 (工場プログラマー さん) に返信
> ■No97718 (メタルスライム さん) に返信
>>
>>列ごとに●列から●列まで実行
>>
>>列に黄色いセルが何個あるか判定
>>4を超えたら
>>指定行の色を赤に変更
>>
>>
>>という処理をするだけです。
>>
>
> そのまま使えなくてもいいのですが甘えさせていただきますと
> 7行目から最終行まで実行したいです。
>
> メタルスライムさんの説明に加えさせていただきますと
>
> 行ごとに7行目から最終行まで実行
> 行に黄色いセルが何個あるか判定
> 4を超えたら
> 指定行の黄色は残したまま指定行A列のセルを赤色に変更(11行目に黄色が4つあったらA11を赤にする)
>
> みたいな感じです。
>
> わかり辛かったらすいません。

えーと、もしかしてコードを書いてほしいと言う事でしょうか。

言われている内容であれば、EXCEL VBAの範疇であれば、基本的な内容の範囲で実現できると思います。
コードにするには具体的な内容が色々足りなそうですけれど。

具体的にどう動かすのかを整理した上で実現するにはどういうコードを書けばよいかで進めていく必要があると思いますよ。
少なくともマクロの記録でどうにかなる様な話ではないと思います。

VBAの文法とかそういう部分から説明が必要という話でしょうか。

引用返信 編集キー/
■97733 / inTopicNo.8)  Re[5]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 工場プログラマー (80回)-(2021/07/07(Wed) 08:43:03)
No97721 (魔界の仮面弁士 さん) に返信
> ■No97715 (工場プログラマー さん) に返信
>>いろいろやってみたんですけど1列ずつ調べることしかできなくて、、
>
> 残念ながら、一つずつ調べていくしか無いと思います。
>
> セル値に対する判定処理であれば、データ構造上比較的容易に処理できますが、
> セル色に対する判定処理は一括で行えません。ワークブックを作る際には
> 「色」を識別用途にはせず、セル値として作りこんだ方がプログラム的には処理しやすいです。

なるほど、色の判定は難しそうなんで別の方法も考えてみます。
>
> A 列が黄色だったらどうするんだろう…という思いや、
> 列数の上限なし(16384列目まで)なのかといった疑問はありますが、それはさておき。

すいません。列の指定がなかったですね、4列目から最終行です。

> セルの色といっても、「パターンの色」「塗りつぶしの背景色」「文字色」「各罫線の色」などが
> ありますが、今回は背景色でしょうか。

背景色です。

> 条件付き書式による色変化も考慮するとなれば、使用するのは必然的に
> .DisplayFormat.Interior.Color プロパティ (あるいは同 ColorIndex) になるでしょう。
>
> 条件付き書式を使っていない場合は GET.CELL(63, セル) マクロという選択肢もありますが、
> 大量に使うとメモリ不足で動かなくなるので実質的に使えないと思います。
>
>
> そして Interior オブジェクトにせよ GET.CELL マクロにせよ、
> 複数のセル範囲を一括して処理することはできません。
>
> 処理速度が懸念されますが、ループ処理で一つずつ見ていくしか無いと思いますよ。

そこまで多いデータ量ではないんで頑張ってみますね。

引用返信 編集キー/
■97734 / inTopicNo.9)  Re[5]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 工場プログラマー (81回)-(2021/07/07(Wed) 09:01:04)
No97725 (PATIO さん) に返信

> えーと、もしかしてコードを書いてほしいと言う事でしょうか。

アドバイスや参考になるコードをいただきたいですね。

> 言われている内容であれば、EXCEL VBAの範疇であれば、基本的な内容の範囲で実現できると思います。
> コードにするには具体的な内容が色々足りなそうですけれど。
>
> 具体的にどう動かすのかを整理した上で実現するにはどういうコードを書けばよいかで進めていく必要があると思いますよ。

整理はついていたんですけど説明が足りなかったですね。申し訳ないです。

引用返信 編集キー/
■97735 / inTopicNo.10)  Re[6]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 魔界の仮面弁士 (3147回)-(2021/07/07(Wed) 09:58:38)
2021/07/07(Wed) 11:42:25 編集(投稿者)

No97733 (工場プログラマー さん) に返信
> 列の指定がなかったですね、4列目から最終行です。

4「列」目から最終「行」、という表現に違和感が…。

「1 行目以降、最終行まで」の各行を
「4 列目以降、最終列まで」の範囲で調べていくということですかね?


Option Explicit

Public Sub Wankuma97715(Optional ByVal targetSheet As Excel.Worksheet)
  Const CELL_MARK_COLOR As Long = vbRed
  Const CELL_FIND_COLOR As Long = vbYellow  '探索対象の色
  Const CELL_FIND_COUNT As Long = 4      '探索を打ち切る数(1以上)
  Const START_ROW As Long = 1         '探索開始行(1以上)
  Const START_COL As Long = 4         '探索開始列(2以上)

  If targetSheet Is Nothing Then
    Set targetSheet = ThisWorkbook.ActiveSheet
  End If
  Dim rng As Excel.Range
  Set rng = targetSheet.UsedRange

  ' A 列の背景色を事前にクリアしておく
  targetSheet.Columns(1).Interior.ColorIndex = xlColorIndexNone

  Dim rowIndex As Long, colIndex As Long
  Dim colorCount As Long
  For rowIndex = WorksheetFunction.Max(rng.Row, START_ROW) To rng.Row + rng.Rows.Count - 1
    colorCount = 0
    For colIndex = START_COL To rng.Column + rng.Columns.Count - 1
      If targetSheet.Cells(rowIndex, colIndex).DisplayFormat.Interior.Color = CELL_FIND_COLOR Then
        colorCount = colorCount + 1   '該当する背景色を発見
        If colorCount >= CELL_FIND_COUNT Then
          '既定数に達したので A 列を着色
          targetSheet.Cells(rowIndex, 1).Interior.Color = CELL_MARK_COLOR
          'この行の探索を打ち切って次行へ
          Exit For
        End If
      End If
    Next
  Next
End Sub
引用返信 編集キー/
■97752 / inTopicNo.11)  Re[7]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 工場プログラマー (82回)-(2021/07/08(Thu) 08:47:25)
No97735 (魔界の仮面弁士 さん) に返信
> 2021/07/07(Wed) 11:42:25 編集(投稿者)
>
> ■No97733 (工場プログラマー さん) に返信
>>列の指定がなかったですね、4列目から最終行です。
>
> 4「列」目から最終「行」、という表現に違和感が…。
>
> 「1 行目以降、最終行まで」の各行を
> 「4 列目以降、最終列まで」の範囲で調べていくということですかね?

ごめんなさい、4行目から最終行といいたかったです、、

> Option Explicit
>
> Public Sub Wankuma97715(Optional ByVal targetSheet As Excel.Worksheet)
>   Const CELL_MARK_COLOR As Long = vbRed
>   Const CELL_FIND_COLOR As Long = vbYellow  '探索対象の色
>   Const CELL_FIND_COUNT As Long = 4      '探索を打ち切る数(1以上)
>   Const START_ROW As Long = 1         '探索開始行(1以上)
>   Const START_COL As Long = 4         '探索開始列(2以上)
>
>   If targetSheet Is Nothing Then
>     Set targetSheet = ThisWorkbook.ActiveSheet
>   End If
>   Dim rng As Excel.Range
>   Set rng = targetSheet.UsedRange
>
>   ' A 列の背景色を事前にクリアしておく
>   targetSheet.Columns(1).Interior.ColorIndex = xlColorIndexNone
>
>   Dim rowIndex As Long, colIndex As Long
>   Dim colorCount As Long
>   For rowIndex = WorksheetFunction.Max(rng.Row, START_ROW) To rng.Row + rng.Rows.Count - 1
>     colorCount = 0
>     For colIndex = START_COL To rng.Column + rng.Columns.Count - 1
>       If targetSheet.Cells(rowIndex, colIndex).DisplayFormat.Interior.Color = CELL_FIND_COLOR Then
>         colorCount = colorCount + 1   '該当する背景色を発見
>         If colorCount >= CELL_FIND_COUNT Then
>           '既定数に達したので A 列を着色
>           targetSheet.Cells(rowIndex, 1).Interior.Color = CELL_MARK_COLOR
>           'この行の探索を打ち切って次行へ
>           Exit For
>         End If
>       End If
>     Next
>   Next
> End Sub

参考にしてこんな感じで作れました。

Dim i, j, iRow, MaxRow, MaxCol, yellow_cnt As Long

MaxRow = Cells(Rows.Count, 4).End(xlUp).Row
MaxCol = Cells(7, Columns.Count).End(xlToLeft).Column
iRow = 7

For i = 7 To MaxRow
For j = 4 To MaxCol                 '列の端までいったら抜ける
If Cells(iRow, j).Interior.ColorIndex = 6 Then  '黄色の判定
yellow_cnt = yellow_cnt + 1         '行内の黄色セルをカウント
If yellow_cnt >= 4 Then           '4以上で1列目を背景色を赤色に変更
Cells(iRow, 1).Interior.ColorIndex = 3
End If
End If
Next j

iRow = iRow + 1                     '次の行へ
yellow_cnt = 0                      'カウントを0に戻す

Next i

皆さん、たくさんのご回答ありがとうございました。
解決済み
引用返信 編集キー/
■97753 / inTopicNo.12)  Re[8]: 【ExcelVBA】行内の黄色セルのカウント
□投稿者/ 魔界の仮面弁士 (3149回)-(2021/07/08(Thu) 09:26:06)
2021/07/08(Thu) 09:42:40 編集(投稿者)

No97752 (工場プログラマー さん) に返信
> MaxRow = Cells(Rows.Count, 4).End(xlUp).Row
> MaxCol = Cells(7, Columns.Count).End(xlToLeft).Column

End プロパティはセル範囲の終端にしか反応しないので、
最終行(1048576行目)や最終列(XFD すなわち 16384列目)にまで
データが記載されていた場合、判定に失敗してしまいます。

また、「背景が黄色になっているが値が空なセル」という状況は無いのでしょうか?
End プロパティはコンテンツにしか反応しないので、セル値が空の場合は読み飛ばされてしまいます。
それを避けるため、No97735 では End ではなく UsedRange を使用しています。

必要要件次第では、UsedRange よりも狭い範囲を探索対象としたいこともあるとは思いますが、
そもそも、最大列は 7 行目のみで判断されるものだったのでしょうか。
そのような仕様は提示されていなかったように思うのですけれども。(^^;


> If Cells(iRow, j).Interior.ColorIndex = 6 Then  '黄色の判定
.Interior は、条件付き書式で着色された背景を考慮しませんが、本当にそれで良いのでしょうか?
.DisplayFormat.Interior を使えば、条件付き書式で上書き着色されたセルでも判定できます。

見た目上の黄色いセルを取得するのではなく、条件付き書式の影響を受ける前の
セル設定が黄色のセルを取得する目的ならば、.Interior の方を使うことになるでしょう。


> If yellow_cnt >= 4 Then           '4以上で1列目を背景色を赤色に変更
この時点で、j のループは Exit For しておくべきだと思いますよ。
もし、その行に黄色のセルが何千個もあったとしても、
4 に達した時点で、その行で行うべき作業はもう無いわけですから。

また、行・列処理のための入れ子のループ処理において、
i や j といったループカウンタを使う事はあまりお奨めしません。
i や j では後々、どちらが行でどちらが列なのかが分かりにくくなるためです。

一文字変数を望むなら、r や c、あるいは x と y などのように、
行なのか列なのか識別しやすい名前にしておくと、
取り違えミスを防ぎやすくなると思います。


> iRow = 7
> For i = 7 To MaxRow
> (中略)
> iRow = iRow + 1
> yellow_cnt = 0
> Next i

この流れなら、変数 i は不要で、
 For iRow = 7 To MaxRow
だけで良い気がします。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ