Excel VBA質問箱 IV

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

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


7521 / 13645 ツリー ←次へ | 前へ→

【38542】繰り返し検索についての質問 ゆっけ 06/6/6(火) 11:03 質問[未読]
【38548】Re:繰り返し検索についての質問 Jaka 06/6/6(火) 12:14 発言[未読]
【38564】修正 Jaka 06/6/6(火) 14:08 発言[未読]
【38549】Re:繰り返し検索についての質問 Statis 06/6/6(火) 12:16 発言[未読]
【38554】Re:繰り返し検索についての質問 ハチ 06/6/6(火) 12:45 発言[未読]
【38559】Re:繰り返し検索についての質問 ハト 06/6/6(火) 13:42 回答[未読]
【38570】Re:繰り返し検索についての質問 Kein 06/6/6(火) 14:42 回答[未読]
【38581】Re:繰り返し検索についての質問 ゆっけ 06/6/6(火) 16:55 お礼[未読]
【38584】Re:繰り返し検索についての質問 ゆっけ 06/6/6(火) 18:04 質問[未読]
【38614】Re:繰り返し検索についての質問 ハト 06/6/7(水) 11:14 発言[未読]
【38616】Re:繰り返し検索についての質問 ハチ 06/6/7(水) 13:13 発言[未読]
【38655】Re:繰り返し検索についての質問 ゆっけ 06/6/8(木) 6:50 お礼[未読]

【38542】繰り返し検索についての質問
質問  ゆっけ  - 06/6/6(火) 11:03 -

引用なし
パスワード
   お世話になっております。
下記のコードを見て下さい

Sub 組立図の関連()

Dim ws, ws2 As Worksheet
Dim Alfa As String
Dim Alfa_r, F, CVr As Range
Dim CV_r, st As Long

'CVPARTSシートのH列のなかで、組立図と名前のつくセルを検索
Set CVr = Worksheets("CVPARTS").Range("H:H").Find("組立図", , , xlPart, , , False, False)
If Not CVr Is Nothing Then

'"ユニットマスター"を含むWorkSheetsを検索
For Each ws In ActiveWorkbook.Worksheets
If InStr(1, ws.Name, "ユニットマスター") <> 0 Then
'ユニットマスタ -シートのG列のなかで、CVrとおんなじセルを検索
Set F = ws.Range("G:G").Find(CVr.Value, , , xlPart, , , False, False)
If Not F Is Nothing Then
'あったらそのセルに色をつける
ws.Cells(F.row, 7).Interior.Color = RGB(0, 255, 0)
        
'上記のコードを繰り返す
st = CVr.row
Set CVr = Worksheets("CVPARTS").Range("H:H").FindNext(CVr)
Do While st <> CVr.row
For Each ws2 In ActiveWorkbook.Worksheets
If InStr(1, ws2.Name, "ユニットマスター") <> 0 Then
                  '
Set F = ws2.Range("G:G").Find(CVr.Value, , , xlPart, , , False, False)
If Not F Is Nothing Then
      
ws2.Cells(F.row, 7).Interior.Color = RGB(0, 255, 0)
End If
End If
Next ws2
Set CVr = Worksheets("CVPARTS").Range("H:H").FindNext(CVr)
Loop
     
End If
End If
Next ws
End If
End Sub

条件検索を繰り返したいのですがうまくいきません。
どこかおかしい所を教えていただきたいです。
宜しくお願いいたします。

【38548】Re:繰り返し検索についての質問
発言  Jaka  - 06/6/6(火) 12:14 -

引用なし
パスワード
   >Set CVr = Worksheets("CVPARTS").Range("H:H").Find("組立図", , , xlPart, , , False, False)
これで、"組立図"と言う文字を検索しています。

>'ユニットマスタ -シートのG列のなかで、CVrとおんなじセルを検索
>Set F = ws.Range("G:G").Find(CVr.Value, , , xlPart, , , False, False)
なのに、同じ文字を検索するのに何でセルを参照するのでしょうか?
素直に文字を検索するのが良いです。
Set F = ws.Range("G:G").Find("組立図", , , xlPart, , , False, False)

Dim 検索文字 as string
検索文字 = "組立図"
と、すれば
Set F = ws.Range("G:G").Find(検索文字, , , xlPart, , , False, False)
と、書けます。

>'上記のコードを繰り返す
>st = CVr.row
>Set CVr = Worksheets("CVPARTS").Range("H:H").FindNext(CVr)
別シートに対して、FindNextは使えないと思います。

検証してないけど、

Dim ws As Worksheet
Dim F As Range
Dim SavRow As Long
Dim 検索範囲 As String, 検索文字 As String
検索文字 = "組立図"
For Each ws In ActiveWorkbook.Worksheets
  If ws.Name = "CVPARTS" Then
    検索範囲 = "H:H"
  ElseIf InStr(1, ws.Name, "ユニットマスター") <> 0 Then
    検索範囲 = "G:G"
  End If
  With ws.Range(検索範囲)
    Set F = .Find(検索文字, , , xlPart, , , False, False)
    If Not F Is Nothing Then
     SavRow = F.Row
     Do
       ws.Cells(F.Row, 7).Interior.Color = RGB(0, 255, 0)
       Set F = .FindNext(F)
     Loop Until F.Row = SavRow
    End If
  End With
