[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『郵便番号ファイルを自動で開きたい』(ノム)
郵便番号から住所を自動で表示させようとして悩んでいます!
郵便番号のデータサイズが大きいため別ファイル(csv)としています。
「〒」ボタンをクリックすると、
\x{fffd}@ファイルが開いていないときはメッセージを出して呼び出し(ファイルオープン)させる。
\x{fffd}Aファイルが開いているときは何も表示させない。
このようなマクロコードを教えて頂きたいのですが?
どうぞ宜しくお願いします。
(ノム)
[エクセルのバージョン]
Excel2003
[OSのバージョン]
WindowsXP
この手のものは、ネット上にたくさんあると思います。 参考になれば・・・ (SHIOJII)
http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4GGLD_ja___JP212&q=VBA+%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%80%80%e4%bd%8f%e6%89%80
郵便番号を取り込む方法は下記のとおりVLOOKUP関数で別ファイル(〒.csv)から取り込むようにしています。
=IF($I$31="","",IF(ISERROR(VLOOKUP($I$31, 〒.csv!$A$2:$B$14212,2, FALSE)),"",VLOOKUP($I$31,〒.csv!$A$2:$B$14212,2, FALSE)))
今回の質問は、別ファイルが開いているときは何もせずに、開いていないときは「〒番号ファイルが開いていません ! 開きますか Y/N 」
というメッセージを表示させて「Yes」をクリックすると(〒.csv)ファイルを開きたいのです。
これを何とかしたいのですが・・・・・
(ノム)
こんなので上手く行きますか? 「ファイルを開く動作」の所へは マクロの記録を取った物を差し込んでください。 Sub 〒CSVを開く() Dim kbn As Workbook Dim gbn As String, hbn As String Application.ScreenUpdating = False gbn = ActiveWorkbook.Name hbn = "〒.csv" '★1.「〒.csv」と、現在開いているブック名を一つずつ比べる。 For Each kbn In Workbooks If kbn.Name = hbn Then '同じだったら Exit Sub 'マクロ終了 End If Next '★2.メッセージボックスを出して ファイルを開くか確認 ' (途中で終了していない = 〒ファイルは開いていない と言う事なので。) If MsgBox("〒番号ファイルが開いていません!" & Chr(10) & "開きますか?" _ , vbYesNo + vbExclamation, "開くの?") = vbNo Then Exit Sub 'Noが選ばれたらマクロ終了 Else On Error GoTo err 'エラーが出たら、errの行に移動 '★3.ファイルを開く '////////////////////////////// '// // '// ファイルを開く動作 // '// // '////////////////////////////// End If '★4.最初に開いていたブックをアクティブにする Windows(gbn).Activate '★5.エラーの時の処理 err: If err Then MsgBox "ファイルが開けませんでした。" End If Application.ScreenUpdating = True End Sub
(HANA)
(HANA)さん ありがとうございました。
私のイメージの通りでした。
日曜日の貴重な時間で回答頂き大変ありがとうございました。
感謝!
(ノム)
主要部分の変更ではないのですが 「Application.ScreenUpdating」の2行を追加しました。
[〒]ボタンを押すことで、確認をして開く と言う作業は ○通常は開いておきたくない のですかね?
もしも、途中でハタと気づいて「開きたい」なんて事が無い場合で ○気をつけて開く様にしてるんだけど、忘れるんだよね。 なんて時は「auto_open」を使うのも良いかもしれませんね。 https://www.excel.studio-kazu.jp/mag2/backnumber/mm20040817.html 【エクセル・マイスター】より『ブックが開いたとき自動で』
(HANA)
(HANA)さん 色々とありがとうございました。
[〒]ボタンを押すことで、確認をして開く と言う作業は
○通常は開いておきたくない のですかね?
については、起動を少しでも早くしたいため、ボタン選択としました。
また、「auto_open」も実行していたのですが、
やはり起動に時間がかかるため中止しました。
今回作っているものは、色々な人に使ってもらうため、クイックレスポンスをとりました。
最終的には下記のようになりました。
Sub 〒CSVを開く()
Dim kbn As Workbook Dim gbn As String, hbn As String gbn = ActiveWorkbook.Name hbn = "〒.csv" For Each kbn In Workbooks If kbn.Name = hbn Then Exit Sub End If Next If MsgBox("〒番号ファイルが開いていません!" & Chr(10) & "開きますか?" _ , vbYesNo + vbExclamation, "開くの?") = vbNo Then Exit Sub Else On Error GoTo err
ChDir "C:\Documents and Settings\nomu\デスクトップ\定期検査" Workbooks.Open Filename:="C:\Documents and Settings\nomu\デスクトップ\定期検査\〒.csv"
End If Windows(gbn).Activate err: If err Then MsgBox "ファイルが開けませんでした。"
Else
Range("I24:R25").Select ActiveCell.FormulaR1C1 = _ "=IF(R23C9="""","""",IF(ISERROR(VLOOKUP(R23C9, 〒.csv!R2C1:R14212C2,2, FALSE)),"""",VLOOKUP(R23C9,〒.csv!R2C1:R14212C2,2, FALSE)))" Range("I24:R25").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False
End If End Sub
話しの流れとしては 1.「〒.csv」と、現在開いているブック名を一つずつ 同じ名前が有るまで比べる。 見つかった時点で終了。見つからなければ 2.メッセージボックスを出して ファイルを開くか確認 「NO」が選択されれば終了。それ以外なら 3.ファイルを開く 4.最初に開いていたブックをアクティブにする 5.エラーの時の処理 となっています。 「On Error GoTo err」で、エラーが起きたときには その間をすっ飛ばして「err:」の行まで移動します。 何事もなければ、順調に処理が進み「err:」の行以降が 実行されます。
VLOOKUP関数は、ファイルを開いたら実行すればよいので 4番の後が良さそうな気がします。 ・・・単なる好みでしょうけど。
最初に載せたときに「Application.ScreenUpdating」を 入れていなかったのですが、コレを入れると 画面のちらつきが無くなります。 現在は、順調にいくと 最初のブックが表示された状態から 1.〒.csvが表示され 2.最初のブックに戻り 3.VLOOKUP関数を入れる処理でアクティブセルが動く と画面が移っていくと思います。 Application.ScreenUpdating = False を入れると、画面が移らずに処理だけが行われます。
VLOOKUP関数は、I24:R25の範囲を選択した状態で行われていますが 結局、I24セルにしか入力されてませんよね? I23セルが空欄でないとき、I24セルに結果を表示すればよいので有れば こんな感じのはどうでしょう。 Sub 〒CSVを開く() Dim kbn As Workbook Dim gbn As String, hbn As String gbn = ActiveWorkbook.Name hbn = "〒.csv" Application.ScreenUpdating = False For Each kbn In Workbooks If kbn.Name = hbn Then Exit Sub End If Next If MsgBox("〒番号ファイルが開いていません!" & Chr(10) & "開きますか?" _ , vbYesNo + vbExclamation, "開くの?") = vbNo Then Exit Sub Else On Error GoTo err Workbooks.Open Filename:="C:\Documents and Settings\nomu\デスクトップ\定期検査\〒.csv" End If Windows(gbn).Activate Range("I24") = _ "=IF(COUNTIF(〒.csv!$A$2:$B$14212,I23),VLOOKUP($I$23,〒.csv!$A$2:$B$14212,2,FALSE),"""")" Range("I24").Value = Range("I24").Value err: If err Then MsgBox err.Number & ":" & err.Description err.Clear End If Application.ScreenUpdating = True End Sub
これだと、番号を入れ替えて新しく住所を反映させたい場合 一度「〒.csv」を閉じる必要がありますが、それでも良いのですかね?
(HANA)
(HANA)さん ご丁寧に解説頂き短変恐縮です。
(HANA)さんのアドバイスで問題解決できたものと思い、今日は海水浴に行ってまいりました。
帰宅して、もう一度機能確認したところ、〒.csvが開いている状態でボタンクリックすると何も動かないではありませんか!
自分の未熟さを暴露してしまいました。
このHPを見て (HANA)さんが追加指導されていることに、また感激です。
ご指摘が沢山あり整理します。
VLOOKUP関数は、I24:R25の範囲を選択した状態で・・・・
については、実はここはセルを結合しているのでI24:R25となっているものです。
番号を入れ替えて新しく住所を反映させたい場合一度「〒.csv」を閉じる必要がありますが・・・・
については、下記のようにしました。
同じ命令が二度使っていてカッコ悪いのですが、私にはこれを改善することができません!
下記が訂正したものです。
Sub 〒CSVを開く_訂正()
Dim kbn As Workbook Dim gbn As String, hbn As String gbn = ActiveWorkbook.Name hbn = "〒.csv" Application.ScreenUpdating = False For Each kbn In Workbooks
Range("I24:R25").Select ActiveCell.FormulaR1C1 = _ "=IF(R23C9="""",""〒No_None"",IF(ISERROR(VLOOKUP(R23C9, 〒.csv!R2C1:R14212C2,2, FALSE)),"""",VLOOKUP(R23C9,〒.csv!R2C1:R14212C2,2, FALSE)))" Range("I24:R25").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False
If kbn.Name = hbn Then Exit Sub End If Next If MsgBox("〒番号ファイルが開いていません!" & Chr(10) & "開きますか?" _ , vbYesNo + vbExclamation, "開くの?") = vbNo Then Exit Sub Else On Error GoTo err
ChDir "C:\Documents and Settings\nomu\デスクトップ\定期検査" Workbooks.Open Filename:="C:\Documents and Settings\nomu\デスクトップ\定期検査\〒.csv" End If Windows(gbn).Activate err: If err Then MsgBox "ファイルが開けませんでした。"
Else
Range("I24:R25").Select ActiveCell.FormulaR1C1 = _ "=IF(R23C9="""",""〒No_None"",IF(ISERROR(VLOOKUP(R23C9, 〒.csv!R2C1:R14212C2,2, FALSE)),"""",VLOOKUP(R23C9,〒.csv!R2C1:R14212C2,2, FALSE)))" Range("I24:R25").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False
End If End Sub
海水浴ですか、良いですね。 しっかり焼けてきましたか?
上でも書きましたが、VLOOKUP関数を2カ所に入れるなら 1.〒ファイルが開いていることが確認出来た後(Exit Subする前) 3.〒ファイルを開いた後(エラー時処理の前) が良いような気がします。 (上手く行かないのですかね?)
2カ所に書くのを避けたいなら、ファイルが開いていることが分かった後 「Exit Sub」するのではなく、「GoTo ○○」としてみるのはどうでしょう。 グーグル等で「エクセル Then GoTo」等のワードで検索すると 使用例がご覧になれると思います。
≪追記≫ 今回のご質問とは離れますが、住所表示が関数ではなく値になっているので 住所が表示された状態で、郵便番号を変えた場合 〒ファイルが開いていても 上のマクロを実行するまでは整合性のない状態ができあがります。 これとは別に、「郵便番号が変わったら住所をクリア」のマクロを 用意しておくのが良いかもしれません。
(HANA)
合間を見ては (HANA)さんのアドバイスを何度かトライしているのですが・・・
どうもよくわかりません!
また、〒.csv名を違う名前にした場合、〒番号ファイルが開いていません!開きますか?のメッセージが出る前にダイアログ(値の更新:〒.csv)が出てきます。
もう、どうしてよいのやら??????
ご教授頂けませんか?
お盆ですしねぇ、ぼちぼち行きましょうよ。
とりあえず >どうもよくわかりません! が、何がよく分かっておられないのか、分かりません。
「VLOOKUP関数を入れるなら」なぜその場所が良いと言っているのか と言う事ですかね? それとも「何となく全体的に」よく分からないのですかね? 「いろいろやってみるけど、どうして上手く行かないのかが分からない」 のですかね?
>(値の更新:〒.csv)が出てきます。 これは「〒CSVを開く_訂正」を実行した時の話しですよね? そうであれば >〒.csv名を違う名前にした場合 と言う行為が問題を起こしたとは思えません。 同じ名前にもどして実行してみてください。 〒ファイルが開いていないときに実行した場合 きっとメッセージが出ると思いますよ。
どの段階で何を行っているのか (どこからどこまでが 一区切りなのか) 最初のコードに書き込みました。 これだと、値の更新をするか聞かれる理由が分かりますかね?
ちなみに、↓のコードの動作確認をしていただいて宜しいでしょうか? 上手く動けば、自信をもって 話を進めさせてもらいたいと思います。 Sub 〒CSVを開く_2() Dim kbn As Workbook Dim gbn As String, hbn As String gbn = ActiveWorkbook.Name hbn = "〒.csv" Application.ScreenUpdating = False For Each kbn In Workbooks If kbn.Name = hbn Then GoTo look Next If MsgBox("〒番号ファイルが開いていません!" & Chr(10) & "開きますか?" _ , vbYesNo + vbExclamation, "開くの?") = vbNo Then Exit Sub Else On Error GoTo err Workbooks.Open "C:\Documents and Settings\nomu\デスクトップ\定期検査\〒.csv" End If Windows(gbn).Activate look: If Range("I23") = "" Then Range("I24") = "〒No_None" Else If Application.CountIf(Workbooks("〒.csv").Sheets("〒").Range("A2:A14212"), Range("I23")) = 0 Then Range("I24") = "該当データ無し" Else Range("I24") = _ "=VLOOKUP($I$23,〒.csv!$A$2:$B$14212,2, FALSE)" Range("I24").Value = Range("I24").Value End If End If err: If err Then MsgBox err.Number & ":" & err.Description err.Clear End If Application.ScreenUpdating = True End Sub
(HANA)
(HANA)さん 本当に申し訳ありません。
盆休みも終わり、親戚も兄弟も帰って行きました。
私も今日から出社です。 (HANA)さんのアドバイスに集中します!
>どうもよくわかりません!
という質問をして申し訳ありませんでした。
自分なりにGoto文でチャレンジしたのですが・・・・・
何れにせよ、 (HANA)さんのご指導の下、最初からやり直してみようと思います。
早速
< ↓のコードの動作確認をしていただいて宜しいでしょうか?
について、早速試してみました。
しかし、コピペした時点で下記のコードが赤文字となりました。
実行すると、(コンパイルエラー:構文エラー)となります。
Range("I24") _ "=VLOOKUP($I$23,〒.csv!$A$2:$B$14212,2, FALSE)"
ご指導お願いします。
(ノム)
そ・・・そうですよねぇ。 「=」が抜けてました。 ↓ Range("I24") = _ "=VLOOKUP($I$23,〒.csv!$A$2:$B$14212,2, FALSE)" 追加したのでもう一度お願いします。
私のマクロが動くかどうかは別として(笑) たぶん、全体の流れがつかめれば すっきりご理解いただけると思いますよ。
(HANA)
(HANA)さん お手数をおかけしました。
私の思い通りに動き大変感動しております。
〒.csvファイルが存在しないときのエラー表示にも感動です。
ここまでずいぶん時間をかけご指導頂いたことに感謝致します。
ありがとうございました。
(ノム)
えとですね、私のコードが動いたのであって ノムさんのコードが動いた訳ではありませんよ。 今後のために「どこが悪かったのか」は 明確にしておいた方が良いと思います。
先のコードは >2カ所に書くのを避けたいなら、ファイルが開いていることが分かった後 >「Exit Sub」するのではなく、「GoTo ○○」としてみるのはどうでしょう。 の方法で書いたものです。
ノムさんが作られた「〒CSVを開く_訂正」が なぜ思いがけないところで メッセージを出してくるのか は分かりましたかね?
すこしだけ、研究してみて下さいね。
(HANA)
(HANA)さん 色々とご指導ありがとうございました。
私のレベルは昔のBasicを素人レベルで勉強した程度です。
gotoなどはBasicであれば行番号へ直接飛ばしその行の処理をさせれば良いのですが、
今回はそれと同じような処理をさせた後ファイル処理で〒.csvが開いているにもかかわらず
「ファイルが開けませんでした」と表示してこの場所から回避さすことができなかったものです。
EXCELはマクロ記録ができるのでBasicよりは便利な部分がありその組み合わせで
それなりにできるのですが、今回のような問題にぶち当たると行き詰ってしまいます。
EXCELでまだまだやりたいことが沢山あるので、基本を勉強しなくては!
また、質問することがあると思いますが、ご指導宜しくお願いします。
(ノム)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.