プロが教えるわが家の防犯対策術!

いつもお世話になっております。

この度、指定した条件で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」の質問画像

質問者からの補足コメント

  • 早速のご返答に重ねVBAの構築ありがとうございます!

    重ね重ね申し訳ございません。
    実行したところ、添付しました画像の形の処理となったのですが
    こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
    重ねてPCの文字列は部分一致の*PC*としております。
    PCが重複しております10、11行目は表示したままにできたのでありがとうございます。

    よろしくお願いいたします。

    「指定した条件で行セルを非表示にするVBA」の補足画像1
    No.5の回答に寄せられた補足コメントです。 補足日時:2023/10/18 13:40
  • 重ね重ね、申し訳ございません。

    No.7で構築してくださいましたVBAの自動化の処理が楽しくなり、昨夜色々とExcel表を触っていたのですが、その際、フィルターがかけられている際にどうも処理が反映されないことに気がつき補足にて返信させていただきました。

    フィルターは9行目に位置しております。
    例えば、D列の重複セルでのフィルターや他のセルの発送依頼日の日付でのフィルターがかけられていると処理が反映されず、フィルターを解除すると処理は問題なく反映されるので、おそらくフィルターが原因だと思われます。
    フィルターがかけられている状態でも処理が反映がされることは可能でございますでしょうか?

    お手数をおかけし申し訳ございません。
    重ね重ね、よろしくお願いいたします。

    No.11の回答に寄せられた補足コメントです。 補足日時:2023/10/19 06:43

A 回答 (17件中1~10件)

>重ねまして、大変申し訳ない気持ちで一杯なのですが、N0.2様のVBAで補足させていただきましたが、フィルターがされている状態でも反映される形に加えて、No.1様が構築してくださいました関数ではない構築も興味を惹かれております。


>お手数をおかけします大変申し訳ございませんが、VBAのご教示をいただけたら幸いです。

下記URLにアップしました。
(なぜかこちらに投稿するとエラーになるので、下記に下記にアップしました)
https://ideone.com/qnmEUr


全行のフィルター解除を最初におこなっています。
(列のフィルター解除はしてません)
もし、全列のフィルター解除もしたいなら、
ws.Cells.EntireRow.Hidden = Falseの後に
以下の行を追加してください
ws.Columns.EntireColumn.Hidden = False
    • good
    • 1
この回答へのお礼

NO.1様、VBAの構築ありがとうございます。
申し訳ございませんが、自宅に帰ってから確認いたしますので、少々お時間いただきます。

重ねて私の言葉足らずで申し訳ございません。
こちらの構築してくださいましたVBAの処理ですが、
フィルターは解除せず、されている状態(可視セル)
SpecialCellsを使う形になるのでしょうか?
にのみ処理を実行する処理が理想の処理内容になります。

重ね重ねとなり大変申し訳ございませんが、よろしくお願いいたします。

お礼日時:2023/10/20 12:08

>フィルターは解除せず、されている状態(可視セル)


SpecialCellsを使う形になるのでしょうか?
>にのみ処理を実行する処理が理想の処理内容になります。

すみません。オートフィルターが掛かった状態でのマクロの動作は、
非常に予測しがたい状態です。
従って、オートフィルターが掛かった状態で、表示されている行に対してのみ処理を行うことは、困難です。
SpecialCells等のかなりの試行錯誤をすれば、最終的に実現できるかもしれませんがやったことがありません。
ですので、「フィルターが掛かった状態で、表示されている行に対してのみ、
処理を行う」というのが、要件であれば、私はギブアップしますので、ほかの方の回答をお待ちください。
尚、No14のマクロは、フィルターが掛かっていない前提での処理です。
フィルターが掛かっている状態で、期待した結果になるかどうかの検証はしておりませんので、ご了承ください。
    • good
    • 0
この回答へのお礼

助かりました

お世話になっております。
No.14で構築してくださいましたVBAでフィルター状態でも私が理想とします処理の確認ができました!
自動処理が楽しくなり色々と弄っております。
この度はありがとうございました!
勉強させていただくことに重ねて大事に活用させていただきます。
ありがとうございました。

お礼日時:2023/10/20 19:03

>こちらの構築してくださいましたVBAの処理ですが、


フィルターは解除せず、されている状態(可視セル)
SpecialCellsを使う形になるのでしょうか?

すみません。フィルターがかかった状態とは、
非表示の行がある状態と解釈していました。
D列に日付でフィルターを掛けた状態のことでしたら、No14はフィルターの解除は行っていません。

処理としては、
①全行分のフィルターの解除
②全行分の非表示の行の解除
のあとに、重複行を非表示にする処理を行う。
ということで良いのでしょうか。
(結果としてフィルターは解除された状態になります。)
    • good
    • 0

No11です。



>フィルターがかけられている状態でも処理が反映がされることは
>可能でございますでしょうか?
No7までに記していたものは、セルをまとめて操作する方法を取っています。
(通常の操作と同様)表示セルを対象としており、非表示セルを操作する前提ではありません。
そもそもになりますが、元の状態に非表示セルが含まれている場合、条件に合うものが全て表示されるという保証もなくなります。

非表示のセルも含めて処理したいのであれば、個別にセルを処理する方法を取ってください。
(質問文にご提示の方法やNo5様の回答のような方法です)
    • good
    • 0

No7,No11をみて、


