- ベストアンサー
エクセルVBAで住所録を作成
住所録シートに次のようにコードを作っています。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$B$1" Then 顧客名検索 ElseIf Target.Address = "$C$1" Then フリガナ検索 ElseIf Target.Address = "$D$1" Then 住所検索 ElseIf Target.Address = "$E$1" Then 郵便番号検索 ElseIf Target.Address = "$A$1" Then オートフィルタ解除 カナ順に設定 Else Exit Sub End If End Sub そして標準モジュールには Sub 顧客名検索() ans = InputBox("顧客名を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=2, Criteria1:="=*" & ans & "*" '2つ目のフィルターに検索文字 End With End Sub Sub フリガナ検索() ans = InputBox("顧客カナを入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=3, Criteria1:="=*" & ans & "*" '3つ目のフィルターに検索文字 End With End Sub Sub 住所検索() ans = InputBox("住所を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=4, Criteria1:="=*" & ans & "*" '4つ目のフィルターに検索文字 End With End Sub Sub 郵便番号検索() ans = InputBox("郵便番号を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=5, Criteria1:="=*" & ans & "*" '5つ目のフィルターに検索文字 End With End Sub Sub オートフィルタ解除() Application.CutCopyMode = False Selection.AutoFilter Range("A1").Select End Sub Sub カナ順に設定() Range("C1").Select ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Clear ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Add Key:=Range("C1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("住所録").Sort .SetRange Range("A2:IV65536") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select Selection.AutoFilter End Sub と入れています。 VISTAで作ったのですが、このファイルを共有にして使おうとすると、XPのパソコンでは、A1セルをダブルクリックすると、コードが黄色になり、マクロが中断されます。 B1~G1は問題なくマクロが実行されるのに・・・。 もう一台のVISTAでは同じ共有状態で使っても問題ありません。 どうすればXPでも問題なく使えるのでしょう?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
回答1に名前が挙ってる、onlyromです。。(^^;;; 当方の好みから言えば先に回答したように バージョンでSortを換える方法ですが、 簡単には2007でも2003のSortメソッド様式が使えますので それを使ってみてください。 '--------------------------------------------- Sub カナ順に設定() Sheets("住所録").Range("A1:IV65536").Sort _ Key1:=Range("C2"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("A2").Select Selection.AutoFilter End Sub '------------------------------------------ 更にいうと、Sheets("住所録")の指定は不要です。 >Sheets("住所録").Range("A1:IV65536").Sort _ Range("A1:IV65536").Sort _ でもOKです。
その他の回答 (4)
すみません。 間違っていました。 ------------------- Sub カナ順に設定() Dim xl_ver As Integer xl_ver = Application.Version If xl_ver <= 11 Then ・ ・ ・ としていただければ、分岐できるかな?と思います。 あとは、2003のコードで、2007でも動くと思います。
お礼
回答ありがとうございます。 今回はonryromさんのコードを使わせていただきました。 同じ事をさせるのにも、いろいろな方法があり難しいですね。 このコードも試してみたいと思います。
- DOUGLAS_
- ベストアンサー率74% (397/534)
[回答番号:No.1] の DOUGLAS_ です。 >どのバージョンでも動くコードの書き方というのはないのでしょうか? そうですね。 先ほどのURLの中身をよ~くご覧いただくとお分かりいただけると存じますが、 >エクセルのバージョン情報で分岐させたらどうでしょうか。 >2003も2007も手元にないのでバージョンがわかりませんが >(2003は確か11.0) と書いてありまして、 If Int(Application.Version)>11 then ・・・・・・・ Else ・・・・・・・ End If というような構文になっております。 「Int(Application.Version)」の部分がエクセルのバージョンを現わす整数値で、Excel 2003 を「11」とすれば、 If Int(Application.Version)>11 then は、Excel 2007 の場合、 Else 以下が、Excel 2003 以前の場合、ということで場合分けをしておりますので、 >どのバージョンでも動くコードの書き方 になっていると思いますよ。 ちなみに、手許の Excel 2003 で Debug.Print Application.Version を実行したところ、「11.0」となりましたので、 If Int(Application.Version)>11 then で場合分けはできると存じます。 >読んでみたのですが、私の知識不足のため内容が理解できません。 これは、Excel 2003 の場合の「Sub カナ順に設定()」をどう書いたらよいのか? というような意味かと存じますが、あいにく、私の手許に Excel 2007 がありませんので「Sub カナ順に設定()」で何をしているのか分かりかねます。 「Sub カナ順に設定()」の操作の内容を日本語でお書きいただければ、Excel 2003 でマクロの記録をしてみますが。。。 まぁ、ちなみに、先ほどのURLの内容で書けば、 Sub カナ順に設定() Range("C1").Select If Int(Application.Version) > 11 Then With ActiveWorkbook.Worksheets("住所録").Sort .SortFields.Clear .SortFields.Add Key:=Range("C1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SetRange Range("A2:IV65536") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Else Range("C1").Sort _ key1:=Range("A2:IV65536"), Order1:=xlAscending, _ Header:=xlNo, _ Orientation:=xlLeftToRight End If Range("A2").Select Selection.AutoFilter End Sub みたいなことになります。
お礼
詳しく書いていただいてありがとうございます。 今回はonryromさんの回答を使わせていただいたのですが、この方法もやってみたいと思います。 みなさんが教えてくださった方法を使いこなすには、私自身もっともっと勉強が必要だと痛感しております。 またよろしくお願いします。
こんにちは。 先に回答がありましたね。 的をはずしてたら、申し訳ございません。 一例です。 ------------------- Sub カナ順に設定() Dim xl_ver As Integer If xl_ver < 11 Then 'Excel2003での処理 Range("A2:IV65536").Select Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Else 'Excel2007での処理 '今現在の設定を記述 End If End Sub -------------------
- DOUGLAS_
- ベストアンサー率74% (397/534)
>A1セルをダブルクリックすると、コードが黄色になり、マクロが中断されます。 とお書きなのは、「Sub カナ順に設定()」の ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Clear の部分ですか? もし、エラーメッセージが >実行時エラー '438': >オブジェクトは、このプロパティまたはメソッドをサポートしていません。 でしたら、 >どうすればXPでも問題なく使えるのでしょう? とお書きのことは、XP とか VISTA とかの問題ではなくて、Excel2003 か 2007 かの問題だと存じます。 下記に、その点についての回答が掲載されていますので、ご参考になさってください。 [回答番号:No.2] の onlyrom さんがお書きの >エクセルのバージョン情報で分岐させたらどうでしょうか。 の部分です。 http://okwave.jp/qa4562359.html
補足
すみません。 読んでみたのですが、私の知識不足のため内容が理解できません。 ただ、ここに書かれてあるのは、2007と2003でコードの書き方を変えるとよいという意味でしょうか? 全てのPCでひとつのファイルを共有したいため、2007とそれ以外のPC用を作るわけにはいかないのです。 どのバージョンでも動くコードの書き方というのはないのでしょうか? 御教授お願い致します。
お礼
丁寧に書いていただいてありがとうございました。 2002で使ってみたところ、問題なく動いているようです。 助かりました。 またよろしくお願いします。