Excel VBA質問箱 IV

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

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


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

【65719】検索結果をカウントしたい kei 10/6/23(水) 15:20 質問[未読]
【65720】Re:検索結果をカウントしたい Jaka 10/6/23(水) 16:03 発言[未読]
【65721】Re:検索結果をカウントしたい kei 10/6/23(水) 17:13 質問[未読]
【65728】Re:検索結果をカウントしたい Jaka 10/6/24(木) 9:58 発言[未読]
【65732】Re:検索結果をカウントしたい Jaka 10/6/24(木) 10:39 発言[未読]
【65735】Re:検索結果をカウントしたい kei 10/6/24(木) 11:37 質問[未読]
【65736】Re:検索結果をカウントしたい Jaka 10/6/24(木) 11:52 発言[未読]
【65738】Re:検索結果をカウントしたい kei 10/6/24(木) 14:02 お礼[未読]

【65719】検索結果をカウントしたい
質問  kei  - 10/6/23(水) 15:20 -

引用なし
パスワード
   お知恵をいただきたく、お願いいたします。

同じ列の上の範囲内(E列) に、同じ名前がいくつあるかを検索して、
隣の列に番号を出そうとしています(F列)。
※にあるように、ダブリとしない名前を付けたいことが目的です。

 (E列)  (F列)
   A  
   B     1  ※B1
   C 
   B     2  ※B2

今やろうとしているのは、E列を上から順番に対象文字を見ていって
対象文字を一つ上のセルから一番上のセルまでを検索範囲として
見つかった個数を隣にカウントで出そうとしました。

以下のコードです。(Loopはまだ入れていません)
カウントの結果の部分を上手く表せず、どう記入したらよいでしょうか。

Sub カウント()

  Dim my検索セル1. As Range
  Dim j As Long

 ※jはRowの位置を出していますがコードは省略いたします

  Range(Cells(j - 1, "E"), Cells(j - 1, "E").End(xlUp)).Name = "検索範囲1."
  Range("検索範囲1.").Select
  '検索対象文字の1つ上のセルから一番上迄のセルを検索範囲として名前を検索範囲1.とする

  srcName = Cells(j, "E").Value
       '↑検索対象の文字
  Set my検索セル1. = Range("検索範囲1.").Find(What:=srcName)
  If Not my検索セル1. Is Nothing Then
    Cells(j, "F").Value = Count
    
  Else
    MsgBox srcName & "ありません"
    
  End If

End Sub

この中のElseの前あたりがわかりません。

   

【65720】Re:検索結果をカウントしたい
発言  Jaka  - 10/6/23(水) 16:03 -

引用なし
パスワード
   私なら、質面倒くさいのが嫌いなんで、遅くともエクセル関数のCountIfを使ってしまうところですが。

>  Set my検索セル1. = Range("検索範囲1.").Find(What:=srcName)
>  If Not my検索セル1. Is Nothing Then
     Count = Count + 1    ←単純に+1していけばいいと思います。
>    Cells(j, "F").Value = Count
>  Else
>    MsgBox srcName & "ありません"
>  End I

尚、単純に+1していけば良いというのが、うまくいかないからなのだろうと推測しますと、
Findでの引数の指定が足りないから。

今回の場合は、どこから検索するかの指定が足りないのが原因。
検索範囲の1番最後のセルの次から検索するとの指定、
つまり範囲1番目のセルから検索しろとの条件が無い。

指定しないと、アクティブセルの次のセルからとなります。
要するに、初めはアクティブセルは見ないで、アクティブセルの次から検索して、回り回って1番最後にアクティブセルを見る。

