Excel VBA質問箱 IV

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

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


5813 / 13644 ツリー ←次へ | 前へ→

【48688】横フィルタ deda 07/5/2(水) 0:05 質問[未読]
【48689】Re:横フィルタ inoue 07/5/2(水) 0:10 発言[未読]
【48690】Re:横フィルタ inoue 07/5/2(水) 0:11 発言[未読]
【48708】Re:横フィルタ deda 07/5/2(水) 19:54 質問[未読]
【48712】Re:横フィルタ bykin 07/5/2(水) 21:15 回答[未読]
【48714】Re:横フィルタ deda 07/5/2(水) 22:28 質問[未読]
【48717】Re:横フィルタ bykin 07/5/2(水) 23:21 回答[未読]
【48718】Re:横フィルタ deda 07/5/2(水) 23:35 質問[未読]
【48720】Re:横フィルタ bykin 07/5/3(木) 0:00 発言[未読]
【48722】Re:横フィルタ deda 07/5/3(木) 0:10 質問[未読]
【48723】Re:横フィルタ bykin 07/5/3(木) 0:36 発言[未読]
【48725】これです! deda 07/5/3(木) 1:22 お礼[未読]

【48688】横フィルタ
質問  deda  - 07/5/2(水) 0:05 -

引用なし
パスワード
   フィルタというと、縦の方向に検索し、それを含まない行を非表示にしてくれますが、
これを横方向で検索、検索した文字列を含まない列を非表示にしてくれるマクロを考えています。

考え方としては、
1.1列内で文字列を検索
2.検索した文字列以外を選択
3.選択した列を非表示

でいける。と思っているのですが、2.の
検索した文字列「以外」を選択することができません。

いろいろなサイト、書籍でこんなサンプルをさがしていますが、見当たりませんでした。
ご助力の程、よろしくお願いします。

【48689】Re:横フィルタ
発言  inoue  - 07/5/2(水) 0:10 -

引用なし
パスワード
   >1.1列内で文字列を検索
>2.検索した文字列以外を選択
>3.選択した列を非表示
>でいける。と思っているのですが、2.の
>検索した文字列「以外」を選択することができません。
別に「選択」にこだわらずに1行ずつ解析して非表示にすれば良いと思います。

【48690】Re:横フィルタ
発言  inoue  - 07/5/2(水) 0:11 -

引用なし
パスワード
   ▼inoue さん:
>別に「選択」にこだわらずに1行ずつ解析して非表示にすれば良いと思います。
「横」でしたね。「1行ずつ解析して」ではなく「1列ずつ解析して」でした。

【48708】Re:横フィルタ
質問  deda  - 07/5/2(水) 19:54 -

引用なし
パスワード
   ▼inoue さん:
>▼inoue さん:
>>別に「選択」にこだわらずに1行ずつ解析して非表示にすれば良いと思います。
>「横」でしたね。「1行ずつ解析して」ではなく「1列ずつ解析して」でした。

ありがとうございます。

一応初心者なりに考えたコードです。

Sub ある行内で検索した文字列を選択()

Dim Target As String
Dim FoundCell As range
Dim Addr As String
Dim SearchArea As range
Dim FoundAddr() As String
Dim i As Long

Target = Application.InputBox("検索文字列入力", "検索", Type:=2)
If Target = "False" Then Exit Sub


Set SearchArea = Rows(1)
Set FoundCell = SearchArea.Find(What:=Target)
If FoundCell Is Nothing Then Exit Sub
Addr = FoundCell.Address

Do
  ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言
  FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納
  Set FoundCell = SearchArea.FindNext(after:=FoundCell)
  i = i + 1
Loop While FoundCell.Address <> Addr And Not FoundCell Is Nothing

'配列に格納された値をコンマ区切りで結合してセル範囲を一括選択
range(Join(FoundAddr, ",")).Select
End Sub

いろんなサイトのサンプルを切ったり貼ったりしてます。
おかしなところがあるかも知れませんが、自分としてはいいとこまで来てると思っています・・・・・・・;
このコードは検索した文字列のセルを選択しますが、
私がほしいのは、検索した文字列を含まないセルを選択してほしいのです。
横フィルタは、そのセルを非表示にすれば完成なのですが・・・・

>1列ずつ解析して非表示にすれば良い
とは、どうすればよいのでしょうか?
まったく他の考え方でもOKです。
教えてください。

【48712】Re:横フィルタ
回答  bykin  - 07/5/2(水) 21:15 -

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

こんなんでええんとちゃいまっか?

Sub test()
  Dim Target As String
  Dim FoundCell As Range
  Dim FirstAddress As String
  
  If TypeName(Selection) = "Range" Then
    If Selection.Rows.Count = 1 Then
      Target = Application.InputBox("検索文字列入力", "検索", Type:=2)
      If Target = "False" Then Exit Sub
      With Intersect(Selection, ActiveSheet.UsedRange)
        Set FoundCell = .Find(Target, LookIn:=xlValues)
        If Not FoundCell Is Nothing Then
          FirstAddress = FoundCell.Address
          Do
            FoundCell.EntireColumn.Hidden = True '見つかる都度非表示に
            Set FoundCell = .FindNext(FoundCell)
            If FoundCell Is Nothing Then Exit Do
            If FoundCell.Address = FirstAddress Then Exit Do
          Loop
        End If
        Set FoundCell = Nothing
      End With
    End If
  End If
