いつもお世話になっております。
この度、指定した条件で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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
条件に応じて特定の行を非表示にしたい
Excel(エクセル)
-
エクセルで特定の文字列が入った行を非表示にしたい
Excel(エクセル)
-
-
4
エクセルで特定の値を含む列のみVBAで非表示にしたい
Excel(エクセル)
-
5
【Excel VBA】条件に合った行の表示・非表示を行う方法
Visual Basic(VBA)
-
6
列から特定の文字列検索→該当以外の「行」隠すマクロ
その他(Microsoft Office)
-
7
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
8
エクセルで複数の特定の文字列をふくむ行を非表示にしたい。
Excel(エクセル)
-
9
特定のセルが空白の行を非表示にするマクロについて
Excel(エクセル)
-
10
エクセルVBAのEntireRow.Hiddenをスピードアップしたいのですが・・・。
Excel(エクセル)
-
11
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
12
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
13
EXCEL VBA 指定範囲内で特定の列に空白セルを含む行を非表示
Excel(エクセル)
-
14
エクセル~空白のセルのある行を非表示に。
Excel(エクセル)
-
15
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
16
VBAマクロ非表示が遅いので早くしたい
Excel(エクセル)
-
17
EXCELマクロで、ある列の値が0の場合、非表示/表示ボタンで該当列を非表示切り替えしたいんです。
Excel(エクセル)
-
18
【Excel VBA】複数ある特定の文字列を含む行を削除
Excel(エクセル)
-
19
VBAで特定の文字を探して隣のセルに色を付けたい
Excel(エクセル)
-
20
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
Excelで指定した日付から過去の...
-
Excelのプルダウンで2列分の情...
-
【Excel VBA】指定行以降をクリ...
-
EXCELで変数をペーストしたい
-
【Excel】指定したセルの名前で...
-
vba 隣のセルに値がある行だけ...
-
セル色なしの行一括削除
-
DataGridViewの各セル幅を自由...
-
DataGridViewで右寄せ左寄せが...
-
Excel VBA頭文字検索方法につい...
-
特定の範囲内に空白セルがいく...
-
同じマクロのプログラムなのに...
-
Excel VBA について(列幅)
-
Excel VBAで比較して数値があっ...
-
vbsのセル値の取得について
-
EXCELのVBA-フィルタ抽出後の...
-
Application.Matchで特定行の検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
i=cells(Rows.Count, 1)とi=cel...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
特定のセルが空白だったら、そ...
-
EXCELで変数をペーストしたい
-
Excelで指定した日付から過去の...
-
VBAの間違い教えて下さい
-
【Excel】指定したセルの名前で...
-
Excelのプルダウンで2列分の情...
-
エクセルVBAでコピーして順...
-
Excel vbaで特定の文字以外が入...
-
Excel VBA、 別ブックの最終行...
-
【VBA】指定したセルと同じ値で...
-
特定の文字を条件に行挿入とそ...
-
TODAY()で設定したセルの日付...
-
screenupdatingが機能しなくて...
-
VBA初心者です。次のVBAコード...
-
指定した条件で行セルを非表示...
-
VBAでセルをクリックする回...
-
DataGridViewの各セル幅を自由...
おすすめ情報
早速のご返答に重ねVBAの構築ありがとうございます!
重ね重ね申し訳ございません。
実行したところ、添付しました画像の形の処理となったのですが
こちらの12行目の重複しておりますPC(東芝)の行セルも非表示にしたい処理になります。
重ねてPCの文字列は部分一致の*PC*としております。
PCが重複しております10、11行目は表示したままにできたのでありがとうございます。
よろしくお願いいたします。
重ね重ね、申し訳ございません。
No.7で構築してくださいましたVBAの自動化の処理が楽しくなり、昨夜色々とExcel表を触っていたのですが、その際、フィルターがかけられている際にどうも処理が反映されないことに気がつき補足にて返信させていただきました。
フィルターは9行目に位置しております。
例えば、D列の重複セルでのフィルターや他のセルの発送依頼日の日付でのフィルターがかけられていると処理が反映されず、フィルターを解除すると処理は問題なく反映されるので、おそらくフィルターが原因だと思われます。
フィルターがかけられている状態でも処理が反映がされることは可能でございますでしょうか?
お手数をおかけし申し訳ございません。
重ね重ね、よろしくお願いいたします。