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

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

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

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

マクロ

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

Q&A

1回答

1366閲覧

vbaでのループのやり方について

makamaka

総合スコア21

VBA

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

マクロ

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

0グッド

0クリップ

投稿2021/12/08 03:45

VBAでのマクロ作成について
現在、マクロを活用し、別アプリケーションに文字を入力するシステムを作りたいと思っています。
下記コードの内"リンゴ"の所をにエクセルシートA行にある文字{A1:リンゴ、A2:ミカン、A3:ブドウ、A4:ナシ・・・・}を当てはめていく
処理を行いたいのですが作成方法がわからず困っています。やりたいと思っていることが分かりにくいと思いますので、下記にやりたいことの手順をまとめましたので、参考にしていただければ幸いです。
➀座標185, 196に移動
②座標をクリック
③文字"リンゴ"を入力
④座標 472, 92に移動
⑤座標をクリック
⑥座標185, 196に移動
⑦座標をクリック
⑧文字"ミカン"を入力
④座標 472, 92に移動
⑤座標をクリック


操作内容
SetCursorPos 185, 196
sleep t
mouse_event 2
mouse_event 4
mouse_event 2
mouse_event 4
DoEvents
sleep t
SendKeys "リンゴ"
SetCursorPos 472, 92
sleep t
mouse_event 2
mouse_event 4
mouse_event 2
mouse_event 4

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

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

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

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

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

guest

回答1

0

下記コードの内"リンゴ"の所をにエクセルシートA行にある文字{A1:リンゴ、A2:ミカン、A3:ブドウ、A4:ナシ・・・・}を当てはめていく

Do Loop を使うコード例

vba

1 Dim c As Range 2 Set c = Range("A1") '開始セル 3 Do until c.Value ="" '空欄になるまで繰り返し 4 '略 5 6 SendKeys c.Value 7 Set c = c.Offset(1) '次行に移動 8 9 '略 10 Loop

For Each ... Next を使うコード例

vba

1 Dim c As Range 2 For Each c In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)) 3 '略 4 5 SendKeys c.Value 6 7 '略 8 Next

投稿2021/12/08 05:04

編集2021/12/08 05:14
hatena19

総合スコア34075

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

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

makamaka

2021/12/08 05:31

早々のご回答ありがとうございます。 当方、VBAを学習している段階でして、初歩的な質問になってしまうのですが、'略の部分には私のコードのどこまでを記載したらよいのでしょうか。 また、Do Loopにおいて、sendkeys c.Value を行うのはなぜなのかご教授いただければ幸いです。
hatena19

2021/12/08 05:50

> '略の部分には私のコードのどこまでを記載したらよいのでしょうか。 ➀座標185, 196に移動 ②座標をクリック ③文字"リンゴ"を入力 ④座標 472, 92に移動 ⑤座標をクリック に相当する部分です。 > また、Do Loopにおいて、sendkeys c.Value を行うのはなぜなのか sendkeys "リンゴ" というコードが質問のコードにあり、 この"リンゴ" の部分を、セルの値をループで順に参照していくということなので、"リンゴ" の部分を c.Value に置き換えました。 c.Value というのがセルの値です。 自分で書いたコードなら分かるはずだと思いますが。
makamaka

2021/12/09 00:05

ご返信ありがとうございます。 ご指摘いただいたことをもとにコードを下記のように書き直しましたが、 結果は希望していた挙動とは違いました。具体的には、A1のリンゴを入力された後に マウスカーソルが移動し、最後の列(A4)のブドウが表示されてしまい、間のミカン、ブドウが表示されないという感じです コードに誤りがあるかと思うのですが、ご教授いただきたく思います。 Sub loop1() t = 1000 Dim c As Range Set c = Range("A1") '開始セル Do Until c.Value = "" '空欄になるまで繰り返し SetCursorPos 300, 300 sleep t mouse_event 2 mouse_event 4 mouse_event 2 mouse_event 4 DoEvents sleep t SendKeys c.Value Set c = c.Offset(1) '次行に移動 SetCursorPos 472, 92 sleep t mouse_event 2 mouse_event 4 mouse_event 2 mouse_event 4 Loop End Sub
hatena19

2021/12/09 00:55

動作確認用に下記のコードを埋め込んで実行してみてください。 DoEvents sleep t Msgbox c.Value SendKeys c.Value Set c = c.Offset(1) '次行に移動 A1, A2, A3・・・と順にセルの値がメッセージボックスに表示されるはずです。
makamaka

2021/12/09 03:31

連日のご返信ありがとうございます。 また、返信が遅くなり申し訳ありません ご指摘いただいたコードを以下のように実行しました。 ➀ Sub loop1() Dim c As Range Set c = Range("A1") '開始セル Do Until c.Value = "" '空欄になるまで繰り返し DoEvents sleep t MsgBox c.Value SendKeys c.Value Set c = c.Offset(1) '次行に移動 Loop End Sub 当然メッセージボックスが表示され、対象箇所すべて表示されました。 ② Sub loop1() Dim c As Range Set c = Range("A1") '開始セル Do Until c.Value = "" '空欄になるまで繰り返し   SetCursorPos 300, 300 sleep t50 mouse_event 2 mouse_event 4 mouse_event 2 mouse_event 4 DoEvents sleep t SendKeys c.Value SetCursorPos 472, 92 sleep t mouse_event 2 mouse_event 4 mouse_event 2 mouse_event 4 DoEvents sleep t MsgBox c.Value SendKeys c.Value Set c = c.Offset(1) '次行に移動 Loop End Sub まずリンゴが入力され、続いてメッセージボックスにてリンゴが表示されました。 次に、メッセージボックスにてミカン、ブドウが表示されました。(この時点で対象箇所への入力はされていません) 最後にナシが入力され、メッセージボックスにてナシが表示されました。
makamaka

2021/12/09 04:00

対象箇所に入力されていないわけではなく、もしかしたら入力が速すぎるため表示されていない可能性があります。
mattuwan

2021/12/09 08:09

セルに値を入れるのですよね? 画面上の座標で指定するのではなく、 セルのアドレスで書き込むセルを指定してみてはいかがでしょうか?
makamaka

2021/12/09 08:19

申し訳ありません。 今回はわかりやすくセルに入力しているのですが、本来やりたいこととしては、別アプリケーションの特定の場所に入力したいと思っているため、可能なら座標で指定したいと思っています。
hatena19

2021/12/09 12:17

VBAのループは正常に動作している。 別アプリケーションの操作がうまくいっていない、ということですね。 > もしかしたら入力が速すぎるため表示されていない可能性があります。 だとしたら、Sleep で待機する時間を長くする、DoEvents を挿入する箇所を増やす、 などを試してみては。 それ以上の回答は別アプリケーションが何が分からないので難しいです。 別アプリケーションを操作するのに、SendKeys は不安定なので、別の方法を考えたほうがいいように思います。RPAツールとか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問