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

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

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

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

Q&A

解決済

1回答

5078閲覧

VBAのループ処理途中でシートへ入力したい。

cd987456

総合スコア33

VBA

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

0グッド

0クリップ

投稿2017/07/17 00:51

VBAでループ処理の途中でシートに書き込みを行い、その情報を基に処理を実行したいです。

具体的には・・・
エクセルファイルには2つのシートがあります。
”設定”シートと”記入”シートです。
”設定”シートのA列には2行目から処理対象のデータベース名が記載されています。
イメージ説明
VBAを実行すると、ユーザーフォームが立ち上がります。
イメージ説明
ユーザーフォームが立ち上がり、”記入”シートが選択されています。
記入シートに必要な情報を入力し、フォームの”OK”ボタンを押すと『処理』が実行されます。
その後、再度ユーザーフォームが立ち上がり、【テストDB2】の必要な情報を記入シートに
入力し、処理する。これを【テストDB6】までループするといった感じのコードにしたいです。

★ループを中断しシートに記入後、復帰させる。という処理が分かりません。

コードを書いてみました。
ループを中断し処理はできるのですが、各”テストDB”で中断し処理できません。
ユーザーフォームは【テストDB6】で表示されてしまいます。
【テストDB1】、【テストDB2】・・・は飛ばされてしまいます。

修正コードを教えて下さい。
※function 処理1 のコードは省いています。

Option Explicit Dim fStop As Boolean 'グローバル変数を宣言 Sub sample() Dim i As Long, N As Long, cnt As Long With Sheets("設定") i = .Cells(Rows.Count, 1).End(xlUp).Row If i > 1 Then fStop = True Sheets("記入").Select For cnt = 2 To i DoEvents If fStop = True Then UserForm1.Label1.Caption = "【" & .Cells(cnt, 1).Text & "】の" & vbCrLf & "コードを入力して下さい。" UserForm1.Show vbModeless Sheets("記入").Select End If fStop = False Next cnt End If End With End Sub Private Sub Command1_Click() fStop = True 処理1 Sheets("記入").Select Unload Me End Sub

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/17 10:00 編集

thisworkbookのコードとシート構成も書いて頂けますか?
guest

回答1

0

ベストアンサー

ユーザーフォームをモードレス(vbModeless)で開くと、
コードを中断せずにすぐ次のコードへ進みます。
Forループの最後まで一気に進んでしまいます。

Do Uutil fStop Doevents Loop

というようにDoループで待機させる方法もありますが、
ずっとコードが回り続けることになりますので、CPU負荷が大きくなり
お勧めできません。

ここは、ループは使わずに、
一つの処理が終わったら(ユーザーがOKを押したら)
次の処理へすすむというようなコーディングにするといいでしょう。

標準モジュール

Option Explicit Public EndRow As Long '最終行 Public CurRow As Long '処理中の行 Sub 処理開始() EndRow = Sheets("設定").Cells(Rows.Count, 1).End(xlUp).Row CurRow = 2 Call ユーザーフォーム End Sub Sub ユーザーフォーム() UserForm1.Label1.Caption = "【" & Sheets("設定").Cells(CurRow, 1).Text & "】の" _ & vbCrLf & "コードを入力して下さい。" UserForm1.Show vbModeless Sheets("記入").Select End Sub Sub 処理実行() CurRow = CurRow + 1 If CurRow > EndRow Then MsgBox "全処理が完了しました。" Unload UserForm1 Else UserForm1.Hide 処理1 Call ユーザーフォーム End If End Sub

ユーザーフォーム

Private Sub CommandButton1_Click() Call 処理実行 End Sub

処理開始 を実行すると、
ユーザーフォームが開きユーザーに入力を即します。
入力後、ユーザーがOKを押すと、
次の入力を即すユーザーフォームが開きます。

投稿2017/07/17 16:53

hatena19

総合スコア33620

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

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

cd987456

2017/07/18 00:05

回答ありがとうございます。 各テストDB毎に処理できました。 ループしないとできないと思い込んでいました。 このような方法もあるんですね。 勉強になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問