[[20040902184927]] 『Enterを押してセル内容を変更させるマクロを』(すがやっち) ページの最後に飛ぶ

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

 

『Enterを押してセル内容を変更させるマクロを』(すがやっち)

[Enterを押して、セルの内容を変更させるマクロを作りたい]

早速ですが、質問させていただきたいと思います。
宜しくお願いします(前回の質問から間もないですが…)

以下のようなマクロがあります。C3セルに文字を入力し、Enterを押すと、別のマクロ(C3の入力値を基にして、検索を開始する)が実行されるというものです。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("C3").Address Then

 ⇒  
  Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"

  End If

End Sub

上記記述の⇒のところに、例えばC3セルに 田中 と入力していたら、*田中* となるようなマクロを設定したいと考えています(要は、その後のマクロで田中を含む値を検索したいわけなのです)。

いろいろと検討してみましたが、うまくいきませんでした。例えば以下のように設定してみましたが、エラーが表示されてしまいました。

Range("C3").value = "*"&"Range("C3").value"&"*"

どのようにすればうまくいくものなのでしょうか?
皆さん、宜しくお願いします。


 単純に変数として
 aa=Target.Address として、
 検索する文字に aa を入れてやってはどうでしょう。
 検索では、完全一致ではないの選択をしていれば、単純に田中で 田中太郎や 大田中一郎も検索されますよ。

 (川野鮎太郎)


回答ありがとうございます。ただ…申し訳ありません。あまり理解できませんでした。マクロをaa=Target.Addressとそのまま記述すればよろしいのでしょうか?aaが変数と いうのはわかりますが、「検索する文字にaaを入れる」というのはどういった事でしょうか?

また検索で、「完全一致ではないの選択」というのはどこで設定するのでしょうか?それはExcelのメニューバーかなにかで行えるのでしょうか?それともマクロの記述が別途必要ということでしょうか?

