
いつもお世話になっております。
この度、指定した条件で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が入力されている行セルは表示されたままとなります。
この重複している行セルを非表示にすることは可能なのでしょうか?
よろしくお願いいたします。

No.14ベストアンサー
- 回答日時:
>重ねまして、大変申し訳ない気持ちで一杯なのですが、N0.2様のVBAで補足させていただきましたが、フィルターがされている状態でも反映される形に加えて、No.1様が構築してくださいました関数ではない構築も興味を惹かれております。
>お手数をおかけします大変申し訳ございませんが、VBAのご教示をいただけたら幸いです。
下記URLにアップしました。
(なぜかこちらに投稿するとエラーになるので、下記に下記にアップしました)
https://ideone.com/qnmEUr
全行のフィルター解除を最初におこなっています。
(列のフィルター解除はしてません)
もし、全列のフィルター解除もしたいなら、
ws.Cells.EntireRow.Hidden = Falseの後に
以下の行を追加してください
ws.Columns.EntireColumn.Hidden = False
NO.1様、VBAの構築ありがとうございます。
申し訳ございませんが、自宅に帰ってから確認いたしますので、少々お時間いただきます。
重ねて私の言葉足らずで申し訳ございません。
こちらの構築してくださいましたVBAの処理ですが、
フィルターは解除せず、されている状態(可視セル)
SpecialCellsを使う形になるのでしょうか?
にのみ処理を実行する処理が理想の処理内容になります。
重ね重ねとなり大変申し訳ございませんが、よろしくお願いいたします。
No.17
- 回答日時:
>フィルターは解除せず、されている状態(可視セル)
SpecialCellsを使う形になるのでしょうか?
>にのみ処理を実行する処理が理想の処理内容になります。
すみません。オートフィルターが掛かった状態でのマクロの動作は、
非常に予測しがたい状態です。
従って、オートフィルターが掛かった状態で、表示されている行に対してのみ処理を行うことは、困難です。
SpecialCells等のかなりの試行錯誤をすれば、最終的に実現できるかもしれませんがやったことがありません。
ですので、「フィルターが掛かった状態で、表示されている行に対してのみ、
処理を行う」というのが、要件であれば、私はギブアップしますので、ほかの方の回答をお待ちください。
尚、No14のマクロは、フィルターが掛かっていない前提での処理です。
フィルターが掛かっている状態で、期待した結果になるかどうかの検証はしておりませんので、ご了承ください。
お世話になっております。
No.14で構築してくださいましたVBAでフィルター状態でも私が理想とします処理の確認ができました!
自動処理が楽しくなり色々と弄っております。
この度はありがとうございました!
勉強させていただくことに重ねて大事に活用させていただきます。
ありがとうございました。
No.16
- 回答日時:
>こちらの構築してくださいましたVBAの処理ですが、
フィルターは解除せず、されている状態(可視セル)
SpecialCellsを使う形になるのでしょうか?
すみません。フィルターがかかった状態とは、
非表示の行がある状態と解釈していました。
D列に日付でフィルターを掛けた状態のことでしたら、No14はフィルターの解除は行っていません。
処理としては、
①全行分のフィルターの解除
②全行分の非表示の行の解除
のあとに、重複行を非表示にする処理を行う。
ということで良いのでしょうか。
(結果としてフィルターは解除された状態になります。)
No.15
- 回答日時:
No11です。
>フィルターがかけられている状態でも処理が反映がされることは
>可能でございますでしょうか?
No7までに記していたものは、セルをまとめて操作する方法を取っています。
(通常の操作と同様)表示セルを対象としており、非表示セルを操作する前提ではありません。
そもそもになりますが、元の状態に非表示セルが含まれている場合、条件に合うものが全て表示されるという保証もなくなります。
非表示のセルも含めて処理したいのであれば、個別にセルを処理する方法を取ってください。
(質問文にご提示の方法やNo5様の回答のような方法です)
No.13
- 回答日時:
No7,No11をみて、
①D列の重複行のうち、そのEセル上にPCの文字だけを含んでいる行セルは表示。
②D列の重複行のうち、そのEセル上にPCの文字を含んではいるが、PC以外の文字が入力されている場合は、その重複行セルは非表示にする処理としたいです。
の意味が分かりました。
①は、D列の重複行のうち、全ての行が、Eセル上にPCの文字を含んでいる場合、全ての行を表示する。
②は、D列の重複行のうち、Eセル上にPCの文字を含んでいない行が1行でも、存在すれば、全ての重複行を非表示とする。
という、意味ですね。
①のケースはE列が"PC"
②のケースは、E列が"PC(Sony)" と思っていました。
解決されたようなので、これにて打ち切ります。
No.1様、お世話になっております。
私が実現したい処理内容の言語化、ありがとうございます。
この様にお伝えすれば分かりやすいと勉強になりました。
重ねまして、大変申し訳ない気持ちで一杯なのですが、N0.2様のVBAで補足させていただきましたが、フィルターがされている状態でも反映される形に加えて、No.1様が構築してくださいました関数ではない構築も興味を惹かれております。
お手数をおかけします大変申し訳ございませんが、VBAのご教示をいただけたら幸いです。
何卒よろしくお願い申し上げます。
No.12
- 回答日時:
>①、②を表示させたままにしたい理由ですが、Excel上でPCだけ発送するデータの可視化をするのが目的でございます。
私が言いたいのは、
①も②も、重複行セルのEセルにはPCを含む文字列だけが入力されていないですよね。①の列がPC、②のE列がPCなら、①②が表示となるのは理解できますが、
①のE列はPC(sony)なので、③のPC(東芝)と同じ扱いになるべきかと思います。従って、①②は非表示になるべきです。
①②を表示にするというなら、①のPC(sony)と③のPC(東芝)をどのようにして区別するのでしょうか?
どちらも、「重複行セルのEセルにはPCを含む文字列だけが入力されていない」ケースになりませんでしょうか。
この度、No.7様の構築してくださいましたVBAで私が自動化したい処理が実現できましたことのご報告と、質問内容が2点、3点してしまったことに重ねて私の言語化が不十分となり大変申し訳ございません。
貴重なお時間を割いていただきVBAの構築ありがとうございました。
またこちらに何かとお世話になることと存じますが、どうぞよろしくお願いいたします。
No.11
- 回答日時:
No7です。
>D列重複行セルのEセルにPCを含む文字列だけが入力されている
>行セルも非表示となります。
当方の環境ではそうはなりません。
というか、No3に示した条件の内容で作成しています。
条件が違う場合は、当然ながらお求めの結果とは異なるものになります。
その複数行の全部に「PC」の文字が含まれていますか?
一つでも(どこかに)D列の値が同じで、E列に「PC」が含まれていないものが存在すれば、全部の行が非表示になります。
あるいは、「PC」の文字が含まれている様には見えるけれど、全角文字が使われているとかではありませんか?
(PC と PC は別の文字として解釈されます。)
※ 条件が違っている場合は、条件の内容が当方にはよくわかりませんので、他の回答者様にお任せします。
No7様、原因が判明しました。
仰る通り、PC と PCの別の文字が入力されておりました。
正しい処理に統一するため
Sub PC文字置換()
Dim rng As Range
Dim cell As Range
' 変換対象のセル範囲を選択(E列の10行目から末尾まで)
Set rng = ActiveSheet.Range("E10:E" & ActiveSheet.Cells(Rows.Count, "E").End(xlUp).Row)
For Each cell In rng
If Not IsEmpty(cell.Value) Then
' テキストの置換を実行
cell.Value = Replace(cell.Value, "PC", "PC")
cell.Value = Replace(cell.Value, "PC", "PC")
cell.Value = Replace(cell.Value, "Pc", "PC")
cell.Value = Replace(cell.Value, "Pc", "PC")
End If
Next cell
End Sub
こちらでPCの文字列に統一した後、構築してくださいましたNo.7のVBAで理想の処理が実現できたことに重ねて勉強になりました!
この度はありがとうございました!
No1様の回答を待ち、本件クローズしたいと思います。
この度も重ね重ねお手数をおかけし申し訳ございませんでした。
ありがとうございました。
No.10
- 回答日時:
あなたのNo8のお礼をそのまま述べてます。
------------------------------
D列 E列
20231017 PC(sony)・・・①
20231017 PC(sony)・・・②
20231018 PC(東芝) ・・・③
20231018 surface ・・・④
D列に20231017という重複データがあります。
そこから横のセル(Eセル)にPCを含む文字列だけが入力されている場合はその重複行セルは表示。
20231018の重複行セルのEセルにはPCを含む文字列だけが入力されていないため、20231018の重複行セルは(surfaceが入力されているセル)も非表示にしたい内容になります。
----------------------------
③④が非表示ということは、理解できましたが、
①②も非表示ではないでしょうか。
①②が表示になる理由が判りません。
迅速なご返信、ありがとうございます。
①、②を表示させたままにしたい理由ですが、Excel上でPCだけ発送するデータの可視化をするのが目的でございます。
D列に重複行セルがあり、かつPC以外の機材を含む行セルを手動操作で非表示にしている作業を自動化できたら業務効率化に繋がると思い、色々と調べたのですが私が実現させたい処理はVBAで構築することは可能なのでしょうか。
No.9
- 回答日時:
要件の確認です。
1.E列がPCのみ場合、又はPCの文字を含んでいる場合、というとき
PCは半角大文字ですが、
半角小文字のpc
全角小文字のpc
全角大文字のPC
も対象になるのでしょうか。それとも、ならないのでしょうか。
2.重複文字があったとき、E列にPCの文字が一切ない場合は、非表示にしない。
例
D E
20131018 surface ・・・①
20131018 appche ・・・②
①②は、非表示にしない。
この認識で合ってますか。
3.重複文字があったとき、E列にPCの文字がある行があれば、非表示にする。
例
D E
20131018 PC ・・・①
20131018 appche ・・・②
②は、非表示にする。
①は表示/非表示のどちらでしょうか。
(最初の質問の内容では①は非表示ですが、No6のお礼では①は表示になっています)
4.重複文字があったとき、E列にPCを含む文字がある行がある場合(PCだけの行はない)
例
D E
20131018 PC(東芝) ・・・①
20131018 appche ・・・②
この場合は、どうなりますか。
5.重複文字があったとき、E列にPCを含む文字がある行があり、PCだけの行もある場合
D E
20131018 PC ・・・①
20131018 PC(東芝) ・・・②
20131018 PC(東芝) ・・・③
20131018 appche ・・・④
No6のお礼に従えば、
①は表示
②、③は非表示
④は非表示
なりますが、あってますか。
No.8
- 回答日時:
>①D列の重複行のうち、そのEセル上にPCの文字だけを含んでいる行セルは表示。
>②D列の重複行のうち、そのEセル上にPCの文字を含んではいるが、PC以外の文字が入力されている場合は、その重複行セルは非表示にする。
上記が表示/非表示の要件だとすると、
「No5の回答に寄せられた補足コメント(補足日時:2023/10/18 13:40)で、
こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
重ねてPCの文字列は部分一致の*PC*としております。
PCが重複しております10、11行目は表示したままにできたのでありがとうございます。」
と述べてますが、
10,11,12行は、上記の②(D列の重複行のうち、そのEセル上にPCの文字を含んではいるが、PC以外の文字が入力されている場合)
なので、10,11,12行は全て非表示にすべきです。
ところが、No5の回答に寄せられた補足コメントでは
10,11は、表示したままで、12行のみ非表示にしたいと述べてます。
矛盾していませんでしょうか?
回答ありがとうございます。
やはり私が処理したい内容は矛盾しているのでしょうか?
私の知識不足をお許しください。
D列 E列
20231017 PC(sony)
20231017 PC(sony)
20231018 PC(東芝)
20231018 surface
D列に20231017という重複データがあります。
そこから横のセル(Eセル)にPCを含む文字列だけが入力されている場合はその重複行セルは表示。
20231018の重複行セルのEセルにはPCを含む文字列だけが入力されていないため、20231018の重複行セルは(surfaceが入力されているセル)も非表示にしたい内容になります。
これをVBAで実現することは不可能なのでしょうか?
重ね重ねお手数をおかけし申し訳ございません。
よろしくお願いいたします。
お探しの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も見ています
-
【Excel VBA】条件に合った行の表示・非表示を行う方法
Visual Basic(VBA)
-
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
-
4
条件に応じて特定の行を非表示にしたい
Excel(エクセル)
-
5
エクセルで特定の値を含む列のみVBAで非表示にしたい
Excel(エクセル)
-
6
エクセルで特定の文字列が入った行を非表示にしたい
Excel(エクセル)
-
7
列から特定の文字列検索→該当以外の「行」隠すマクロ
その他(Microsoft Office)
-
8
EXCELマクロで、ある列の値が0の場合、非表示/表示ボタンで該当列を非表示切り替えしたいんです。
Excel(エクセル)
-
9
エクセルVBAのEntireRow.Hiddenをスピードアップしたいのですが・・・。
Excel(エクセル)
-
10
特定のセルが空白の行を非表示にするマクロについて
Excel(エクセル)
-
11
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
12
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
13
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
14
エクセルで複数の特定の文字列をふくむ行を非表示にしたい。
Excel(エクセル)
-
15
”戻り値”が変化したときに、マクロを実行したい
Visual Basic(VBA)
-
16
UserForm1.Showでエラーになります。
工学
-
17
エクセルの特定の文字を表示、非表示に切り替えたい
Excel(エクセル)
-
18
【VBA】複数のシートの指定した列を非表示・表示をさせたい
Excel(エクセル)
-
19
エクセルのマクロで条件一致のデータを別シート(複数)に転記したい
Visual Basic(VBA)
-
20
マクロを特定の複数シートで実行する方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
任意フォルダから画像をすべて...
-
Excelのプルダウンで2列分の情...
-
Application.Matchで特定行の検索
-
Excelで指定した日付から過去の...
-
特定のセルが空白だったら、そ...
-
【Excel VBA】指定行以降をクリ...
-
エクセルvba:自己セルの情報取...
-
エクセルvbaで、別シートの最下...
-
【Excel VBA】セルの色によって...
-
VBAでセルをクリックする回...
-
セルに貼り付けた画像の上から...
-
特定行の色を変えたい(FlexGrid)
-
Excel vbaで特定の文字以外が入...
-
TODAY()で設定したセルの日付...
-
if関数とifs関数は組み合わせる...
-
VBA実行後に元のセルに戻りたい
-
エクセルで自動的に印をつける方法
-
”戻り値”が変化したときに、マ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
Excelで指定した日付から過去の...
-
エクセルvbaで、別シートの最下...
-
特定のセルが空白だったら、そ...
-
VBA実行後に元のセルに戻りたい
-
【Excel VBA】指定行以降をクリ...
-
任意フォルダから画像をすべて...
-
【Excel】指定したセルの名前で...
-
VBAでセルをクリックする回...
-
【VBA】シート上の複数のチェッ...
-
EXCELのVBA-フィルタ抽出後の...
-
Excelのプルダウンで2列分の情...
-
Excel vbaで特定の文字以外が入...
-
TODAY()で設定したセルの日付...
-
”戻り値”が変化したときに、マ...
-
ExcelのVBAで数字と文字列をマ...
-
VBA ユーザーフォーム ボタンク...
-
Excel VBA マクロ ある列の最終...
-
Excel VBA、 別ブックの最終行...
おすすめ情報
早速のご返答に重ねVBAの構築ありがとうございます!
重ね重ね申し訳ございません。
実行したところ、添付しました画像の形の処理となったのですが
こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
重ねてPCの文字列は部分一致の*PC*としております。
PCが重複しております10、11行目は表示したままにできたのでありがとうございます。
よろしくお願いいたします。
重ね重ね、申し訳ございません。
No.7で構築してくださいましたVBAの自動化の処理が楽しくなり、昨夜色々とExcel表を触っていたのですが、その際、フィルターがかけられている際にどうも処理が反映されないことに気がつき補足にて返信させていただきました。
フィルターは9行目に位置しております。
例えば、D列の重複セルでのフィルターや他のセルの発送依頼日の日付でのフィルターがかけられていると処理が反映されず、フィルターを解除すると処理は問題なく反映されるので、おそらくフィルターが原因だと思われます。
フィルターがかけられている状態でも処理が反映がされることは可能でございますでしょうか?
お手数をおかけし申し訳ございません。
重ね重ね、よろしくお願いいたします。