Excel VBA質問箱 IV

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

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


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

【48410】文字列の検索について とし 07/4/16(月) 19:02 質問[未読]
【48426】Re:文字列の検索について ウッシ 07/4/17(火) 11:02 発言[未読]
【48429】Re:文字列の検索について とし 07/4/17(火) 11:51 質問[未読]
【48430】Re:文字列の検索について ウッシ 07/4/17(火) 11:59 発言[未読]
【48432】Re:文字列の検索について とし 07/4/17(火) 13:25 発言[未読]
【48433】Re:文字列の検索について とし 07/4/17(火) 13:36 発言[未読]
【48434】Re:文字列の検索について ウッシ 07/4/17(火) 13:47 発言[未読]
【48435】Re:文字列の検索について ウッシ 07/4/17(火) 13:54 発言[未読]
【48436】Re:文字列の検索について とし 07/4/17(火) 14:19 お礼[未読]

【48410】文字列の検索について
質問  とし  - 07/4/16(月) 19:02 -

引用なし
パスワード
   似たような質問が多数あったのですが、どれを読んでもうまく
いかなかったので、改めて質問させて頂きます。


************* 質 問 内 容 *************

表が用意されているのですが、表の行数が200前後と多いため、
文字列による検索をかけます。

F列に表の各行の文字列を全て表示させ、
ユーザーフォームの入力欄(TextBox1)にて入力した文字列があれば、
隣(G列)のセルに「1」を立てて、後にG列に「1」が立っている行について
オートフィルタにて結果を出します。

表の行数は、変動します。

私が考えた結果は、下記の通り

 Dim a
 a = TextBox1
 Dim x As Long, y
  x = Range("F3").CurrentRegion.Rows.Count
  y = x - 4
 Dim i As Integer
  For i = 4 To y
    Cells(i, 6).Select
   Dim s As Range
   Set s = ActiveCell.Find(what:=a, lookat:=xlPart)
    If s Is Nothing Then
      ActiveCell.Offset(0, 1).Value = 1
    Else
      ActiveCell.Offset(0, 1).Value = ""
    End If
  Next

これだと、表の中に一致する文字列があれば
G列の全ての行に「1」を立ててしまうようです。

どこが間違っているのか分かりません。
どうかご教示願います。

【48426】Re:文字列の検索について
発言  ウッシ  - 07/4/17(火) 11:02 -

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

>表が用意されているのですが、表の行数が200前後と多いため、
行数としては、それほど多いとは思えません。

>F列に表の各行の文字列を全て表示させ、
数式を使っているのでしょうか?

> Dim a
Variant型になります。

> a = Me.TextBox1.text
> Dim x As Long, y
yがVariant型になります。

>  x = Range("F3").CurrentRegion.Rows.Count
>  y = x - 4
4引いてるという事は結局、表は1行目からあるのでは?

>    Cells(i, 6).Select
>   Set s = ActiveCell.Find(what:=a, lookat:=xlPart)
Cells(i, 6)という単一セルに「a」が含まれているかどうか判定してます。

>    If s Is Nothing Then
>      ActiveCell.Offset(0, 1).Value = 1
含まれていない場合に「1」を立てる?

もしループ処理するなら、

  Dim a As String
  Dim x As Long
  Dim i As Long
  
  a = Me.TextBox1.text
  With Worksheets("Sheet1") '対象シートに変更要
    x = .Range("F65536").End(xlUp).Row
    For i = 4 To x
      If InStr(1, .Cells(i, 6).Value, a) > 0 Then
        .Cells(i, 7).Value = 1
      Else
        .Cells(i, 7).ClearContents
      End If
    Next
  End With

F列のセルに「a」の値が含まれているかどうかだけで判定出来ると思います。

【48429】Re:文字列の検索について
質問  とし  - 07/4/17(火) 11:51 -

引用なし
パスワード
   返信ありがとうございます。
私の説明不足で、不明な点が多々ございますことを申し訳なく思います。


>>F列に表の各行の文字列を全て表示させ、
>数式を使っているのでしょうか?
答)CONCATENATE関数により表示させています。

>>  x = Range("F3").CurrentRegion.Rows.Count
>>  y = x - 4
>4引いてるという事は結局、表は1行目からあるのでは?
答)4引いているのは、詳しくは分かりませんが、上記の行数の数え方だと、
  4行多く数えているようです。(表の外から数えているとも思えないのですが(汗)
  この結果から、xから4を引くことにしました。

>>    If s Is Nothing Then
>>      ActiveCell.Offset(0, 1).Value = 1
>含まれていない場合に「1」を立てる?
答)私の間違いです。申し訳ございませんでした。


お教えいただいた方法で試してみたのですが、
「リストの集計行は変更できません。」とのエラーが発生します。
これまで試した中では、セルの内容(文字列)変更に関してエラーが
出たことはなかったのですが・・・

セルの内容変更に関して、私が考えたOffsetにてみたり、表の列を無意味
に増やしてみたりしたのですが、やはり同じエラーが発生してしまいます。

