[[20050405225704]] 『略語辞書の作成』(橋の下から) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『略語辞書の作成』(橋の下から)

A列にローマ字で略語(二文字から五文字)に対して、その意味をB列に書き込んでます。
検索は、そのままスクロールさせてましたが、段々と多くなり、フィルターを使用してA列の初めの一文字か二文字を入力して「で始まる」検索する様になりました。
C1のシートが空いてますので、そこに検索の文字を書き込み、ボタンひとつ程度での検索マクロの登録や他の方法で、書き込んだ文字から、A列の略語を検索する方法を教えて下さい。
例えばC1に「A」と書き込むとB列のAで始まる事のみ、多ければC1に再度「AF」とかの次の文字を足して入力してとしたいと思います。
コンソールボックスに検索文字を書き込み、検索ボタンでも良いのですが、出来るだけ簡単にしたい(検索側が1番ですが、作る側も・・)と思ってます。


 エクセルの基本機能で[編集(E)]メニュー→[検索(F)]もあります。

 また[データ(D)]メニュー→[フォーム(O)]で表示されたフォームで
 [検索条件(C)]ボタンを押して略号を入力して[次を検索(N)]ボタンを押す。

 あえてマクロにする必要はなさそうに思います。
 (kazu)

コントロール+Fですね・・簡単に誰でも出来そうですが、略語は多く順不同に勝手に増やしてます、並べ替えを定期的に管理するのも毎日は出来ない。
またこの場合では頭の二文字とは限らず、二番目三番目でも検索に合致してしまうのですが・・
又、略語でabで始まる物をから選ぶ場合も有りますので・・使い辛い様です。

 ほんならこんなんどうでっか?

 1)Alt+F11でVBEを開く
 2)プロジェクト欄のSheet1をWクリック
 3)下のコードをコピペ
 4)念のため「挿入」→「標準モジュール」を選択してそこにtestをコピペ
    これは何かでエラーが出た時実行してくらはい。

 エクセルに戻りC1に検索したいデータを入力してみておくんなはれ。
 どうでっか?ばっちりでっしゃろ・・・(笑

 これは余談
 >あえてマクロにする必要はなさそうに思います。
 私の遊びを奪い取らんとってえな・・・(笑
     ほな(弥太郎)
 ’Sheetモジュールへ
 '----------------------------------------
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long
    Dim data_len As Integer
    Dim data
    If Target.Address <> "$C$1" Then Exit Sub
        Application.EnableEvents = False
        data = Target
        Range("c:d").Clear

        If data <> "" Then
            Range("c1") = data
            n = 2

            For i = 1 To Range("a65536").End(xlUp).Row
                data_len = Len(data)
                If Left(Cells(i, 1), data_len) = data Then
                    Cells(i, 1).Resize(, 2).Copy Destination:=Cells(n, 3)
                    n = n + 1
                End If
            Next i
        End If
    Application.EnableEvents = True
 End Sub

 '標準モジュールへ
 '----------------------------
 Sub test()
    Application.EnableEvents = True

 End Sub


 ずっげー(●^o^●)(野次 馬子)
 すみません全然関係ないですが、試してみたら、魔法のようでした。

 尊敬する、弥太郎さんのコードを借りいたしまして、、、
 こんなのどうせっしゃろ(笑

 ’Sheetモジュールへ
 '----------------------------------------
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long, l As Long
    Dim data_len As Integer
    Dim data
    If Target.Address <> "$C$1" Then GoTo hukumu
        Application.EnableEvents = False
        data = Target
        Range("C:F").Clear
        data_len = Len(data)

        If data <> "" Then
            Range("c1") = data
            n = 2

            For i = 1 To Range("a65536").End(xlUp).Row
                If Left(Cells(i, 1), data_len) = data Then
                    Cells(i, 1).Resize(, 2).Copy Destination:=Cells(n, 3)
                    n = n + 1
                End If
            Next i
        End If
    Application.EnableEvents = True

 hukumu:
    If Target.Address <> "$D$1" Then Exit Sub
        Application.EnableEvents = False
        data = Target
        Range("C:D").Clear

        If data <> "" Then
            Range("D1") = data
            n = 2

            For i = 1 To Range("a65536").End(xlUp).Row
            data_len = Len(Cells(i, 1))
                For l = 1 To data_len
                    If Mid(Cells(i, 1), l, 1) = data Then
                        Cells(i, 1).Resize(, 2).Copy Destination:=Cells(n, 3)
                        n = n + 1
                        l = data_len
                    End If
                Next l
            Next i
        End If
    Application.EnableEvents = True

 End Sub

 '標準モジュールへ
 '----------------------------
 Sub test()
    Application.EnableEvents = True

 End Sub

 C1 → 頭の文字からの検索(文字数複数可)
 D1 → 1文字のみ入力(含むものを検索)

 (キリキ)(〃⌒o⌒)b

 おっ!
 ナムァイキな(笑
 Like演算子なんかを使うとCells(i,1)のセルを全部Forで廻す必要がなくなる〜。
 先ずはイチャモンいっぱぁつ。
 イチャモン屋も結構気持ちのええもんやなぁ。(笑
     ほな(弥太郎)(〃⌒o⌒)b

 >Like演算子なんかを使うとCells(i,1)のセルを全部Forで廻す必要がなくなる〜。
 わざわざのご指導、ありがとうございます〜♪
 Φ(。。 )メモメモ

 本日は仕事の為、時間のあるときにやってみます〜☆
 (キリキ)(〃⌒o⌒)V

 弥太郎さんへ
 出されていた宿題を下記のようにしてみました〜♪

         A             B               C        D
  1  一文字検索  文字先頭から検索     用語名称   意味	
  2 l          l                l	
  3   ↑1文字入力       ↑            uh        1      
  4      先頭より検索する文字入力       asd       2	    		
  5                                   dis       3		
  6                                   fhds      4		
  7                                   ajgfk     5		
  7                                   AsKj      6		
  8                                   gnrij     7		
  9                                   reix      8		
 10                                   ergj      9		
 11                                   hAg      10		

 ※B1には、"*"や"?"も使用できるようです
 ※A1に、複数を字を入れても2文字目からは削除します
 ※大文字・小文字の区別はなしです

 Option Compare Text
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long
    Dim data
    If Target.Address = "$B$2" Then
        Application.EnableEvents = False
        data = Target
        Range("A2:B65536").ClearContents
        If data <> "" Then
            Range("B2") = data
            n = 3

            For i = 3 To Range("C65536").End(xlUp).Row
                If Cells(i, 3) Like data & "*" Then
                    Cells(i, 3).Resize(, 2).Copy Destination:=Cells(n, 1)
                    n = n + 1
                End If
            Next i
        End If

    Else
        If Target.Address <> "$A$2" Then Exit Sub
        Application.EnableEvents = False
        data = Mid(Target, 1, 1)
        Range("A2:B65536").ClearContents

        If data <> "" Then
            Range("A2") = data
            n = 3

            For i = 3 To Range("C65536").End(xlUp).Row
                If Cells(i, 3) Like "*[" & data & "]*" Then
                    Cells(i, 3).Resize(, 2).Copy Destination:=Cells(n, 1)
                    n = n + 1
                End If
            Next i
        End If
    End If

    Application.EnableEvents = True

 End Sub

 >イチャモン屋も結構気持ちのええもんやなぁ。(笑 
 是非、いちゃもんつけてください(^^)

 修正(利便性を考慮し、データと出力部分を入れ替えました)
 (キリキ)(〃⌒o⌒)b

 まあなんと、見事なでけばえ!!、100点満点ですわ、えぇ。
 特にLike演算子を即座にマスターするなんざぁ、尊敬に値しまっせ、ホンマ。
 いや、おそれいりました。
 ほな・・・

 で終わってしもたら
 >是非、いちゃもんつけてください
 のご要望に応えん事になりますんで、無理矢理イチャモンつけときまっさぁ。(笑
  Application.EnableEvents = Falseが2回使われてますけど、これなんとか一回で
 おさまりまへんかぁ?

 n=3 も分岐毎に初期化してますけど、これもでけたら一回に・・・
 それに関連した作業ですけど
            For i = 3 To Range("C65536").End(xlUp).Row
                If Cells(i, 3) Like data & "*" Then
                    Cells(i, 3).Resize(, 2).Copy Destination:=Cells(n, 1)
                    n = n + 1
                End If
            Next i
 この作業も、仮に分岐が増えたばやいも分岐毎に同じ事を書かなあきまへんわなぁ。
 Cells(i,3) Like 変数    にしてしもうて サブルーチンでやってしもうたら
 一回の記述で済みまっしゃろ。
 例えば
            Select Case Target.Address(0, 0)
                Case "$B$2"
                    find_data = data & "*"
                    work (find_data)
 といった塩梅に変数find_dataにおさめてそれを引数にしたうえでworkという
 サブルーチンに飛ばして処理するような方法もありますしなぁ。
 それとRange("C65536").End(xlUp).Rowも同じ数値を得られる筈ですから
 変数に収めて使用すると、煩わしさが解消されますからなぁ。

 以上無理矢理イチャモンつけました〜(笑
 ここも長うなったらアカンのんで弥太郎流マクロを「弥太郎の部屋」へ書いてみます
 わ(暇な時)。
 せやけど、私より優れたんを書いたら、わかってまっしゃろなあ?
 あんさんの人格欄に×印がはいります〜(笑
   ほな・・・(弥太郎)(〃⌒o⌒)b


 大変解かり易い、説明でありがとうございました。
ご返事が遅れて申し訳有りません。ついでと言っては失礼ですが・・
1,A列の文字が半角、全角関係なく検索出来る方法が有りましたらお願いいたします。
2,a列が小文字でも大文字でも検索出来る方法が有りましたらお願いいたします。
理由は、1,書き込む方が多く、半角だったり、全角だったり。
2,一般的には小文字で使用する略語はA列に小文字で入力してあります。が時には大文字で使用も有り得るので、どちらでも検索出来ると便利なのですが・・
(橋の下から)

 横から、失礼します〜

 >1,A列の文字が半角、全角関係なく検索出来る方法が有りましたらお願いいたします。
 >2,a列が小文字でも大文字でも検索出来る方法が有りましたらお願いいたします。
 ↑両方とも同じことですよね??

 大文字・小文字でヒットさせたいってことですよね?
 σ(^o^;)のにも入ってますが、頭に↓を入れるとそうなりますよ(^^)
 Option Compare Text

 (キリキ)(〃⌒o⌒)b

キリキさん・・書き込んであったのですね。
 有難う御座いました。 
 とてもスームズに検索出来る様になりました。 
 素人の為にここまでして頂き感謝感謝です。
 (橋の下から)

 ではでは、
 もう少しいじってみたものを〜

 大文字・小文字両方OK
 Sheet2のA列に、単語。B列に、意味。←各3行から
 Sheet1のA列の3行に、一文字検索。B列の3行に、複数検索文字。
 として、、、

 Option Compare Text
 Option Explicit
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long
    Dim data As Variant, data_C As Variant, key As Variant
    Dim Mydata(1 To 2) As String
    Dim MySh1 As Worksheet, MySh2 As Worksheet

    Set MySh2 = Worksheets("Sheet2")
    n = 3

    Select Case Target.Address
        Case "$B$2"
            data = Target
            key = "$B$2"
            data_C = data & "*"
        Case "$A$2"
            data = Mid(Target, 1, 1)
             key = "$A$2"
            data_C = "*[" & data & "]*"
        Case Else: Exit Sub
    End Select

    Application.EnableEvents = False

    Range("A2:B65536").ClearContents
    If data <> "" Then
        Range(key) = data
        For i = 3 To MySh2.Range("A65536").End(xlUp).Row
            If MySh2.Cells(i, 1) Like data_C Then
                With MySh2
                    Mydata(1) = .Cells(i, 1)
                    Mydata(2) = .Cells(i, 2)
                End With
                Cells(n, 1) = Mydata(1)
                Cells(n, 2) = Mydata(2)
                n = n + 1
            End If
        Next i
    End If

    Application.EnableEvents = True

 End Sub

 で如何でしょう〜♪
 (キリキ)(〃⌒o⌒)b

こんなに長く書いてて良いのかは解かりませんがもう少し、ページをお貸し下さい。
 キリキさんへ、Sheet1検索が2行目で行えるのですか・・
 A列の検索は検索文字に関係なく、只単に、Sheet2のA3からの順不動で全部が
 表示されてしまいます。
 B2では心地よい、検索が出来てます。
 もし新たに書いて頂けますと、全体の書き込みから何かが勉強出来る気がして
 書かせて頂きました。
 今はただ、コピーして貼り付けてるでけです。
 (橋の下から)

 橋の下からさんへ
 遅くなりました。。。
 ちょっと忙しかったので、レスが遅くなってしまいました。すいませんm(_ _)m

 >Sheet2のA列に、単語。B列に、意味。←各3行から
 >Sheet1のA列の3行に、一文字検索。B列の3行に、複数検索文字。
 上記Sheet1の検索文字入力場所は、A2とB2でしたね・・・(汗

 >A列の検索は検索文字に関係なく、只単に、Sheet2のA3からの順不動で全部が
 表示されてしまいます。  
 どんな文字を入力しました?
 σ(^o^;)ので確認したのですが、きっちり出るみたいなのですが。。。

 ちょっと動きが遅かったですが、、、
 試しに、下記のコードでは如何でしょう?

 Option Compare Text
 Option Explicit
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long
    Dim data As Variant, data_C As Variant, key As Variant, Mydata As Variant
    Dim MySh1 As Worksheet, MySh2 As Worksheet

    Set MySh1 = Worksheets("Sheet1")
    Set MySh2 = Worksheets("Sheet2")
    n = 3

    Select Case Target.Address
        Case "$B$2"
            data = Target
            key = "$B$2"
            data_C = data & "*"
        Case "$A$2"
            data = Mid(Target, 1, 1)
            key = "$A$2"
            data_C = "*[" & data & "]*"
        Case Else: Exit Sub
    End Select

    Application.EnableEvents = False

    Range("A2:B65536").ClearContents
    If data <> "" Then
        Range(key) = data
        For i = 3 To MySh2.Range("A65536").End(xlUp).Row
            If MySh2.Cells(i, 1) Like data_C Then
                With MySh2
                    .Cells(i, 1).Resize(, 2).Copy
                    With MySh1
                        .Cells(n, 1).PasteSpecial Paste:=xlPasteValues
                    End With
                End With
                n = n + 1
            End If
        Next i
    End If

    Application.EnableEvents = True

 End Sub

 (キリキ)(〃⌒o⌒)b

A2の検索がうまく行かないと思ったのは私の勘違いでした。
 略語が多すぎたのと、丁度検索文字が初めのCとかDとかの使用量の多いので
 試してた為、Aから始まる略語と重なってた様です。
 A2の検索は表示量が多すぎ、調べずらいと思ってましたが、別のブックに
 Sheet2のA列とB列を入れ替え和文(漢字一文字)から略語を調べるのに丁度良い
 ことが判りました。
 使い勝手は前回書いて頂いたマクロ方がが良い様です。

 お時間が有りましたらで結構です。
 前回書いて頂いたマクロを変形させて、Sheet1のA2には英字検索、頭から数文字で
 Sheet2のA列から検索
 Sheet1のB2には漢字検索、一文字で〜を含むをSheet2のB列から検索・・の場合で
 一つのブックで、両側からの検索が出来のですが・・
 書いて頂ける場合には、前回のマクロの変形で違いの見比べが出来る程度だと助かります。お忙しいのでしたらもう充分ですよ本当に。
 「略語→日本語検索辞書」と「日本語→略語辞書」の二つを一度手に入れてしまい、
 驚いてます。有難う御座いました。
(橋の下から)

 いや〜 宿題(希望)まで出して頂いて、こちらとしても感謝しております。
 (嫌味とかではありませんよ〜♪ 勉強の機会を頂いて本当に嬉しいのです☆)

 ご希望のものは、検索後に Sheet1のA2から表示していくのでいいのですよね?

 Option Compare Text
 Option Explicit
 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long, n As Long
    Dim Mydata(1 To 2) As String
    Dim data As Variant, data_C As Variant, key As Variant
    Dim MySh2 As Worksheet

    Set MySh2 = Worksheets("Sheet2")
    n = 3

    Select Case Target.Address
        Case "$B$2"
            data = Mid(Target, 1, 1)
            key = "B"
            data_C = "*[" & data & "]*"

        Case "$A$2"
            data = Target
            key = "A"
            data_C = data & "*"
        Case Else: Exit Sub
    End Select

    Application.EnableEvents = False

    Range("A2:B65536").ClearContents
    If data <> "" Then
        Range(key & 2) = data
        For i = 2 To MySh2.Range(key & "65536").End(xlUp).Row
            If MySh2.Range(key & i) Like data_C Then
                With MySh2
                    Mydata(1) = .Cells(i, 1)
                    Mydata(2) = .Cells(i, 2)
                End With
                Cells(n, 1) = Mydata(1)
                Cells(n, 2) = Mydata(2)
                n = n + 1
            End If
        Next i
    End If

    Application.EnableEvents = True

 End Sub

 希望通りに動けばいいのですが・・・
 (キリキ)(〃⌒o⌒)b

 パーフェクトです。希望通りの動きをしており驚いてます。
 B2の検索には上の方に書いてある「一文字検索」の定義が入ってるのだと思いますが
 これを一文字検索にしない・・つまり、複数の文字で検索させるのにはどこかの列を
 削除させるだけで出来るものなのでしょうか?
 それとも書き直し必要でしょうか?
(橋の下から)

 おはようございます。
 一文字検索では無くしたいと言う事ですね?

 では、

    Set MySh2 = Worksheets("Sheet2")
    n = 3
    data = Target                       '←追加

    Select Case Target.Address
        Case "$B$2"
            'data = Mid(Target, 1, 1)   ←削除
            key = "B"
            'data_C = "*[" & data & "]*"←下記に変更
            data_C = "*" & data & "*"   '←[ ]を取る

        Case "$A$2"
            'data = Target              ←削除
            key = "A"
            data_C = data & "*"
        Case Else: Exit Sub
    End Select

 こんな感じに変更してみてください〜(^^)

 後、ワイルドカード使用の検索もしてみてくださいね☆
 便利だと思いますよ〜♪

 例:一日一善を調べたいが
      ~~~~
       ↑を忘れてしまった・・・

 検索文字入力に 一*善 と入力
                ~~~
                ↑全角でも、半角でもOK
 * → 任意の数の文字
 ? → 任意の 1 文字
 ※詳しくは、エクセルのヘルプで【ワイルドカード文字】で調べてください

 (キリキ)(〃⌒o⌒)b

 長い間、本当に長い間ご教授ありがとう御座いました。
 複数文字を含む検索も上記のまま書き直して、検索の早い辞書となりました。
 【ワイルドカード文字】・・上の方に、 ※B1には、"*"や"?"も使用できるようです
 の意味がやっと解かりました。今まで「Ctrl+F」検索はしてましたがワイルドカード
 は知りませんでした。
 初めに素人の為にAlt+F11の使い方から書いて頂いた弥太郎さん、素人に最後まで
 お付き合い頂いた キリキさん有難う御座いました。
 この略語辞書の作成は全文大事に保存させて頂きます。
(橋の下から)            

 お礼を言われて、大変嬉しく思います。
 初めて、本格的なマクロを作成したような気がしてドキドキでした(^^;)
 何せ、元が弥太郎先生のコードですから、、、
 緊張しました〜
 とにかく、無事に解決できたようで何よりです〜♪

 橋の下からさん、σ(^o^;)もあなたにお礼を言わせてください。
 ありがとう

 (キリキ)(〃⌒o⌒)b

(橋の下から) <(_ _)>

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.