Excel VBA質問箱 IV

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

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


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

【51916】結合セルにおけるFindNextメソッドでエラー potemkin 07/10/11(木) 13:10 質問[未読]
【51917】Re:結合セルにおけるFindNextメソッドでエ... Jaka 07/10/11(木) 15:56 発言[未読]
【51918】Re:結合セルにおけるFindNextメソッドでエ... potemkin 07/10/11(木) 17:01 質問[未読]
【51919】Re:結合セルにおけるFindNextメソッドでエ... ハチ 07/10/11(木) 17:53 発言[未読]
【51920】Re:結合セルにおけるFindNextメソッドでエ... りん 07/10/11(木) 19:51 発言[未読]
【51927】Re:結合セルにおけるFindNextメソッドでエ... potemkin 07/10/12(金) 9:23 お礼[未読]

【51916】結合セルにおけるFindNextメソッドでエラ...
質問  potemkin  - 07/10/11(木) 13:10 -

引用なし
パスワード
   はじめまして。

excel2000を使用しているのですが、
検索処理が貧弱なため(全シート検索ができない)
検索マクロを組みました。
のですが、とある場合にエラーが発生してしまいます。

とある場合というのは
同一シート内に検索文字ヒットセルが1つのみ、かつ
そのセルが結合セルであるときに発生します。
FindNextメソッドが値を返してくれないために
エラーになっているようなのですが、対処方法がわかりません。

お恥ずかしい限りですが、もしよろしければ対処方法を
ご教授の程よろしくお願いいたします。
以下、コードです。(検索結果をリストに吐き出している処理です。)

Sub MakeList()
  Dim i As Integer
  Dim myCell As Range
  Dim myFirstCell As Range
  Dim myCellAdress As String
  Dim myFirstCellAdress As String
  
  
  For i = Me.ListBox1.ListCount - 1 To 0 Step -1
    Me.ListBox1.RemoveItem (i)
  Next i
  For i = 1 To Worksheets.count
    If LookAtCheckBox.Value = True Then
      Set myCell = Worksheets(i).Cells.Find(what:=Me.SearchTextBox.Text, _
                         after:=Range("A1"), _
                         LookAt:=xlWhole, _
                         MatchCase:=MatchCaseCheckBox.Value, _
                         MatchByte:=Me.MatchByteCheckBox.Value)
    Else
      Set myCell = Worksheets(i).Cells.Find(what:=Me.SearchTextBox.Text, _
                         after:=Range("A1"), _
                         LookAt:=xlPart, _
                         MatchCase:=MatchCaseCheckBox.Value, _
                         MatchByte:=Me.MatchByteCheckBox.Value)
    End If
    
    If Not myCell Is Nothing Then
      Me.MultiPage1(1).ListBox1.AddItem (Worksheets(i).Name & "/" & myCell.Address)
      Set myFirstCell = myCell
      myFirstCellAdress = myFirstCell.Address
      Do
        
        Set myCell = Worksheets(i).Cells.FindNext(after:=myCell)
        myCellAdress = myCell.Address
'        If myCell.Address = myFirstCell.Address Then
        If myCellAdress = myFirstCellAdress Then
          Exit Do
        End If
        
        Me.MultiPage1(1).ListBox1.AddItem (Worksheets(i).Name & "/" & myCell.Address)
        
        DoEvents
      Loop
    End If
  Next i

  Set myFirstCell = Nothing
  Set myCell = Nothing
End Sub

【51917】Re:結合セルにおけるFindNextメソッドで...
発言  Jaka  - 07/10/11(木) 15:56 -

引用なし
パスワード
   ▼potemkin さん:
>同一シート内に検索文字ヒットセルが1つのみ、かつ

>    If Not myCell Is Nothing Then
>      Me.MultiPage1(1).ListBox1.AddItem (Worksheets(i).Name & "/" & myCell.Address)
>      Set myFirstCell = myCell
>      myFirstCellAdress = myFirstCell.Address
>      Do
          '↓1個目に検索した物を処理せずに次を検索してます        
>        Set myCell = Worksheets(i).Cells.FindNext(after:=myCell)
>        myCellAdress = myCell.Address
         '↓1個しかない場合は、次に見つかったものと同じセルだから結果は目に見えてますね。