①D列の重複行のうち、そのEセル上にPCの文字だけを含んでいる行セルは表示。
②D列の重複行のうち、そのEセル上にPCの文字を含んではいるが、PC以外の文字が入力されている場合は、その重複行セルは非表示にする処理としたいです。
の意味が分かりました。
①は、D列の重複行のうち、全ての行が、Eセル上にPCの文字を含んでいる場合、全ての行を表示する。
②は、D列の重複行のうち、Eセル上にPCの文字を含んでいない行が1行でも、存在すれば、全ての重複行を非表示とする。
という、意味ですね。

①のケースはE列が"PC"
②のケースは、E列が"PC(Sony)" と思っていました。

解決されたようなので、これにて打ち切ります。
    • good
    • 0
この回答へのお礼

No.1様、お世話になっております。
私が実現したい処理内容の言語化、ありがとうございます。
この様にお伝えすれば分かりやすいと勉強になりました。

重ねまして、大変申し訳ない気持ちで一杯なのですが、N0.2様のVBAで補足させていただきましたが、フィルターがされている状態でも反映される形に加えて、No.1様が構築してくださいました関数ではない構築も興味を惹かれております。
お手数をおかけします大変申し訳ございませんが、VBAのご教示をいただけたら幸いです。

何卒よろしくお願い申し上げます。

お礼日時:2023/10/20 07:34

>①、②を表示させたままにしたい理由ですが、Excel上でPCだけ発送するデータの可視化をするのが目的でございます。



私が言いたいのは、
①も②も、重複行セルのEセルにはPCを含む文字列だけが入力されていないですよね。①の列がPC、②のE列がPCなら、①②が表示となるのは理解できますが、
①のE列はPC(sony)なので、③のPC(東芝)と同じ扱いになるべきかと思います。従って、①②は非表示になるべきです。

①②を表示にするというなら、①のPC(sony)と③のPC(東芝)をどのようにして区別するのでしょうか?
どちらも、「重複行セルのEセルにはPCを含む文字列だけが入力されていない」ケースになりませんでしょうか。
    • good
    • 0
この回答へのお礼

この度、No.7様の構築してくださいましたVBAで私が自動化したい処理が実現できましたことのご報告と、質問内容が2点、3点してしまったことに重ねて私の言語化が不十分となり大変申し訳ございません。

貴重なお時間を割いていただきVBAの構築ありがとうございました。
またこちらに何かとお世話になることと存じますが、どうぞよろしくお願いいたします。

お礼日時:2023/10/18 22:44

No7です。



>D列重複行セルのEセルにPCを含む文字列だけが入力されている
>行セルも非表示となります。
当方の環境ではそうはなりません。
というか、No3に示した条件の内容で作成しています。
条件が違う場合は、当然ながらお求めの結果とは異なるものになります。

その複数行の全部に「PC」の文字が含まれていますか?
一つでも(どこかに)D列の値が同じで、E列に「PC」が含まれていないものが存在すれば、全部の行が非表示になります。
あるいは、「PC」の文字が含まれている様には見えるけれど、全角文字が使われているとかではありませんか?
(PC と PC は別の文字として解釈されます。)

※ 条件が違っている場合は、条件の内容が当方にはよくわかりませんので、他の回答者様にお任せします。
この回答への補足あり
    • good
    • 0
この回答へのお礼

助かりました

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様の回答を待ち、本件クローズしたいと思います。
この度も重ね重ねお手数をおかけし申し訳ございませんでした。
ありがとうございました。

お礼日時:2023/10/18 22:28

あなたのNo8のお礼をそのまま述べてます。


------------------------------
D列     E列
20231017 PC(sony)・・・①
20231017 PC(sony)・・・②
20231018 PC(東芝) ・・・③
20231018 surface ・・・④
D列に20231017という重複データがあります。
そこから横のセル(Eセル)にPCを含む文字列だけが入力されている場合はその重複行セルは表示。

20231018の重複行セルのEセルにはPCを含む文字列だけが入力されていないため、20231018の重複行セルは(surfaceが入力されているセル)も非表示にしたい内容になります。
----------------------------
③④が非表示ということは、理解できましたが、
①②も非表示ではないでしょうか。
①②が表示になる理由が判りません。
    • good
    • 0
この回答へのお礼

迅速なご返信、ありがとうございます。
①、②を表示させたままにしたい理由ですが、Excel上でPCだけ発送するデータの可視化をするのが目的でございます。

D列に重複行セルがあり、かつPC以外の機材を含む行セルを手動操作で非表示にしている作業を自動化できたら業務効率化に繋がると思い、色々と調べたのですが私が実現させたい処理はVBAで構築することは可能なのでしょうか。

お礼日時:2023/10/18 21:20

要件の確認です。


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のお礼に従えば、
①は表示
②、③は非表示
④は非表示
なりますが、あってますか。
    • good
    • 0

>①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行のみ非表示にしたいと述べてます。
矛盾していませんでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはり私が処理したい内容は矛盾しているのでしょうか?
私の知識不足をお許しください。

D列     E列
20231017 PC(sony)
20231017 PC(sony)
20231018 PC(東芝)
20231018 surface
D列に20231017という重複データがあります。
そこから横のセル(Eセル)にPCを含む文字列だけが入力されている場合はその重複行セルは表示。

20231018の重複行セルのEセルにはPCを含む文字列だけが入力されていないため、20231018の重複行セルは(surfaceが入力されているセル)も非表示にしたい内容になります。

これをVBAで実現することは不可能なのでしょうか?
重ね重ねお手数をおかけし申し訳ございません。
よろしくお願いいたします。

お礼日時:2023/10/18 20:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A