ホテルを選ぶとき、これだけは譲れない条件TOP3は?

またまたお世話になります><
オートフィルタ後、可視セルの特定列のみを処理したいです。
自作のコードだと抽出後、可視セルのみではなく検索が引っかかったセルから下まで全て処理されてしまいます…。※else以降の処理です。
例えば可視セルのB列のみ文字列を変えたい場合、どうしたらいいのでしょうか…?
ちなみに対象シートは2万行ほどあります。

.Range("A1").AutoFilter 2, "田中"
If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
.Range("A1").AutoFilter
Else
.Range(Range("B2"), Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) = "佐藤"
Range("A1").AutoFilter
End If

A 回答 (5件)

No.2・3です。



>実際の文字列だと「・・・」「ー」が含まれており・・・

B列セル内の「田中」の部分を「佐藤」に置換すれば良いのですかね?
そうであれば
.Range("B:B").Replace what:="田中", replacement:="左藤", lookat:=xlPart

になるだけですが、
そのセル全体(他の文字列も消去し「佐藤」だけにしたい!)という場合であれば
1セルずつ検索する必要があると思います。

データは約2万程度あるというコトなので、単にループさせるだけでは相当時間を要してしまうと思いますので、
配列等で処理した方が良いかも・・・m(_ _)m
    • good
    • 0
この回答へのお礼

早速ご返信ありがとうございます(*'▽')
配列は苦手なもので、ループで処理したら出来ました!w
お知恵をお貸しいただきありがとうございました!

お礼日時:2020/06/16 16:37

No1です。



>処理されなったものの文字列に「・・・」や「ー」が含まれるからだと思うのですが
ご提示のコードでもそうですが、(明示するしないとは別に)意味合いとして lookat:=xlWhole となっているので、セル内の文字と完全一致で検索しています。
部分一致で検索なさりたいのなら、lookat:=Xlpart などにすれば良いでしょう。

ただし、『山田中人』や『大田中 正人』のようなものも引っかかるようになりますのでご注意。
「完全一致/部分一致」のように単純ではなく、複雑な条件で検索なさりたいような場合は、対象範囲をループして検索するような方法になると思われます。
    • good
    • 0
この回答へのお礼

またまたありがとうございます(^^)/
今回は完全一致で処理したかったので、オートフィルタ後ループで処理したら何とか出来ました!
前回に引き続き、本当にありがとうございました!!

お礼日時:2020/06/16 16:38

No.2です。



投稿後気づきました。
No.1さんとダブっていましたね。
どうも失礼しました。m(_ _)m
    • good
    • 1

こんにちは!



コードを拝見すると、B列が「田中」の場合「佐藤」にすればよい!ということですかね。
データは2万行程度あるというコトなので、オートフィルタを使わず置換をしてみてはどうでしょうか?

何のオブジェクトに対するWithステートメントか不明ですが・・・

>.Range("B:B").Replace what:="田中", replacement:="左藤", lookat:=xlWhole

の1行だけでいけるような気がします。m(_ _)m
    • good
    • 0
この回答へのお礼

はじめまして!ご回答ありがとうございます~!
そうなんです!B列が「田中」の場合「佐藤」にしたいのですが…。
実際の文字列だと「・・・」「ー」が含まれており、Replaceメソッドだと正しく動いてくれないのです( ノД`)
なのでオートフィルタでやればいいかなと思うのですが、私の未熟なコードだと「田中」じゃないものまで全て「佐藤」になってしまうのです。
他に良い案が思いついたら、ご教示いただけたら喜びます!
ありがとうございました。

お礼日時:2020/06/16 11:37

こんにちは



with構文の中と思われるので、省略されているオブジェクトが何なのか不明ですが…

>.Range("A1").AutoFilter 2, "田中"
フィルタの範囲をキチンと指定してあげれば良さそうに思います。
仮に、withのオブジェクトが例えばシート等だとすれば、
 .Range("A1:B20000").AutoFilter 2, "田中"
などにしておけば良いのでは?

一方で、全体の雰囲気として、「田中」を「佐藤」に変えたいのかと思いますが、わざわざフィルタを用いなくても
 .Columns(2).Replace What:="田中", Replacement:="佐藤", LookAt:=xlWhole
の1行で済んでしまいそうな気もしますけれど・・・?
(上記では1行目もt対象に含まれてしまっていますが)
    • good
    • 0
この回答へのお礼

fujillinさま
前回に引き続き、ありがとうございます(´ω`*)
お察しの通り、withオブジェクトで省略したものはシート名です。
そして、補足になりますが、Replaceメソッドを使用した結果、適切に処理されるものとされないものがあり…。実際、処理されなったものの文字列に「・・・」や「ー」が含まれるからだと思うのですが><
なので処理されなかったものを、オートフィルタでやってみようと思った次第です。
そこで、ご指摘の通りフィルタの指定をしてみても、思うように動作しません。検索が引っかかったところから下の行全て、同じ「佐藤」になってしまいます(´;ω;`)ウッ…
そもそもなぜReplaceが適切に動いてくれないのか謎ですが…
また何か思いついたらご教示いただければ嬉しいです!

お礼日時:2020/06/16 11:32

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