![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっております。
この度、指定した条件でchat-GPTに助言を求めたところ、下記のVBAを提示していただいたのですが、重複している行セルが非表示になってくれず困っております。
指定条件は、例えばD列に重複している文字列が入力されており、かつE列にPCの文字が入力されている場合、その重複している行セルを非表示にする処理を構築したいのですが
' D列の重複文字列とE列の含む"PC"をチェックし、行セルを非表示にする
For i = 10 To lastRow
Dim cellD As String
Dim cellE As String
cellD = ActiveSheet.Cells(i, 4).Value
cellE = ActiveSheet.Cells(i, 5).Value
If Not dictD.Exists(cellD) Then
dictD(cellD) = 1
Else
dictD(cellD) = dictD(cellD) + 1
End If
If InStr(1, cellE, "PC", vbTextCompare) > 0 Then
If Not dictE.Exists(cellD) Then
dictE(cellD) = 1
Else
dictE(cellD) = dictE(cellD) + 1
End If
End If
If dictD(cellD) > 1 And dictE(cellD) = 1 Then
ActiveSheet.Rows(i).EntireRow.Hidden = True
End If
Next i
こちらのVBAを実行したところ、PCが入力されている行セルだけが非表示となり、Surfaceが入力されている行セルは表示されたままとなります。
この重複している行セルを非表示にすることは可能なのでしょうか?
よろしくお願いいたします。
![「指定した条件で行セルを非表示にするVBA」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/f/943663_652d7456ab456/M.png)
No.7
- 回答日時:
No3です。
ご自分で修正する気が無いのなら、初めからきちんと表現すべきです。
同じことを繰り返し考えるのは無駄手間です。
以下は、
・D列の値に重複があり
・そのE列の値のいずれかに「PC」の文字が含まれていて
・そのE列の値全てには「PC」の文字が含まれてはいない
という条件を全て満たす場合に、該当する行を非表示にする例です。
Sub Sample3()
Dim r, n
Const f = "=IF((COUNTIF(D:D,D1)>1)*"
Const g = "(COUNTIFS(D:D,D1,E:E,""*PC*"")<>COUNTIF(D:D,D1))"
Const h = "*(COUNTIFS(D:D,D1,E:E,""*PC*"")>0),"""",1)"
n = Cells(Rows.Count, 4).End(xlUp).Row
Set r = Cells(1, Columns.Count).Resize(n)
r.Formula = f & g & h
r.Value = r.Value
If Application.CountBlank(r) > 0 Then _
r.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
r.EntireColumn.Delete
End Sub
No3様の仰る通りです。
申し訳ございません。
重ねてお詫び申し上げます。
構築していただいた処理を実行したところ
D列重複行セルのEセルにPCを含む文字列だけが入力されている行セルも非表示となります。
この重複行セルは表示させたく、実現したい処理内容はNo.5様の回答に補足させていただきました形になります。
お手を煩わせてしまい、申し訳ございません。
よろしくお願いいたします。
No.6
- 回答日時:
>こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
D列の重複行のうち、E列にPCの文字を含んでいる行が2つ以上あった場合は、その行を表示すると理解しました。
(D列の重複行のうち、E列にPCの文字を含んでいる行が1行のみの場合は、その行も非表示にする)
上記で、合ってますでしょうか。
根本的に処理を見直す必要があるので、改修に時間がかかります。
改修は夕方以降になるかと思いますのご了承ください。
ありがとうございます。
私の言葉足らずで申し訳ございません。
処理内容を今一度整理しますと、
①D列の重複行のうち、そのEセル上にPCの文字だけを含んでいる行セルは表示。
②D列の重複行のうち、そのEセル上にPCの文字を含んではいるが、PC以外の文字が入力されている場合は、その重複行セルは非表示にする処理としたいです。
よろしくお願いいたします。
No.5
- 回答日時:
>重複行セルでかつPCだけが入力されている重複行セルは表示したままの分岐処理することは可能でしょうか?
こういうことでしょうか?
重複行のうち、E列にPCを含んでいる文字があれば、その行は表示します。
Public Sub 非表示()
Dim wrow As Long
Dim ws As Worksheet
Dim dicROW As Object
Dim dicPC As Object
Dim dicROWPC As Object
Dim maxrow As Long
Dim key As Variant
Dim cellE As String
Dim elms As Variant
Dim i As Long
Set ws = ActiveSheet
ws.Cells.EntireRow.Hidden = False
maxrow = ws.Cells(rows.Count, "D").End(xlUp).Row
Set dicROW = CreateObject("Scripting.Dictionary")
Set dicPC = CreateObject("Scripting.Dictionary")
Set dicROWPC = CreateObject("Scripting.Dictionary")
For wrow = 10 To maxrow
key = ws.Cells(wrow, "D").Value
cellE = ws.Cells(wrow, "E").Value
If dicROW.exists(key) = False Then
dicROW(key) = wrow
dicPC(key) = False
Else
dicROW(key) = dicROW(key) & "," & wrow
End If
If InStr(1, cellE, "PC", vbTextCompare) > 0 Then
dicPC(key) = True
dicROWPC(wrow) = True
End If
Next
For Each key In dicROW.keys
If dicPC(key) = True Then
elms = Split(dicROW(key), ",")
If UBound(elms) >= 1 Then
For i = 0 To UBound(elms)
wrow = CLng(elms(i))
If dicROWPC.exists(wrow) = False Then
ws.rows(elms(i)).Hidden = True
End If
Next
End If
End If
Next
End Sub
早速のご返答に重ねVBAの構築ありがとうございます!
補足したのですが、画像添付に審査がつくことになったのですね。
文章にて失礼します。
10. 20231017 PC(sony)
11. 20231017 PC(sony)
12. 20231018 PC(東芝)
13. 20231018 surface
13行目が非表示になりましたが、12行目が非表示になりません。
こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
最初に構築してくださいましたVBAでは12、13行目の重複行セルが非表示になり、この状態で10、11行目のPCが入力されている行セルは非表示にしない処理は可能でしょうか。
重ねてPCの文字列は部分一致の*PC*としております。
よろしくお願いいたします。
No.4
- 回答日時:
No1です。
補足要求(前提の確認)のつもりで投稿したのですが、補足がありませんでしたので、全てNo1の前提で、マクロを作成しました。いかのようにしてください。
Public Sub 非表示()
Dim wrow As Long
Dim ws As Worksheet
Dim dicROW As Object
Dim dicPC As Object
Dim maxrow As Long
Dim key As Variant
Dim cellE As String
Dim elms As Variant
Dim i As Long
Set ws = ActiveSheet
ws.Cells.EntireRow.Hidden = False
maxrow = ws.Cells(rows.Count, "D").End(xlUp).Row
Set dicROW = CreateObject("Scripting.Dictionary")
Set dicPC = CreateObject("Scripting.Dictionary")
For wrow = 10 To maxrow
key = ws.Cells(wrow, "D").Value
cellE = ws.Cells(wrow, "E").Value
If dicROW.exists(key) = False Then
dicROW(key) = wrow
dicPC(key) = False
Else
dicROW(key) = dicROW(key) & "," & wrow
End If
If InStr(1, cellE, "PC", vbTextCompare) > 0 Then
dicPC(key) = True
End If
Next
For Each key In dicROW.keys
If dicPC(key) = True Then
elms = Split(dicROW(key), ",")
If UBound(elms) >= 1 Then
For i = 0 To UBound(elms)
ws.rows(elms(i)).Hidden = True
Next
End If
End If
Next
End Sub
No.1様、VBAの構築ありがとうございます!
ご返答が遅くなり申し訳ございません。
条件に一致する重複行セルを非表示にすることができました!
ありがとうございます。
重ね重ねお手数をおかけし申し訳ございませんが、重複行セルでかつPCだけが入力されている重複行セルは表示したままの分岐処理することは可能でしょうか?
よろしくお願いいたします。
No.3
- 回答日時:
No2です
>重複していないセルデータにPCが入力されている行セルも非表示になってしまい
「重複していること」を条件に加えておくのを忘れてました。すみません。
修正するなら、こんな感じで。
Sub Sample2()
Dim r, n
n = Cells(Rows.Count, 4).End(xlUp).Row
Set r = Cells(1, Columns.Count).Resize(n)
r.Formula = "=IF((COUNTIF(D:D,D1)>1)*COUNTIFS(D:D,D1,E:E,""PC""),"""",1)"
r.Value = r.Value
If Application.CountBlank(r) > 0 Then _
r.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
r.EntireColumn.Delete
End Sub
修正ありがとうございます!
重ね重ねごめんなさい、あともうちょっとです。
重複データのE列にPCだけが入力されている場合は重複行セルを表示する処理も追加していただきたくよろしくお願いいたします。
No.2
- 回答日時:
こんにちは
ご説明がイマイチよくわからないけれど、ひょっとしてこんなことでしょうか?
Sub Sample()
Dim r, n
n = Cells(Rows.Count, 4).End(xlUp).Row
Set r = Cells(1, Columns.Count).Resize(n)
r.Formula = "=IF(COUNTIFS(D:D,D1,E:E,""PC""),"""",1)"
r.Value = r.Value
If Application.CountBlank(r) > 0 Then _
r.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
r.EntireColumn.Delete
End Sub
※ 勝手に想像していますので、違っている場合はスルーしてください。
No.2様、VBAの構築ありがとうございます。
行セルを非表示にすることができました!
重ねてお手数をおかけし申し訳ございませんがお願いがございます。
重複していないセルデータにPCが入力されている行セルも非表示になってしまい、並びに重複している行セルにPCが入力されている場合は行セルは非表示にしない処理をよろしくお願いいたします。
No.1
- 回答日時:
例でいうと、黄色のセルが非表示の対象になる行でしょうか。
緑のセルは、非表示にならない。
E列はPCの文字が含まれていれば良い。(OPC,PC,XPCA等)
PCは半角でも全角でも大文字でも小文字でも良い。
![「指定した条件で行セルを非表示にするVBA」の回答画像1](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/5/543026052_652db8be0583b/M.png)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel VBAでメールを送る方法について 2 2021/11/03 15:34
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Visual Basic(VBA) VBAで指定期間の範囲を抽出し、リストボックスに表示したいです。 2 2021/12/20 23:21
- Visual Basic(VBA) Excel VABについて 1.xlsm、VBA.xlsm2つのファイルがあり、1.xlsmにてVB 6 2021/12/13 17:46
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Visual Basic(VBA) 【VBA】ユーザーフォーム リストボックスのヘッダー設定方法 2 2021/12/02 11:15
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Excel(エクセル) VBA Scripting.Dictionary 連想配列 複数参照する方法 2 2021/12/17 01:52
- Visual Basic(VBA) シート名をフォルダ名に変更 1 2021/12/01 15:59
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
【Excel VBA】条件に合った行の表示・非表示を行う方法
Visual Basic(VBA)
-
エクセルで特定の文字列が入った行を非表示にしたい
Excel(エクセル)
-
-
4
条件に応じて特定の行を非表示にしたい
Excel(エクセル)
-
5
列から特定の文字列検索→該当以外の「行」隠すマクロ
その他(Microsoft Office)
-
6
エクセルで特定の値を含む列のみVBAで非表示にしたい
Excel(エクセル)
-
7
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
8
特定のセルが空白の行を非表示にするマクロについて
Excel(エクセル)
-
9
エクセルVBAのEntireRow.Hiddenをスピードアップしたいのですが・・・。
Excel(エクセル)
-
10
EXCEL VBA 指定範囲内で特定の列に空白セルを含む行を非表示
Excel(エクセル)
-
11
エクセルで複数の特定の文字列をふくむ行を非表示にしたい。
Excel(エクセル)
-
12
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
13
EXCELマクロで、ある列の値が0の場合、非表示/表示ボタンで該当列を非表示切り替えしたいんです。
Excel(エクセル)
-
14
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
15
セルの値と同じ名前のシートをアクティブにするには?
Excel(エクセル)
-
16
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
17
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
18
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
19
IF関数で0より大きい数値が入力されたら「あ」と表示、文字列の場合は空白としたい
Excel(エクセル)
-
20
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
エクセルVBAでコピーして順...
-
特定のセルが空白だったら、そ...
-
Excelで指定した日付から過去の...
-
【Excel VBA】指定行以降をクリ...
-
i=cells(Rows.Count, 1)とi=cel...
-
VBA コピーして次の値まで貼り...
-
Excel VBA、 別ブックの最終行...
-
【VBA】指定したセルと同じ値で...
-
エクセルの複数データーをダブ...
-
【EXCEL VBA】Range("A:A").Fi...
-
TODAY()で設定したセルの日付...
-
Excel2003 複数セル1列の入力済...
-
screenupdatingが機能しなくて...
-
実行時エラー438 オブジェクト...
-
Excel vbaで特定の文字以外が入...
-
Excel VBA ユーザーフォームの...
-
vbaでセルに入力したときに,そ...
-
セル色なしの行一括削除
-
特定の文字を条件に行挿入とそ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel VBA】指定行以降をクリ...
-
Excelで指定した日付から過去の...
-
【Excel】指定したセルの名前で...
-
TODAY()で設定したセルの日付...
-
EXCELで変数をペーストしたい
-
Excel VBA、 別ブックの最終行...
-
Excelのプルダウンで2列分の情...
-
VBA コピーして次の値まで貼り...
-
screenupdatingが機能しなくて...
-
エクセルVBAでコピーして順...
-
VBA初心者です。結合セルを保持...
-
セル色なしの行一括削除
-
VBAでセルをクリックする回...
-
Excel vbaで特定の文字以外が入...
-
DataGridViewの各セル幅を自由...
-
特定の文字を条件に行挿入とそ...
-
【VBA】指定したセルと同じ値で...
おすすめ情報
早速のご返答に重ねVBAの構築ありがとうございます!
重ね重ね申し訳ございません。
実行したところ、添付しました画像の形の処理となったのですが
こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
重ねてPCの文字列は部分一致の*PC*としております。
PCが重複しております10、11行目は表示したままにできたのでありがとうございます。
よろしくお願いいたします。
重ね重ね、申し訳ございません。
No.7で構築してくださいましたVBAの自動化の処理が楽しくなり、昨夜色々とExcel表を触っていたのですが、その際、フィルターがかけられている際にどうも処理が反映されないことに気がつき補足にて返信させていただきました。
フィルターは9行目に位置しております。
例えば、D列の重複セルでのフィルターや他のセルの発送依頼日の日付でのフィルターがかけられていると処理が反映されず、フィルターを解除すると処理は問題なく反映されるので、おそらくフィルターが原因だと思われます。
フィルターがかけられている状態でも処理が反映がされることは可能でございますでしょうか?
お手数をおかけし申し訳ございません。
重ね重ね、よろしくお願いいたします。