アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いします。エクセルは2013です

エクセルもよくわからないのに、gooの皆さんにマクロを1から教えてもらって
少しづつ機能を追加していったら、シートモジュールのマクロが、空白行とコメントを
除いて1300行近くに膨れ上がってしまいました

先日もgooの皆さんに教えてもらって、180行のIF文を20行に削減できました
ありがとうございました

今回のマクロもまた、うまい人が書けばもっと短くなるような感じがするので
よい方法があれば教えてください

マクロは以下のようになっています
1、 2行から40行に色々なデータが表示してあります
2、 それらはA列の2行から40行に a から d を書いてグループ分けしてあります
3、 マクロは a,b と書いてあるセルをWクリックしたら、aかbをA列の2行から
   40行に書いてある行を表示するマクロです

4、 考え方としては、「Wクリックしたセルに書いてあるアルファベットと同じものが
   A列に書いてある行を表示する」でよいと思います

5、 ところが、例によって、私のマクロは、Wクリックしたセルにaと書いてあったらaと
   書いてある行を表示、同様にabと書いてあったら a or b と書いてある行を表示に
   なっています

そこで質問ですが
4の方法で処理するマクロにするには、どう書き換えたらよいでしょうか?

以下は現状のマクロの肝心な部分です

If Not Intersect(Target, Rows(41), Range("S:S")) Is Nothing Then 'by goo
 ' S41をWクリックした(そのセルには "ab行" と書いてある)
   Cancel = True
   Application.ScreenUpdating = False
    'その他の処理

   For i = 2 To 40  ' A列の2行から40行の間で
     If UCase(Cells(i, 1).Value) = "A" Or UCase(Cells(i, 1).Value) = "B" Then
       ' a or A or b or B と書いてある行を表示
       Rows(i).Hidden = False
     Else
       ' それ以外は非表示
       Rows(i).Hidden = True
     End If
   Next i
   Application.ScreenUpdating = True
End If

うまく説明できていない場合は補足させてください
よろしくお願いします

質問者からの補足コメント

  • 説明が抜けていました。補足させてください

    すでに何も書いてないWクリックセルが3つ用意してあります

    ユーザーは、あらかじめ、その3つのセルにab bd ac などど
    自分好みのグループ行を書いておいて、Wクリックでその行を表示するように
    したいです

    失礼しました

      補足日時:2016/12/19 22:10
  • HAPPY

    ママチャリさん、こんばんは。先ほどは大変お世話になりました。

    完璧なエラー処理がされていて大変勉強になりました

    下記の要領でうまくいきました。まだ全部を直していませんが、大幅に行削減が達成できそうです
    親切に教えていただきましてありがとうございました。

    文字数の関係で送り側のほんの一部です  

    If Not Intersect(Target, Rows(41), Range("K:K")) Is Nothing Then
     Cancel = True          'abc行と表示
     Call 行表示(Target) 'by goo ママチャリさん
    End If

    受け側です(最近教えてもらって覚えました)
    Sub 行表示(ByVal Target As Range)

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/12/20 01:44

A 回答 (1件)

思ったほど、シンプルになりませんでしたが、こんな感じでしょうか。


ダブルクリックするセルは、特に限定していませんので、必要であれば追加してください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Range
Dim str1 As String
Dim str2 As String
Dim i As Long
Dim c As String
Cancel = True
Application.ScreenUpdating = False
str1 = StrConv(Target.Value, vbLowerCase + vbNarrow)
For Each r In Range("A2:A40")
str2 = StrConv(r.Value, vbLowerCase + vbNarrow)
For i = 1 To Len(str1)
c = Mid(str1, i, 1)
If c Like "[a-z]" Then
If InStr(str2, c) <> 0 Then Exit For
End If
Next i
If i > Len(str1) Then
r.EntireRow.Hidden = True
Else
r.EntireRow.Hidden = False
End If
Next r
Application.ScreenUpdating = True
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ママチャリさん、こんばんは。最近お世話になってばかりです
先日は詳しく説明していただきありがとうございました
お陰様でまた少し進歩できました

早速教えていただきありがとうございます
これほど難しいコードとは思いませんでした
書いていただいたコードが何をしているかは、ぼんやりとですがわかります
分かると書けるでは大違いですが・・・

Likeはgooで教えていただいてわかりますが
Like "*a*" などしか知らなくて
Like "[a-z]"  この書き方は初めて知りました。色々な場面で使えます
ありがとうございます

これからじっくりやってみます。
教えていただいた通りにコピーして使っているだけだと進歩しないので
全行コメントが書けるように勉強します

また補足で報告させてください。
迅速に教えていただいてありがとうございました。

お礼日時:2016/12/19 23:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!