>        If myCellAdress = myFirstCellAdress Then
>          Exit Do
>        End If
>        
>        Me.MultiPage1(1).ListBox1.AddItem (Worksheets(i).Name & "/" & myCell.Address)
>        
>        DoEvents
>      Loop


>そのセルが結合セルであるときに発生します。
と、いうことが解っているなら、結合セルを止めるか、
結合してないセルを検索範囲に指定するぐらいです。
A列のセルが結合セルに含まれていないのなら、検索範囲を
A列にするだけです。
検索範囲がまばらになるようならあきらめてください。

【51918】Re:結合セルにおけるFindNextメソッドで...
質問  potemkin  - 07/10/11(木) 17:01 -

引用なし
パスワード
   ▼Jaka さん:
返信いただきありがとうございます。

>'↓1個しかない場合は、次に見つかったものと同じセルだから結果は目に見えてますね。

これはそういう仕様なので、むしろ問題ないです。
わからないのは

Set myCell = Worksheets(i).Cells.FindNext(after:=myCell)

この構文で普通のセルだと「mycell」に値が返ってくるのに
結合セルだと返ってこないということです。

>と、いうことが解っているなら、結合セルを止めるか、
>結合してないセルを検索範囲に指定するぐらいです。
>A列のセルが結合セルに含まれていないのなら、検索範囲を
>A列にするだけです。
>検索範囲がまばらになるようならあきらめてください。
使い勝手を考慮して検索範囲は指定したくないです。
あきらめるしかないのでしょうか。

【51919】Re:結合セルにおけるFindNextメソッドで...
発言  ハチ  - 07/10/11(木) 17:53 -

引用なし
パスワード
   ▼potemkin さん:
>▼Jaka さん:
>返信いただきありがとうございます。
>
>>'↓1個しかない場合は、次に見つかったものと同じセルだから結果は目に見えてますね。
>
>これはそういう仕様なので、むしろ問題ないです。
>わからないのは
>
>Set myCell = Worksheets(i).Cells.FindNext(after:=myCell)
>
>この構文で普通のセルだと「mycell」に値が返ってくるのに
>結合セルだと返ってこないということです。

この部分は、手動でやってもエラーになりますよ。
新規Bookで試してみてください。

つまり、Excel2000の仕様ということです。
どうしようもないです。

>あきらめるしかないのでしょうか。

無理やり、やるなら・・・
Do ・・・
  On Error Resume Next
    Set myCell = .FindNext(After:=myCell)
  On Error GoTo 0
  If myCell Is Nothing Then Exit Do
Loop

といった感じでしょうか?
試してないので、間違ってたらスイマセン。

【51920】Re:結合セルにおけるFindNextメソッドで...
発言  りん E-MAIL  - 07/10/11(木) 19:51 -

引用なし
パスワード
   potemkin さん、こんばんわ。

Sub test()
  Dim ws As Worksheet
  Set ws = Workbooks.Add.Worksheets(1)
  With ws
   'テスト検索用データ
   .Range("E10:F11").Merge
   .Range("E10").Value = "○"
   '検索実施
   With .Cells
     Set c = .Find("○")
     If Not c Is Nothing Then
       firstAddress = c.MergeArea.Address
       Do
         c.MergeArea.Interior.ColorIndex = 3
         Set c = .FindNext(c)
         If c Is Nothing Then Exit Do
         If c.MergeArea.Address = firstAddress Then Exit Do
       Loop
     End If
   End With
  End With
  ws.Parent.Saved = True
  Set ws = Nothing
End Sub

アドレスの比較をMergeAreaで行うのと、Nothingの判定とアドレスの条件を分けて分岐したら、XL2000でもエラーにならずに結合セルのみが検索ヒットしました。

【51927】Re:結合セルにおけるFindNextメソッドで...
お礼  potemkin  - 07/10/12(金) 9:23 -

引用なし
パスワード
   質問に答えていただいたみなさん、
ありがとうございました!

▼りん さん

無事に結合セルのみでもHITすることができました!
ありがとうございます。

>アドレスの比較をMergeAreaで行うのと、Nothingの判定とアドレスの条件を分けて分岐したら、XL2000でもエラーにならずに結合セルのみが検索ヒットしました。

なるほど、結合セルをVBAで扱うには注意が必要ということですね。
勉強になりました。

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