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

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

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

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

Q&A

解決済

2回答

5876閲覧

(VBA)行ごとにあるボタンを押すと、その行にあるデータがIEに転記されるようにしたい。

js_boy

総合スコア10

VBA

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

0グッド

0クリップ

投稿2020/09/27 00:22

一行ごとにマクロボタンを設置して、ボタンをクリックするとその行にあるデータをIEへ転記するというVBAを作りました。
このボタンを2行目から30行目まで設置して、クリックするごとにその行のデータを転記するようにしたく、転記するための処理をFunctionプロシージャで作って、1つのボタンごとにCallで呼び出すようなVBAを作成したのですが、Callを数十個作成するのが非常に手間で、どうにかもっとシンプルなコードにできないかアドバイスを頂きたく質問させて頂きました。

VBA

1Function tenki(ByVal a As Integer, ByVal d As Integer, ByVal e As Integer, ByVal f As Integer, ByVal g As Integer) As Integer 2 3 Dim colSh As Object 4 Dim win As Object 5 Dim objIE As Object 6 Set colSh = CreateObject("Shell.Application") 7 8 '開いているすべてのウインドウに対して処理する 9 For Each win In colSh.Windows 10 11 On Error Resume Next 'Window取得エラー対策 12 '開いているファイルの種類がHTMLなら処理を実行する 13 If TypeName(win.document) <> "HTMLDocument" Then 14 Else 15 16 '開いているサイトのURLが下記だったら 17 If win.LocationURL = "https://www.shopjapan.co.jp/shop/customer/entry" Then 18 19 'このウインドウをobjIEとして指定する 20 Set objIE = win 21 22 objIE.document.getElementsByName("customerLastNameKana")(0).Value = Left(Range("D" & d).Value, 3) 23 objIE.document.getElementsByName("customerFirstNameKana")(0).Value = Right(Range("D" & d).Value, 4) 24 objIE.document.getElementsByName("address1")(0).Value = Mid(Range("E" & e).Value, 4) 25 objIE.document.getElementsByName("address2")(0).Value = Range("F" & f).Value 26 objIE.document.getElementsByName("address3")(0).Value = Range("G" & g).Value 27 28 '都道府県コードをAddressへ代入 29 Dim Address As Object 30 Dim Addresses As Object 31 Set Addresses = objIE.document.getElementById("todofukenCd") 32 33 'リスト項目名で選択 E列にある都道府県名を選択 34 For Each Address In Addresses.getElementsByTagName("option") 35 If Address.innerText = Left(Range("E" & e).Value, 3) Then 36 Address.Selected = True 37 End If 38 Next 39 40 '処理を中断してFor~Nextを終了する 41 Exit For 42 43 End If 44 45 End If 46 47 On Error GoTo 0 48 49 Next 50 51 'ウインドウが見つからなければ 52 If objIE Is Nothing Then 53 54 'メッセージを表示して 55 MsgBox "入力するページが見つかりません" 56 57 '処理を終了する 58 Exit Function 59 60 End If 61 62 Range("A" & a).Interior.Color = RGB(255, 0, 0) 63End Function 64Sub 転記1() 65 Dim a As Integer 66 Dim d As Integer 67 Dim e As Integer 68 Dim f As Integer 69 Dim g As Integer 70 71 a = 2 72 d = 2 73 e = 2 74 f = 2 75 g = 2 76 77 Call tenki(a, d, e, f, g) 78 79End Sub 80Sub 転記2() 81 Dim a As Integer 82 Dim d As Integer 83 Dim e As Integer 84 Dim f As Integer 85 Dim g As Integer 86 87 a = 3 88 d = 3 89 e = 3 90 f = 3 91 g = 3 92 93 Call tenki(a, d, e, f, g) 94 95End Sub 96Sub 転記3() 97 Dim a As Integer 98 Dim d As Integer 99 Dim e As Integer 100 Dim f As Integer 101 Dim g As Integer 102 103 a = 4 104 d = 4 105 e = 4 106 f = 4 107 g = 4 108 109 Call tenki(a, d, e, f, g)