Next

【38549】Re:繰り返し検索についての質問
発言  Statis  - 06/6/6(火) 12:16 -

引用なし
パスワード
   こんにちは
CVPARTSシートのH列のなかで、組立図と名前のつくセルを検索して
"ユニットマスター"を含むWorkSheetsのG列を検査し一致したらそのセルに
色をつけるようですが?

上記を繰り返ししても同じセルに色を付ける事になりませんか?
なぜなら、H列に「組立図」が複数あても"ユニットマスター"を含むWorkSheetsの
G列を検索し同じ位置を取得するからです。

実際は何をされたいのでしょうか?

変数の宣言ですが

>Dim ws, ws2 As Worksheet
>Dim Alfa As String
>Dim Alfa_r, F, CVr As Range
>Dim CV_r, st As Long

ws,Alsa_r,F,CV_rは「Variant」になりますので下記になります

Dim ws As Worksheet, ws2 As Worksheet
Dim Alfa As String
Dim Alfa_r As Range, F As Range, CVr As Range
Dim CV_r As Long, st As Long

【38554】Re:繰り返し検索についての質問
発言  ハチ  - 06/6/6(火) 12:45 -

引用なし
パスワード
   どこかで見たことがあるようなSheet名ですね^^

コードをUPするときに

変数名にコメントを付ける。
インデントを付ける。

を意識してもらえるともう少しやりたい意図が見えてくると思います。
回答でなくてスイマセン。

【38559】Re:繰り返し検索についての質問
回答  ハト  - 06/6/6(火) 13:42 -

引用なし
パスワード
   こんにちは

▼ゆっけ さん:
>お世話になっております。
>下記のコードを見て下さい

>条件検索を繰り返したいのですがうまくいきません。
>どこかおかしい所を教えていただきたいです。
>宜しくお願いいたします。

↑は他の方が指摘されてますので
その辺を整理すると↓のような感じですか?

Sub Test_Loop()

Dim ws As Worksheet

Dim CVr As Range
Dim F As Range

Dim st As Long
Dim st2 As Long
Dim i As Integer

Dim TCvr() As String
  
  Set CVr = Worksheets("CVPARTS").Range("H:H").Find("組立図", , , xlPart, , , False, False)
  If Not CVr Is Nothing Then

    st = CVr.Row
    i = 0
    
    Do
      ReDim Preserve TCvr(i)
      TCvr(i) = CVr.Value
      
      Set CVr = Worksheets("CVPARTS").Range("H:H").FindNext(CVr)
      i = i + 1
    Loop While st <> CVr.Row
  
    For i = 0 To UBound(TCvr)
      For Each ws In ActiveWorkbook.Worksheets
        If InStr(1, ws.Name, "ユニットマスター") <> 0 Then
          Set F = ws.Range("G:G").Find(TCvr(i), , , xlPart, , , False, False)