End Sub

それと、
>range(Join(FoundAddr, ",")).Select
↑これはアドレスが256文字以上(カンマ等込み)になるとエラーになりまっせ。

試してみてな。
ほな。

【48714】Re:横フィルタ
質問  deda  - 07/5/2(水) 22:28 -

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

ありがとうございます。
やってみました。

実行時エラー'91'
オブジェクト変数またはwithブロック変数が設定されていません。

と出ます。デバックすると
Set FoundCell = .Find(Target, LookIn:=xlValues)
がエラーと出ます。

私、構文とか、まだ理解できていません。
どうすればよいでしょうか?

【48717】Re:横フィルタ
回答  bykin  - 07/5/2(水) 23:21 -

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

・・・ん?
選択範囲と使用済みセル範囲の共通範囲が無いってこと??
でもまあエラーが出るんはよろしゅうおまへんな・・・

とりあえず

With Intersect(Selection, ActiveSheet.UsedRange)
  ↓
With Selection

でいけると思います。
すんまへーん。

【48718】Re:横フィルタ
質問  deda  - 07/5/2(水) 23:35 -

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

こんばんわ。
やってみました。エラーは出ませんでした。
でも、エクセルシートにはこれといって変化なしです・・・・

検索した文字列のセルもそれ以外も特になにも起こりません。
非表示にもなりません・・・なにも・・・

すみません。もう少し!よろしくお願いします。


>
>With Intersect(Selection, ActiveSheet.UsedRange)
>  ↓
>With Selection
>
>でいけると思います。
>すんまへーん。

【48720】Re:横フィルタ
発言  bykin  - 07/5/3(木) 0:00 -

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

・・・ん???
ひょっとして、セルは1個しか選択してへんのでっか?
上のコードは検索対象範囲のセル範囲(1行)を全部選択した場合で書いてます。

任意のセルを選択した状態で、そのセルのある行全体を対象に検索するって
ことやったら、

With Selection
  ↓
With Selection.EntireRow


それとも・・・
全ての行を対象に、検索文字列があれば列の非表示したいんかな?

もしもそういうことやったら、

Sub test2()
  Dim Target As String
  Dim FoundCell As Range
  Dim FirstAddress As String
 
  Target = Application.InputBox("検索文字列入力", "検索", Type:=2)
  If Target = "False" Then Exit Sub
  With ActiveSheet.UsedRange
    Set FoundCell = .Find(Target, LookIn:=xlValues)
    If Not FoundCell Is Nothing Then
      FirstAddress = FoundCell.Address
      Do
        FoundCell.EntireColumn.Hidden = True '見つかる都度非表示に
        Set FoundCell = .FindNext(FoundCell)
        If FoundCell Is Nothing Then Exit Do
        If FoundCell.Address = FirstAddress Then Exit Do
      Loop
    End If
    Set FoundCell = Nothing
  End With
End Sub

こんなんかな?
どのセルを選択してその結果どうしたいのか、質問するときははっきり書いておくれやす。

よろしゅーに。
ほな。

【48722】Re:横フィルタ
質問  deda  - 07/5/3(木) 0:10 -

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

>こんなんかな?
>どのセルを選択してその結果どうしたいのか、質問するときははっきり書いておくれやす。
>
>よろしゅーに。
>ほな。

すごい!でも、惜しい・・・・
このコードは検索文字列を非表示にしますね。
その逆、検索文字列のみを表示させたいのです。

このコードの逆の結果を求めています。

A B A C C D A B

と、並んでいる表に対し、
A を検索すると、その他が非表示になるように・・・・

A A A
という結果になるよう、できますか?
しかし、このいただいたコードを簡単に「逆」の結果にできるのでしょうか。興味。

【48723】Re:横フィルタ
発言  bykin  - 07/5/3(木) 0:36 -

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

>惜しい・・・・

とか

>興味。

とか、まるで他人事やねー。
単なる作成依頼やったらお断りでっせ。

ちょいと気分害してるけど、最初の条件見落としてたから今回だけ・・・

Sub test3()
  Dim Target As String
  Dim r As Range
 
  Target = Application.InputBox("検索文字列入力", "検索", Type:=2)
  If Target = "False" Then Exit Sub
  With ActiveSheet.UsedRange
    .EntireColumn.Hidden = True
    For Each r In .Cells
      If InStr(r.Value, Target) > 0 Then
        If r.EntireColumn.Hidden Then
          r.EntireColumn.Hidden = False
        End If
      End If
    Next
  End With
End Sub

これで打ち止めにさせていただきます。
ほな。

【48725】これです!
お礼  deda  - 07/5/3(木) 1:22 -

引用なし
パスワード
   まさに、イメージどおりです。
ありがとうございました。

重ねて、不愉快な気分にさせてしまったことをお詫びいたします。

自身もこれから精進していきます。
ありがとうございました。

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