以上になります。
お忙しいところ恐縮ですが、何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

そのボタンはフォームコントロールでしょうか。ActiveXコントロールでしょうか。

フォームコントロールなら、関連付けるマクロを共通にできます。
Application.Caller でどのボタンが押されたか判断できますので、それで処理を分けることが可能です。

ActiveXコントロールだとクラスモジュールを使って、イベントプロシージャを共通化します。

フォームコントロールの方かシンプルなので、そちらで回答します。

まず、ボタンの名前を btn_2, btn_3, ・・・btn_30 と規則的なものに変更します。
btn_ の後に転記したい行番号を続けます。

下記のマクロを作成して、これを各ボタンと関連付けます。

vba

1Sub 転記() 2 Dim a As Integer 3 4 a = Val(Mid(Application.Caller,5)) 5 6 Call tenki(a, a, a, a, a) 7 8End Sub

以上です。

投稿2020/09/27 00:57

編集2020/09/27 01:11
hatena19

総合スコア34075

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

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

js_boy

2020/09/27 01:18

ご回答ありがとうございます。 クリックごとに転記することができました! しかし転記する行が一つズレてしまいます。 (btn_ の後に転記したい行番号の記載はしました。) 例えば、3行目にあるボタンをクリックすると、2行目が転記されてしまいます。 3行目にあるボタンをクリックすると3行目のデータが転記されるようにできないでしょうか?
hatena19

2020/09/27 01:51

ボタン名の行番号が正しいならそうならないとは思いますが、 とりあえす、+1するとどうなりますか。 a = Val(Mid(Application.Caller,5)) + 1
js_boy

2020/09/27 02:04

ご回答ありがとうございます。 +1を追記したらうまくいきました。 しかし、これは修正前から起きていた現象なのですが、なぜか7行目以降のボタンをクリックすると、8行目先のデータを転記するようになってしまいます・・・。 (例) 7行目のボタンをクリック ↓ 15行目のデータが転記される
js_boy

2020/09/27 02:08

7行目のボタン名を「btn_7」から「btn_2」とかに変えても同じ現象が起きてしまいます。
hatena19

2020/09/27 03:41

提示されているコードを見る限りはそのようなことが発生するとは思えません。 とりあえず、今回の質問の趣旨であるコードをシンプルにする(マクロの共通化)ということができているので、この質問は解決済みにして、「想定の行とは異なる行か転記される」点については別に新規に質問しなおしてください。その際には、現象を再現できるシート構成、コードを提示してください。
js_boy

2020/09/27 05:25

ご返信ありがとうございます。 上記以外にも他にコードが入力されていますので、それが原因で不具合が起こっているのかもしれません。 この件については新規での質問投稿をしようと思います。 この度はご回答いただきまして、誠にありがとうございました。
guest

0

規則性のある繰り返し処理は、For-Next構文 にて行えます。
IE操作のため、1秒程度の待ち時間も必要です。

VBA

1Sub 転記一括() 2 Dim a As Integer 3 Dim d As Integer 4 Dim e As Integer 5 Dim f As Integer 6 Dim g As Integer 7 Dim Cnt As Integer 'ループカウンター 8 9 For Cnt = 2 To 10 10 a = Cnt 11 d = Cnt 12 e = Cnt 13 f = Cnt 14 g = Cnt 15 16 Call tenki(a, d, e, f, g) 17 18 '1000ミリ秒待つ 19 Application.Wait [Now()] + 1000 / 86400000 20 Next Cnt 21End Sub

投稿2020/09/27 00:35

編集2020/09/27 00:47
TanakaHiroaki

総合スコア1063

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

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

js_boy

2020/09/27 01:21

ご回答ありがとうございます。 ご回答頂いた内容ですと、一つボタンをクリックすると全ての行のデータが次々と転記されてしまいます。 今回やりたいことはボタンをクリックしたらそのボタンがある行のみのデータを転記するという処理になります。 説明が不十分ですみません。
TanakaHiroaki

2020/09/27 01:25

質問内容を誤解していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問