質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

611閲覧

VBAの行への繰り返し方法について教えてくださいm(__)m

ekitabi

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2022/06/16 13:46

編集2022/06/16 13:51

VBAの勉強を始めたばかりの初心者です。

マクロを用いて、WebAPIに接続して郵便番号検索を行うプログラムを実装しました。
セルのD2に郵便番号を記述して、真横のE2に結果が表示されるというものです。

それをD3,D4,D5…と下のセルも同じようにコピーをしたいのですが、プログラムの記述方法が分かりません。

【調べたこと】
まず、セルの行番号の取得関数を調べて実装してみましたが、行番号の取得は出来ましたが、うまく動作しませんでした。
あとは、マクロを行全体にかける方法など思いつく検索キーワードで検索しましたが、実現できませんでした。

お詳しい方いらっしゃいましたら、検索キーワードやヒントをいただけましたら幸いです。

【実現したいことイメージ】
D2       E2
105-0000  東京都港区
120-0000 東京都足立区
…続く

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2'D2のセル値が変更されたときに処理を実行 3 4 If Target.Address = "$D$2" Then 5 MsgBox "住所を取得します。" 6 Call 郵便番号を取得 7 End If 8 9End Sub

VBA

1Option Explicit 2 3 4' HTTPにGETメソッドを送信して結果を得る 5Function GetHttp(url) As String 6 Dim httpObj As Object, s As String 7 ' URLのページを開く 8 Set httpObj = CreateObject("MSXML2.XMLHTTP") 9 httpObj.Open "GET", url 10 httpObj.setRequestHeader "Content-Type", "text/plain" 11 httpObj.send 12 ' 終了まで待機 13 Do While httpObj.readyState <> 4 14 DoEvents 15 Loop 16 ' HTTPのステータスコードが200ならば成功 17 If (httpObj.Status = 200) Then 18 s = httpObj.responseText 19 GetHttp = "" & s 20 Else 21 GetHttp = "" 22 Debug.Print "エラー:" & httpObj.statusCode 23 End If 24End Function 25 26 27Sub 郵便番号を取得() 28 Dim api As String, zip As String 29 Dim json As String, result As String 30 31 ' APIのURL --- (*1) 32 api = "https://api~" 33 ' シートから郵便番号の値を取得 --- (*2) 34 zip = Sheet1.Range("D2").Value 35 ' URLにアクセス --- (*3) 36 json = GetHttp(api & zip) 37 ' JSONから"result"のキーを抽出 --- (*4) 38 result = GetJsonKey(json, "result", False) 39 ' シートに設定 --- (*5) 40 Sheet1.Range("E2").Value = result 41End Sub 42 43' JSON文字列からキーkeyを取り出す --- (*6) 44Function GetJsonKey(JsonStr, key, enc) As String 45 Dim d As Object 46 If JsonStr = "" Then 47 GetJsonKey = "" 48 Exit Function 49 End If 50 Set d = CreateObject("htmlfile") 51 d.Write "<meta http-equiv='X-UA-Compatible' content='IE=8' />" 52 ' JavaScriptの関数を定義 --- (*7) 53 d.Write "<script>" & _ 54 "document.getjson = function(s, key, enc){" & _ 55 "var vals = eval('('+s+')');" & _ 56 "if (enc) { return JSON.stringify(vals[key]);}" & _ 57 "else { return vals[key] }}" & _ 58 "</script>" 59 ' JavaScriptの関数を呼び出す --- (*8) 60 GetJsonKey = d.getjson(JsonStr, key, enc) 61End Function

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/06/16 14:15

> セルのD2に郵便番号を記述して、真横のE2に結果が表示されるというものです。 質問のコードがそのコードですか? > うまく動作しませんでした。 どんなコードを書いてどうなったのでしょうか? エラーが発生したならその内容を追記しましょう。
ekitabi

2022/06/17 06:10

書籍独自のapiを参照しており、apiURLの掲載を控えておりました。 情報不足で大変申し訳ございませんでした。
guest

回答2

0

Private Sub Worksheet_Change(ByVal Target As Range) 'D2のセル値が変更されたときに処理を実行 Dim c As Range For Each c In Target If c.Row > 1 And c.Column = 4 Then MsgBox "住所を取得します。" Call 郵便番号を取得(c) End If Next End Sub Sub 郵便番号を取得(rng As Range) Dim api As String, zip As String Dim json As String, result As String ' APIのURL --- (*1) api = "https://api~" ' シートから郵便番号の値を取得 --- (*2) zip = rng.Value ' URLにアクセス --- (*3) json = GetHttp(api & zip) ' JSONから"result"のキーを抽出 --- (*4) result = GetJsonKey(json, "result", False) ' シートに設定 --- (*5) rng.Offset(, 1).Value = result End Sub

投稿2022/06/16 16:38

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ekitabi

2022/06/17 06:19

ありがとうございます!! For Each文とIF文で実現できること、知りませんでした。 まだまだ初心者なので、これから勉強していきます! 本当にありがとうございました。
guest

0

ベストアンサー

現状の 郵便番号を取得 関数は郵便番号セルが固定ですので、郵便番号セルを引数で渡すようにします。
住所セルは郵便番号セルの右隣ですので、Offsetで指定します。

vba

1Sub 郵便番号を取得(zipCell As Range) 2 Dim api As String, zip As String 3 Dim json As String, result As String 4 5 ' APIのURL --- (*1) 6 api = "https://api~" 7 ' シートから郵便番号の値を取得 --- (*2) 8 zip = zipCell.Value 9 ' URLにアクセス --- (*3) 10 json = GetHttp(api & zip) 11 ' JSONから"result"のキーを抽出 --- (*4) 12 result = GetJsonKey(json, "result", False) 13 ' シートに設定 --- (*5) 14 zipCell.Offset(, 1).Value = result 15End Sub

ワークシートのChangeいベントは下記のように記述します。

vba

1Private Sub Worksheet_Change(ByVal Target As Range) 2'D列の2行目以下のセルが変更されたとき処理を実行 3 4 Dim zipRng As Range, zipCell As Range 5 Set zipRng = Intersect(Target, Range("D2:D" & Rows.Count)) 'D列で変更されたCellを取得(複数変更の場合も考慮) 6 If zipRng Is Nothing Then Exit Sub '変更されたセルがなければ処理終了 7 8 Application.EnableEvents = False '処理中にセルを変更するのでChangeイベントの連鎖を抑止 9 10 MsgBox "住所を取得します。" 11 For Each zipCell In zipRng 12 Call 郵便番号を取得(zipCell) 13 Next 14 15 Application.EnableEvents = True 16End Sub

投稿2022/06/16 16:20

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ekitabi

2022/06/17 06:15

ご丁寧にありがとうございます! 実現することが出来ました! offsetで行や列の移動が出来ること、 Intersect文、イベント連鎖の抑制(自分で調べていた時に、無限ループにはまっていましたので、大変勉強になりました)など、まだまだ知らないことばかりでした。 勉強していきます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問