事前にリストによる絞込みができるようにしているのが問題なのでしょうか?

【48430】Re:文字列の検索について
発言  ウッシ  - 07/4/17(火) 11:59 -

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

>答)CONCATENATE関数により表示させています。
その式でどのセルを連結してますか?
内容によってはその式は全て削除した方がいいかも知れません。

>答)4引いているのは、詳しくは分かりませんが、上記の行数の数え方だと、
>  4行多く数えているようです。(表の外から数えているとも思えないのですが(汗)
>  この結果から、xから4を引くことにしました。
1、2行目にもデータが入っているのでは?

>事前にリストによる絞込みができるようにしているのが問題なのでしょうか?
どのようになっているのか説明して下さい。

CONCATENATEしているセル範囲を行ごとに処理して「Find」で「a」が含まれたセルが
あればG列に「1」を立てて次の行へと処理を繰り返す事も出来ます。

【48432】Re:文字列の検索について
発言  とし  - 07/4/17(火) 13:25 -

引用なし
パスワード
   この表は文書管理の為の表です。

表は下記のような感じです。


  A    B    C    D    E   F   G ・・・
1
2
3 列1  列2  列3  列4  列5  列6 列7・・・
4  あ   い   う      あいう
5  え   お   か   ○  えおか


 A列には分類、B列にはファイル名、C列にはキャビネット棚番号
 D列は人がいてもいなくても常時施錠しているキャビネットは「○」
  それ以外は空白(たまたま空白にしているだけ)
 E列は、検索ようにA・B・C列の文字列を表示させています。なくても
  かまいません。
 F列には、先ほどの検索結果が合致していれば「1」を表示させます。

A・B・C・D・E・F列は、マクロを使わなくてもリストによる絞込みが
できるようになっています。
使う人が、より簡単に操作できるように、分類やキャビネット棚番号によって
も絞込みができるマクロを別に組んでいます。

検索結果で「1」を表示させるのは、リストにより「1」が表示されている
行だけを表示させるようにする方が、簡単なのではないかと考えたからです。

「1」にこだわりがあるわけではありません。

この説明でイメージできますでしょうか?
説明不足の点があれば、再度説明させて頂きます。

よろしくお願いします。

【48433】Re:文字列の検索について
発言  とし  - 07/4/17(火) 13:36 -

引用なし
パスワード
   すみません。
列がずれていました。
A列は使ってはおらず、表は全て右に1列づれます。

失礼いたしました。

【48434】Re:文字列の検索について
発言  ウッシ  - 07/4/17(火) 13:47 -

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

F列に「1」ですか?
前提のコードと一つずれてますね。

  Dim a As String
  Dim x As Long
  Dim i As Long
  
  a = Me.TextBox1.Text
  With Worksheets("Sheet1")
    x = .Range("E65536").End(xlUp).Row
    For i = 4 To x
      If InStr(1, .Cells(i, "E").Value, a) > 0 Then
        .Cells(i, "F").Value = 1
      Else
        .Cells(i, "F").ClearContents
      End If
    Next
  End With

とか

  Dim a As String
  Dim f As Range
  Dim r As Range
  Dim s As Range
  
  a = Me.TextBox1.Text
  With Worksheets("Sheet1")
    Set r = Intersect(.Range("A3").CurrentRegion, .Range("A4:D65536"))
    For Each s In r.Rows
      Set f = s.Find(a, , xlValues, xlPart)
      If f Is Nothing Then
        .Cells(s.Row, "F").ClearContents
      Else
        .Cells(s.Row, "F").Value = 1
      End If
    Next
  End With

【48435】Re:文字列の検索について
発言  ウッシ  - 07/4/17(火) 13:54 -

引用なし
パスワード
   A列無しなら

  Dim a As String
  Dim x As Long
  Dim i As Long
  
  a = Me.TextBox1.Text
  With Worksheets("Sheet1")
    x = .Range("F65536").End(xlUp).Row
    For i = 4 To x
      If InStr(1, .Cells(i, "F").Value, a) > 0 Then
        .Cells(i, "G").Value = 1
      Else
        .Cells(i, "G").ClearContents
      End If
    Next
  End With

とか

  Dim a As String
  Dim f As Range
  Dim r As Range
  Dim s As Range
  
  a = Me.TextBox1.Text
  With Worksheets("Sheet1")
    Set r = Intersect(.Range("B3").CurrentRegion, .Range("B4:E65536"))
    For Each s In r.Rows
      Set f = s.Find(a, , xlValues, xlPart)
      If f Is Nothing Then
        .Cells(s.Row, "G").ClearContents
      Else
        .Cells(s.Row, "G").Value = 1
      End If
    Next
  End With

下のコードはF列の連結用の式は不要です。

【48436】Re:文字列の検索について
お礼  とし  - 07/4/17(火) 14:19 -

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

うまくいきました。

分かりづらい説明を根気強く聞いて頂き、感激しております。

私は、ずぶの素人なので、またお世話になるかもしれませんが、
一人でもマクロが組めるよう勉強していきたいと思います。

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

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