理解力がなく、質問ばかりで非常に申し訳なく思いますが、宜しくお願いします。


 (*'ω'*)......ん?
 >Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"ってことは、
 検索するマクロはあるってことですよね。
 Target.Address = Range("C3").Address Then でTrue だったときの
 C3の値が田中だったら、
 aa=Target.Address で aaに田中が代入されているはずですから、
 Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"の中に

 Cells.Find(What:="100", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

 こんなのがあるはずですから、"100"のところに aa を入れてやればどうでしょう。

 >>完全一致ではないの選択 は、上記の MatchCase:=False のところが、
 MatchCase:=True になってたら、完全一致で検索されていることになります。
 (川野鮎太郎)


すいません。検索するマクロなのですが、フィルタオプションをベースにしています。
以下に記述します。

Range("B9:G4000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _

        Range("B2:G3"), Unique:=False

なので、川野さんが仰る、What:="100"も、MatchCase:=False もどちらの記述もないのです。

ただわかったことは、*田中*としなくとも、完全一致ではない検索(入力した文字列を含む検索)が出来ればそれでよいということがわかりました。他にもっとよい方法がありましたら、知恵をお貸しください。宜しくお願いします。


 話がよく分らないので、コードの一部分だけに反応します。
>Range("C3").value = "*"&"Range("C3").value"&"*" 
Range("C3").Value = "*" & Range("C3").Value & "*"
で前後にアスタリスクが付きました。(「"」を省いただけです。)
完全一致の検索はExcelのバージョンによって設定方法が若干異なるようです。
↓が参考になりませんでしょうか?   (Hatch)
http://support.microsoft.com/default.aspx?scid=kb;ja;402757


 フィルタオプションを使ったことが無かったので、?(゜_。)?だったんですが、
 こんな方法なら出来るようになりました。
 C3の値でフィルタするようですが、入力はC1では駄目でしょうか。
 そうしないと、Worksheet_Changeの場合には、C3が変わると*を付けた時点でループしてしまいます。

 Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address <> Range("C1").Address Then Exit Sub

 Range("C3") = "*" & Range("C1")
 Range("B9:G4000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:G3"), Unique:=False

 Range("C3") = Target

 End Sub

 これでも役目は果たすと思います。(多分
 (川野鮎太郎)


Hatchさん、川野さん、いろいろとありがとうございます。
完全一致の検索の方法なのですが、指定のページを拝見したところ、*は手入力で設定しなければいけないようですね。これをマクロでやれるようにしたいのです。また

>Range("C3").Value = "*" & Range("C3").Value & "*" 

の記述では
 

>Worksheet_Changeの場合には、C3が変わると*を付けた時点でループしてしまいます。

確かに川野さんが仰るとおりループしてしまいます。一体何故なんでしょうか…。私としては入力欄はC3で譲れないところです(見栄えだけが理由ですが…)
何とかC3を入力欄にして、部分一致検索ができるような記述は出来ないでしょうか?

何度も申し訳ありません。よろしくお願いします。


 こう?
(夏目雅子似)
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
        If Target.Address = Range("C3").Address Then
            Target.Value = "*" & Target.Value & "*"
            ' Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"
        End If
    Application.EnableEvents = True
End Sub


 ぉお!!(゚ロ゚屮)屮と思って今試してみたら、Application.EnableEvents = Falseのせいで、
 C3の値が変わらないのでフィルタが上手くいかないようです(ノ_・。)
 (川野鮎太郎)


 >C3セルに文字を入力し、Enterを押すと
 うん?何かの間違いじゃないの??
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$C$3" Then Exit Sub
    Application.EnableEvents = False
        Target.Value = "*" & Target.Value & "*"
    Application.EnableEvents = True
    ' Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"
End Sub
(夏目雅子似)


 これって、川野鮎太郎さんだけがC1でC3を変えようとしてるだけじゃないの??
(夏目雅子似)


 いえいえ、夏目さんのをそのままコピペしたのでそれは無いんですけど・・・
 すいません、やはり自宅のPC少し変みたいです><
 挙動がバラバラ_/ ̄|○ il||li
 (川野鮎太郎)


 うん?変わらない??
 Application.EnableEvents = False
 のままじゃないの?どこかで、
 Application.EnableEvents = True
 を走らせてみたら?
(夏目雅子似)


 そう思って標準モジュールでApplication.EnableEvents = Trueに頑張ってもらったんですが(^_^A;
 一度再起動してみます_/ ̄|○ il||li
 ==☆((((((((( ;^ー^)ノ いってきま〜す♪          再起動
 (川野鮎太郎)


 ごめんなさいm(_ _)m 
 フィルタ自体も動きがおかしいのでまた明日やってみます。
 夏目さんので良いはずです。ぺこり(o_ _)o))
 (川野鮎太郎)


 夏目さん、会社でやったら上手くいきました^^
 お手間取らせてすいませんでしたm(._.)m ペコッ
 (川野鮎太郎)


みなさん、ありがとうございました。非常に参考になりました。
大変お手数をおかけいたしました。失礼します!

すいません、あと一つよろしいでしょうか・・・。
以下の記述で、

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address <> "$C$3" Then Exit Sub
    Application.EnableEvents = False
        Target.Value = "*" & Target.Value & "*"
    Application.EnableEvents = True
    ' Application.Run "'予算センタ検索システム(9.1現在).xls'!検索"
End Sub

C3セルの他に、E3とF3も加えたい(E3とF3のセルが変更されたら、C3と同様にマクロが実行されるようにしたい)と思います。
その場合は、どういった記述になりますでしょうか?

お忙しいところ大変恐縮ですが、宜しくお願いします。


 If Target.Address <> Range("C3").Address And Target.Address <> Range("E3").Address And Target.Address <> Range("F3").Address Then Exit Sub
 に変えてやればいいのかな。
 (川野鮎太郎)

 ↓こちらが参考になりませんか?
(夏目雅子似)
[[20040708005225]]『シートの検索』(初心者) 

 ↑のIntersect って具体的にはどういう感じで表すんですか?
 _〆\(..;) メモメモしただけで、身についてない_/ ̄|○ il||li
 ご指導('-'*)ヨロシクお願いします♪
 (川野鮎太郎)


 なんか呼ばれたような・・・・ 

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count <> 1 Then Exit Sub
    If Application.Intersect(Target, Range("C3,E3,F3")) Is Nothing Then Exit Sub
    MsgBox "ok"
 End Sub 

  (INA)

 ぉお!!(゚ロ゚屮)屮 出来ました^^v
 クリックしたセルの値と、Range("C3,E3,F3")の値を比較して、同じセルが無いときに
 Exit Sub となるわけですね。
 VBAのヘルプでIntersectで調べて、一生懸命以下のようなことを試していました_/ ̄|○ il||li
 ' Set isect = Application.Intersect(Range("C3"), Range("E3"), Range("F3"))
 ありがとうございました。
 ※質問者のすがやっちさん、横やり入れてすいませんでした。
 (川野鮎太郎)

いえいえ、とんでもないです。こちらこそ勉強になりました。ありがとうございました。


コメント返信:

[ 一覧(最新更新順) ]


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