Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3566 / 13646 ツリー ←次へ | 前へ→

【61399】Do While条件式(not equal) Hoppy 09/5/5(火) 23:25 質問[未読]
【61400】Re:Do While条件式(not equal) Abyss 09/5/5(火) 23:28 発言[未読]
【61406】Re:Do While条件式(not equal) Hoppy 09/5/6(水) 7:34 お礼[未読]
【61402】Re:Do While条件式(not equal) ゆみこん 09/5/5(火) 23:46 発言[未読]
【61407】Re:Do While条件式(not equal) Hoppy 09/5/6(水) 7:40 回答[未読]
【61410】Re:Do While条件式(not equal) arajin 09/5/6(水) 9:29 発言[未読]
【61414】Re:Do While条件式(not equal) Hoppy 09/5/7(木) 9:25 お礼[未読]
【61416】Re:Do While条件式(not equal) arajin 09/5/7(木) 10:25 発言[未読]
【61404】Re:Do While条件式(not equal) りん 09/5/6(水) 7:00 回答[未読]
【61409】Re:Do While条件式(not equal) Hoppy 09/5/6(水) 7:49 お礼[未読]

【61399】Do While条件式(not equal)
質問  Hoppy  - 09/5/5(火) 23:25 -

引用なし
パスワード
   初歩的な質問で恐縮です。
A列に店名、B列に県名、C列に仕入れ商品名、D列に発注日付が入っており、デイリーで更新しています。
金沢の県境に位置する藤田屋さんだけは新潟として集計したいため、新潟に県名を変更します。
以下のソースは、藤田屋を検索し、Hitする間県名を変更するというつもりですが、恐らく条件式の"Obj Is Not Nothing"が不適切です。色々調べ、試しましたが
しっくり着ません。
よろしければ御教示願えませんでしょうか。

Sub Chng_KNZtoNGT()
  Dim lngYLine As Long
  Dim intXLine As Integer
  Dim Obj As Object

  Set Obj = Worksheets("data").Cells.Find("藤田屋")
  Do While Obj Is Not Nothing
  lngYLine = Worksheets("data").Cells.Find("藤田屋").Row
  intXLine = Worksheets("data").Cells.Find("藤田屋").Column
  intXLine = intXLine + 1     '県名のセルに移動
  Cells(lngYLine, intXLine).Value = Replace(Cells(lngYLine, intXLine).Value, "金沢", "新潟")
  Set Obj = Worksheets("data").Cells.Find("藤田屋")
  Loop
End Sub

【61400】Re:Do While条件式(not equal)
発言  Abyss  - 09/5/5(火) 23:28 -

引用なし
パスワード
   >Obj Is Not Nothing
   ↓
Not Obj Is Nothing

が正しいです。

【61402】Re:Do While条件式(not equal)
発言  ゆみこん  - 09/5/5(火) 23:46 -

引用なし
パスワード
   A列の藤田屋さんを抽出して置換と言う事で、

Sub try()
 Dim r As Range
 Dim rr As Range
 Application.ScreenUpdating = False

 With Worksheets("data")
    .Range("A1").AutoFilter 1, "藤田屋"
    Set r = .Range(.Range("A2"), .Cells(Rows.Count, 1) _
        .End(xlUp)).SpecialCells(xlCellTypeVisible)
    If r.Row > 1 Then
     For Each rr In r.Offset(, 1)
       rr.Value = Replace(rr.Value, "金沢", "新潟")
     Next
    End If

    .Range("A1").AutoFilter
 End With
 Application.ScreenUpdating = True
 Set r = Nothing
End Sub

ご参考程度まで。

【61404】Re:Do While条件式(not equal)
回答  りん E-MAIL  - 09/5/6(水) 7:00 -

引用なし
パスワード
   Hoppy さん、おはようございます。

>金沢の県境に位置する藤田屋さんだけは新潟として集計したいため、新潟に県名を変更します。

>  Cells(lngYLine, intXLine).Value = Replace(Cells(lngYLine, intXLine).Value, "金沢", "新潟")

金沢は県じゃないし、石川と新潟は隣接もしてないけどいいのかな。

Sub test()
  '藤田屋を検索して隣が新潟だと金沢に変更
  Dim r1 As Range, s1 As String
  '対象は現在表示されているシート
  With Application.ActiveSheet
   With .Columns("A:A")
     Set r1 = .Find("藤田屋", LookIn:=xlValues)
     'あれば続行
     If Not r1 Is Nothing Then
      s1 = r1.Address
      Do
        With r1.Offset(0, 1) 'ひとつ右→B列
         .Value = Replace(.Value, "金沢", "新潟")
        End With
        '
        Set r1 = .FindNext(r1) '検索続行
        '
        If r1.Address = s1 Then Exit Do '最初に戻ったら抜ける
      Loop
     End If
   End With
  End With
  '
  Set r1 = Nothing