'''''↑は xlPart じゃなく xlWhole では?
          If Not F Is Nothing Then
            st2 = F.Row
            Do
              ws.Cells(F.Row, 7).Interior.Color = RGB(0, 255, 0)
              Set F = ws.Range("G:G").FindNext(F)
            Loop While st2 <> F.Row
          End If
        End If
      Next ws2
    Next i
  End If

End Sub

【38564】修正
発言  Jaka  - 06/6/6(火) 14:08 -

引用なし
パスワード
   良く解ってないけど、こうした方が良いかも。

For Each ws In ActiveWorkbook.Worksheets
  If ws.Name = "CVPARTS" Then
    検索範囲 = "H:H"
  ElseIf InStr(1, ws.Name, "ユニットマスター") <> 0 Then
    検索範囲 = "G:G"
  Else
    検索範囲 = ""
  End If
  If 検索範囲 <> "" Then
    With ws.Range(検索範囲)
     Set F = .Find(検索文字, , , xlPart, , , False, False)
     If Not F Is Nothing Then
       SavRow = F.Row
       Do
         ws.Cells(F.Row, 7).Interior.Color = RGB(0, 255, 0)
         Set F = .FindNext(CVr)
       Loop Until F.Row = SavRow
     End If
    End With
  End If
Next

訂正
>別シートに対して、FindNextは使えないと思います。
別シートに引き継いで、FindNextは使えないと思います。

【38570】Re:繰り返し検索についての質問
回答  Kein  - 06/6/6(火) 14:42 -

引用なし
パスワード
   >組立図と名前のつくセル
と書くと Range("組立図") の意味になります。エクセルではセル範囲に
このように名前を付けることができますから、基本を知っている人には
誤解を与えます。で「"CVPARTS"シートのH列に、"組立図"という値が
見つからなかったら、処理を止める」ということにすれば、もっとすっきり
します。あと、Findのループ処理の代わりに、数式で検索する方法も取り入れて

Sub 組立図の関連()
  Dim WS As Worksheet
  Dim FR As Range
  Dim MyV As String

  Set FR = Worksheets("CVPARTS") _
  .Range("H:H").Find("*組立図*", , , xlPart)
  If FR Is Nothing Then
   MsgBox "CVPARTSシートに組立図の文字列が見つかりません", 48
   Exit Sub
  Else
   MyV = FR.Value: Set FR = Nothing
  End If
  For Each WS In Worksheets
   If WS.Name Like "*ユニットマスター*" Then
     On Error Resume Next
     With WS.Range("G1", WS.Range("G65536").End(xlUp)).Offset(, 26)
      .Formula = "=FIND(" & MyV & ",$G1)"
      .SpecialCells(3, 1).Offset(, -26) _
      .Interior.Color = RGB(0, 255, 0)
      .ClearContents
     End With
   End If
  Next
End Sub 

【38581】Re:繰り返し検索についての質問
お礼  ゆっけ  - 06/6/6(火) 16:55 -

引用なし
パスワード
   ▼みなさま
ありがとうございました!

【38584】Re:繰り返し検索についての質問
質問  ゆっけ  - 06/6/6(火) 18:04 -

引用なし
パスワード
   ▼皆様
さきほどはありがとうございました。
さきほど、色を付けたセルと同じ行の
Cセルの値をみて、その値と同じセルにも色を付けたく
以下のコードを書いてみたのですが・・・・

Sub test()

Dim ws As Worksheet
Dim R, 値1 As Range
Dim Savrow As Long
Dim 検索範囲 As String, 検索文字 As String
Dim 値 As String

検索文字 = "組立図"
For Each ws In ActiveWorkbook.Worksheets
  If ws.Name = "CVPARTS" Then
    検索範囲 = "H:H"
  ElseIf InStr(1, ws.Name, "ユニットマスター") <> 0 Then
    検索範囲 = "G:G"
  Else
    検索範囲 = ""
  End If
  If 検索範囲 = "G:G" Then
     Set R = ws.Range(検索範囲).Find(検索文字, , , xlPart, , , False, False)
     If Not R Is Nothing Then
      
       Savrow = R.row
      
      
       Do
         ws.Cells(R.row, 7).Interior.Color = RGB(0, 255, 0)
          値 = ws.Cells(R.row, 7).Offset(, -4).Value
     Set 値1 = ws.Range("C:C").Find(値, , , xlPart, , , False, False)
         If Not 値1 Is Nothing Then
    ws.Range(ws.Cells(値1.row, 3), ws.Cells(値1.row, 3)). _
    Interior.Color = RGB(0, 255, 0)
          
         End If
         Set R = ws.Range(検索範囲).FindNext(R)
      
       Loop Until R.row = Savrow


     End If
     
  End If
Next

End Sub

どこがおかしいのかわかりません。
たびたび申し訳ございません。

【38614】Re:繰り返し検索についての質問
発言  ハト  - 06/6/7(水) 11:14 -

引用なし
パスワード
   おはようございます

FindNextのところで誤解なされているようです

>     Set R = ws.Range(検索範囲).Find(検索文字, , , xlPart, , , False, False)
↑1.

>     If Not R Is Nothing Then
>      
>       Savrow = R.row
>      
>      
>       Do
>         ws.Cells(R.row, 7).Interior.Color = RGB(0, 255, 0)
>          値 = ws.Cells(R.row, 7).Offset(, -4).Value
           Set 値1 = ws.Range("C:C").Find(値, , , xlPart, , , False, False)
↑2.
>         If Not 値1 Is Nothing Then
>    ws.Range(ws.Cells(値1.row, 3), ws.Cells(値1.row, 3)). _
>    Interior.Color = RGB(0, 255, 0)
>          
>         End If
>         Set R = ws.Range(検索範囲).FindNext(R)
↑3.
>      
>       Loop Until R.row = Savrow

FindNextは前回のFindの検索条件で行われます
3.のFindNextは1.のFindではなく、2.のFindの検索条件で検索しているんです
(検索文字ではなく値で検索)
ここが意図されているのと違っているところではないでしょうか

【38616】Re:繰り返し検索についての質問
発言  ハチ  - 06/6/7(水) 13:13 -

引用なし
パスワード
   ▼ゆっけ さん:


>どこがおかしいのかわかりません。
>たびたび申し訳ございません。

どうなるのか(〜エラーになる とか 期待した結果ではなくこうなった とか)を
書かないとわかりません。

Rと値1はRangeなので、
ws.Cells(R.row, 7).Offset(, -4).Value ←R.Offset(,-4).Value
ws.Range(ws.Cells(値1.row, 3), ws.Cells(値1.row, 3)). _ ←ws.値1. _
で良いのでは?

>さきほど、色を付けたセルと同じ行の
>Cセルの値をみて、その値と同じセルにも色を付けたく

この処理だけなら、G列の検索値のR.Offset(-4)で
C列をオートフィルタして可視セルに色を付ける 
という仕様にしたほうが、手っ取り早いのではないでしょうか?

【38655】Re:繰り返し検索についての質問
お礼  ゆっけ  - 06/6/8(木) 6:50 -

引用なし
パスワード
   ▼皆様

遅くなりました。
どうもありがとうございました!
お礼申し上げます。

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