Excel VBA質問箱 IV

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

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


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

【72621】列で検索するモジュールの書き方 はってんちゅう 12/8/29(水) 16:44 質問[未読]
【72624】Re:列で検索するモジュールの書き方 UO3 12/8/29(水) 17:07 発言[未読]
【72625】Re:列で検索するモジュールの書き方 UO3 12/8/29(水) 17:20 発言[未読]
【72633】Re:列で検索するモジュールの書き方 はってんちゅう 12/8/29(水) 20:30 お礼[未読]

【72621】列で検索するモジュールの書き方
質問  はってんちゅう  - 12/8/29(水) 16:44 -

引用なし
パスワード
   久々にお世話になります。

FindNextですが、行ごとでの検索としては知っているのですが、
列(コラム)で使用すると「RangeクラスのFindNextプロパティを取得できません」とのエラーとなります。
これを解決するにはどのように書けばよいのかを教えていただきたいのです。

現在書いているのは以下です。

Dim cNo As Variant
  With Worksheets(2).Range("A9:AZ9")
  Set cNo = .Find("部門比", LookIn:=xlValues)
    If Not cNo Is Nothing Then
      firstAddress = cNo.Address
      Do
        cNo = cNo.Column
        Columns(cNo).Delete shift:=xlToLeft
        Set cNo = .FindNext(cNo)
      Loop While Not cNo Is Nothing And cNo.Address <> firstAddress
    End If
  End With

させたい事:9行目のコラムA〜AZ間において“部門比”という言葉を検索し、この言葉があるコラムを全て削除。

宜しくお願い致します。

【72624】Re:列で検索するモジュールの書き方
発言  UO3  - 12/8/29(水) 17:07 -

引用なし
パスワード
   ▼はってんちゅう さん:

こんにちは

>列(コラム)で使用すると「RangeクラスのFindNextプロパティを取得できません」とのエラーとなります。

列方向の検索だからエラーになっているのではありません。

>Set cNo = .FindNext(cNo)

この右辺の cNo は、このセルの次から検索するよ という記述ですね。
では、その cNo は、どうなっているでしょうか?

まず、

>cNo = cNo.Column

これで、Rangeオブジェクトではなく 数値になっていますね。
で、仮に、ここを 別の変数 = cNo.Column とし、次のコードを
Columns(別の変数).Delete shift:=xlToLeft
このようにしたとしましょう。
そうすると、cNo というセルも含んで削除されますから、cNoがなくなるわけで
やはり、
Set cNo = .FndNext(cNo) でエラーになります。

対処する方法はいくつかありますが、一番簡単なのは、その都度削除するのではなく
検索できたセルオブジェクトをUnionで格納しておき、処理の最後に、この格納があれば
その EnireRow を Delete こんな感じでしょうかね。

【72625】Re:列で検索するモジュールの書き方
発言  UO3  - 12/8/29(水) 17:20 -

引用なし
パスワード
   ▼はってんちゅう さん:

↑ で EntireRowと書きましたが列削除でしたね。 EntireColumn。
以下に改訂コード案をアップします。

直接本円のテーマというわけではないのですが
Loop While Not cNo Is Nothing And cNo.Address <> firstAddress
VBAのヘルプにも記載されている「有名な?」コードですけど、
これは、実は「有名なバグ」ですので、使ってはいけません。
And 条件なので Nothing のときも、そのあとの cNo.Address <> firstAddress 比較が実行され
結果、エラーになります。

Sub Sample()
Dim cNo As Range
Dim myR As Range
Dim firstaddress As String

  With Worksheets(2).Range("A9:AZ9")
    Set cNo = .Find("部門比", LookIn:=xlValues, SearchOrder:=xlByColumns)
    
    If Not cNo Is Nothing Then
      firstaddress = cNo.Address
      Do
        If myR Is Nothing Then
          Set myR = cNo
        Else
          Set myR = Union(myR, cNo)
        End If
        
        Set cNo = .FindNext(cNo)
        
      Loop While cNo.Address <> firstaddress
      
    End If
    
    If Not myR Is Nothing Then myR.EntireColumn.Delete
    
  End With

End Sub

【72633】Re:列で検索するモジュールの書き方
お礼  はってんちゅう  - 12/8/29(水) 20:30 -

引用なし
パスワード
   UO3さん

ご丁寧に解説、説明、修正といただいてありがとうございます。

早速教えていただいた案を行ってみます。

ありがとうございました。

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