End Sub

Findでするならこんな感じです。

【61406】Re:Do While条件式(not equal)
お礼  Hoppy  - 09/5/6(水) 7:34 -

引用なし
パスワード
   Abyssさん、ありがとうございました。

【61407】Re:Do While条件式(not equal)
回答  Hoppy  - 09/5/6(水) 7:40 -

引用なし
パスワード
   ゆみこんさん、おはようございます。
オートフィルターを使用するんですね。
全く気がつきませんでした。
発送の転換、大変参考になりました。
なかなか柔軟な考えができないんですよね〜。
これからもよろしくお願いします。
ありがとうございました。

【61409】Re:Do While条件式(not equal)
お礼  Hoppy  - 09/5/6(水) 7:49 -

引用なし
パスワード
   りんさん、おはようございます。
ですよねー、金沢は石川県だっつうの。新潟は富山と隣接してるっつうの。
えーえー勿論知ってますよ。皆さんの反応が見たかっただけです(汗;;

ひぇ〜、、、穴があったら入りたい!
馬鹿さ加減を露呈してしまった!!恥ずかしい〜(@@;
覆水盆に返らずとはこのことなり。

ソースありがとうございました。
やり始めたばっかりなんで知識が狭いため苦労しています。
でも仕事ですぐに必要なんでこうやって皆さんに助けてもらっています。
皆さんには感謝しきりです。
今後もよろしくお願いします。

【61410】Re:Do While条件式(not equal)
発言  arajin  - 09/5/6(水) 9:29 -

引用なし
パスワード
   ▼Hoppy さん:
>ゆみこんさん、おはようございます。
>オートフィルターを使用するんですね。
>全く気がつきませんでした。
>発送の転換、大変参考になりました。
>なかなか柔軟な考えができないんですよね〜。
>これからもよろしくお願いします。
>ありがとうございました。

もう蛇足になってしまいますが、気づいたのでコメントさせて下さい。

「現在の発想は、頭から目的のセルを探して、その横のセルの文字を置換する。
これをデータのある最終行までループで行う。」
ということだと思いますが、ちょっと別な発想をしてみませんか?

もし、マクロでなく一般操作でご希望の処理を実現しようとしたら、
あなたなら、どんな手順になりますかね。
私なら、AutoFilterでデータを絞り込んでから、特定列に対して置換(Ctrl+H)という手順が浮かびます。
あとは、この操作のマクロ記録を取ればいいと思います。
出来上がるコードは、Replace関数ではなく、RangeクラスのReplaceメソッドによる置換コードになります。

少し、大雑把ではありますが、ループしない別法です。

With Worksheets("data").Range("A1").CurrentRegion
  .Worksheet.AutoFilterMode = False
  .AutoFilter 1, "藤田屋"
  .AutoFilter 2, "石川県*"    'B列で絞る必要がなければ不要です。
  .Columns("B").Replace "金沢", "新潟", xlPart  
  .Worksheet.AutoFilterMode = False
End With

【61414】Re:Do While条件式(not equal)
お礼  Hoppy  - 09/5/7(木) 9:25 -

引用なし
パスワード
   ▼arajin さん:
繰り返し処理はループ、という常識が頭から離れないですね^^;
VBAを使うなら、ループを使わないこちらの方法がかなり高速だと思います。
ありがとうございました。

【61416】Re:Do While条件式(not equal)
発言  arajin  - 09/5/7(木) 10:25 -

引用なし
パスワード
   ▼Hoppy さん:
>ループを使わないこちらの方法がかなり高速だと思います。
の認識ですが、そうでないケースも多々あるので一概には言えないでしょう。

高速であるとか云々ではなく、
オートフィルターを掛けた状態での置換では、
フィルターで対象(表示されている)になっているセルだけが
対象になるということが伝えたかった主旨です。

今回のケースで言えば、B列に"金沢"という文字列が含まれる場合に、
A列が"藤田屋"でフィルターを掛けてから"新潟"へ置換を実行すると、
B列"金沢"という文字列があってもA列が"藤田屋"でなければ、
置換されないでしょうってことです。
一般操作でもそうだし、マクロで行っても同じです。

3566 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free