Find(値, After:=Range(検索したい位置), LookIn:=xlValues,・・出来たらこれらも省かない。

With Range("検索範囲1.")
  .Set my検索セル1. = .Find(What:=srcName, After:=.Cells(.Cells.count))
End with

【65721】Re:検索結果をカウントしたい
質問  kei  - 10/6/23(水) 17:13 -

引用なし
パスワード
   ▼Jaka さん:

ご回答ありがとうございました。
検索範囲の始まりのセルを指定し直し、以下のようにしてみました。
が、結果はカウントせずに、全て”1”と隣の列に出るだけでした。
Set my検索セル1.としたところに問題がありそうなのですが、
2個目、3個目のようになぜならないのか、ご指摘していただけますでしょうか。
また、例文でいただいた下の方にあるコードも、どの辺に当てはめたらよいのか
教えていただけたら助かります。

  Do Until Cells(j, "E").Value = ""
  '空白になるまで処理を繰り返す
 
     Range(Cells(k, "E"), Cells(j - 1, "E")).Name = "検索範囲1."
     Range("検索範囲1.").Select

  srcName = Cells(j, "E").Value
       '↑検索対象の文字
  
  Set my検索セル1. = Range("検索範囲1.").Find(What:=srcName)
  If Not my検索セル1. Is Nothing Then
   
    Cells(j, "F").Value = my検索セル1..Count

    
  End If
  
    j = j + 1
    
  Loop


>
>Find(値, After:=Range(検索したい位置), LookIn:=xlValues,・・出来たらこれらも省かない。
>
>With Range("検索範囲1.")
>  .Set my検索セル1. = .Find(What:=srcName, After:=.Cells(.Cells.count))
>End with

【65728】Re:検索結果をカウントしたい
発言  Jaka  - 10/6/24(木) 9:58 -

引用なし
パスワード
   Dim my検索セル1 As Range
Dim Cel As Range, SavAd As String, Ct As Long

Range("F1:F9").ClearContents

With Range("E1:E9")
   For Each Cel In .Cells
     If Cel.Offset(, 1).Value = "" Then
      Set my検索セル1 = .Find(What:=Cel.Value, After:=.Cells(.Cells.Count), _
               LookIn:=xlValues, LookAt:=xlWhole)
      If Not my検索セル1 Is Nothing Then
        Ct = 0
        SavAd = my検索セル1.Address
        Do
          Ct = Ct + 1
          'my検索セル1.Select
          my検索セル1.Offset(, 1).Value = Ct
          Set my検索セル1 = .FindNext(After:=my検索セル1)
        Loop Until SavAd = my検索セル1.Address
      End If
     End If
   Next
End With

【65732】Re:検索結果をカウントしたい
発言  Jaka  - 10/6/24(木) 10:39 -

引用なし
パスワード
   あ、E列のセルが空白の時の処理は入れてませんので、
必要なら、追加しておいてください。

>With Range("E1:E9")
>   For Each Cel In .Cells
    If Cel.value <> "" Then   '←これに対する End If も忘れずに。
>     If Cel.Offset(, 1).Value = "" Then

【65735】Re:検索結果をカウントしたい
質問  kei  - 10/6/24(木) 11:37 -

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

確認したいのですが、
>Range("F1:F9").ClearContents
はカウントを入れる範囲ですよね?
(複数シートに同じ作業をするので、セルを固定できないのですが
意味が合っているかを確認したいです)

検索範囲も固定できないので
Range(Cells(k, "E"), Cells(j - 1, "E")).Name = "検索範囲1."
のように範囲が変わってもわかるようにしてあります。

>Dim Cel As Range, SavAd As String, Ct As Long

こちらのCelは検索文字、SavAdはmy検索セル1.を代入するところ、
Ctとはカウント数、で合ってますか?

いただいたコードにそれらを当てはめて書き換えてみようと思いますが、
ちなみに以下の私が上手くいっていないコードは個数をカウントするところが
どこにもなくて、それがとの部分だったのかを見ていただけたらと思います。
面倒なことをお聞きしてすみません。

Dim my検索セル1. As Range
Dim 最初の場所 As Long

  Do Until Cells(j, "E").Value = ""
  '空白になるまで処理を繰り返す
  
     Range(Cells(k, "E"), Cells(j - 1, "E")).Name = "検索範囲1."
     Range("検索範囲1.").Select

  srcName = Cells(j, "E").Value
       '↑検索対象の文字
  
    Set my検索セル1. = Range("検索範囲1.").Find(What:=srcName)
    '何個あるか数えるところがない・・・
        
  If Not my検索セル1. Is Nothing Then
    最初の場所 = my検索セル1..Address
    
    Do
      my検索セル1..Select
      Set my検索セル1. = Cells.FindNwxt(my検索セル1.)
    Loop While Not my検索セル1. Is Nothing
       
    Cells(j, "F").Value = my検索セル1..Count
    
  End If
  
    j = j + 1
    
  Loop

End Sub

【65736】Re:検索結果をカウントしたい
発言  Jaka  - 10/6/24(木) 11:52 -

引用なし
パスワード
   ▼kei さん:
>確認したいのですが、
>>Range("F1:F9").ClearContents
>はカウントを入れる範囲ですよね?
はい。


あ....。
>※にあるように、ダブリとしない名前を付けたいことが目的です。
このことをすっかり忘れてました。

単純にF列にE列の枝番みたいなものをつけるに解釈が変わってました。
すみません。

【65738】Re:検索結果をカウントしたい
お礼  kei  - 10/6/24(木) 14:02 -

引用なし
パスワード
   ▼Jaka さん:

検索した後に、FindNextを加えて、カウントするコードを追加してみました。
なんとか成功したようです。
ご協力いただき、本当にありがとうございました。

>▼kei さん:
>>確認したいのですが、
>>>Range("F1:F9").ClearContents
>>はカウントを入れる範囲ですよね?
>はい。
>
>
>あ....。
>>※にあるように、ダブリとしない名前を付けたいことが目的です。
>このことをすっかり忘れてました。
>
>単純にF列にE列の枝番みたいなものをつけるに解釈が変わってました。
>すみません。

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