🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

1回答

992閲覧

For~Next文で処理が固まってしまう

daifuku-mochi

総合スコア9

VBA

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

1グッド

0クリップ

投稿2021/01/26 04:53

編集2021/01/26 05:49

前提・実現したいこと

いつもこちらのコミュニティには大変お世話になっております。現在VBAを勉強中の初心者です。
質問中に不慣れな箇所が多々あるかとは存じますが、何卒ご容赦いただけますと幸いです。
(また、調べが甘い箇所がありましたら大変申し訳ありません)

ユーザーフォームのコンボボックスで選択した「月」列の連番、金額、内容を、連番別の請求書テンプレートに転記するのが最終目標です。
月によっては出力の必要のない連番もありますので、連番を基準に連番の最終行まで処理を行いたいと思っています。

例えば、ユーザーフォームで「4月」を選択した場合、
A社とC社の情報だけを請求書に転記したいです。

連番 1月2月3月4月5月内容
A社5,0002,0003,0003,000〇〇〇
B社1,5005,0003,000△△△
C社1,5005,0001,5001,5005,000□□□

発生している問題

以下のマクロを実行すると、処理が固まってしまいます。
おそらくFor Next文の書き方が悪いのでしょうが、ネットで調べても原因がわかりませんでした…
どなたかミスに気付かれた方がいらっしゃいましたら、お手数ですがご教授いただければ幸いです。

Private Sub 印刷ボタン_Click() '以下、ユーザーフォームに入力した情報の変数宣言 Dim 入力月 As String: 入力月 = ComboBox1.Text InputBox.Hide '以下、請求月の検索 Dim 請求月 As Range Set 請求月 = Worksheets("サンプル").Range("B1:F1").Find(What:= 入力月, LookAt:=xlWhole) If 請求月 Is Nothing Then MsgBox "シート内に対象の月がありません。請求月を選択しなおしてください" Exit Sub End If '金額のセルを選択 請求月.Select Rows(ActiveCell.Row + 1).Select Dim 金額 As Range Set 金額 = ActiveCell '連番の数だけ以下の処理を繰り返す Dim 連番最終行 As Long 連番最終行 = Worksheets("サンプル").Cells(Rows.Count, 1).End(xlUp).Row Dim 連番 As Long For 連番 = 2 To 連番最終行 'だいたい全部で300行くらいです '金額列が空白だった場合、金額が次の行に進む If 金額 = "" Then 金額 = 金額 + 1 Else '金額が空白でなかった場合 'テンプレートを新規で開く(長いため省略) '以下、契約番号の転記処理 With ActiveSheet .Range("A1").Value = 連番 '連番の転記 .Range("C15").Value = 金額 '金額の転記 .Range("F20").Value = 連番.Offset(0, 6).Value End With 'テンプレートを新規で指定の場所に保存する(長いため省略) 金額 = 金額 + 1 '次の行に進む End If Next 連番 '次の行に進む End Sub
kaina👍を押しています

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

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

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

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

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

radames1000

2021/01/26 05:10

ActiveCellはどこを指定してますか。 何か決まりがあるのでしょうか。
退会済みユーザー

退会済みユーザー

2021/01/26 05:21

処理が固まると書いてありますが処理が重すぎて見た目上は動かない(処理は途中まで走っている)のでしょうか。 それともどこか無限ループにひっかって終われないのでしょうか。
hatena19

2021/01/26 05:36

質問の表では、月は横に並んでいますが、コードでは請求月をB2:B6から検索してます。そこからおかしくないですか。
daifuku-mochi

2021/01/26 06:05

>radames1000様 拙い内容にも関わらず、いつもコメントいただき本当にありがとうございます…! 金額セルを取得するための良いアイデアがひらめかず、 単純に「検索した月の真下のセルを取得する」といった考えで 検索した「月」セルを一度選択し、そのセルの真下のセルを選択し、 そこでActiveになったセルを「金額」セルとして設定する…方法をと思っておりました…
radames1000

2021/01/26 06:08

あ、月の範囲違いでわたしの理解が追い付いていませんでした。失礼しました。考え方は理解しました。
daifuku-mochi

2021/01/26 06:11

>msuguru様 コメントいただきありがとうございます! コマンドボタンを押すとカーソルと進捗インジケーターが瞬時にチカチカと切り替わり、 10秒もせずに画面全体に白いもやがかかるという感じです。 ただ、他のご回答者様方のご指摘にありますようにFor~Next文以外にも 色々と不味いところがあるようですので、申し訳ありませんがもう一度調べなおしたいと思います… 拙い質問にも関わらずコメントいただきありがとうございましたm(_ _)m
daifuku-mochi

2021/01/26 06:14

>hetena19様 この間は助けていただきありがとうございました! 今回も初歩的な内容にも関わらずコメントいただきありがとうございます…! 全くその通りです。修正いたしました。初歩的なミスを…申し訳ありませんでした…
kaina

2021/01/26 06:44

直接的な回答では無いのでこちらに。 Excel VBAのデバッグのやり方を学習して下さい、以下のページが参考になるかと思います。 https://www.tipsfound.com/vba/01010
daifuku-mochi

2021/01/26 06:58

>kaina様 わー!正式なデバッグのやり方があるのですね…! 何回もマクロを実行してエラーが表示されなくなるまで行うのが デバッグなのかと今までずっと勘違いしておりました。 ご指摘いただかなければ、ずっと分からずじまいでした。 ご教授いただき、本当にありがとうございました!熟読して出直します!
kaina

2021/01/26 07:02

このくらいのボリュームであれば、ご自分で解決可能と思われますので チャレンジしてみて下さい。
daifuku-mochi

2021/01/26 07:13

>msuguru様 そういう可能性もあるのですね…とても勉強になりました! ご丁寧に教えていただき本当にありがとうございました!
daifuku-mochi

2021/01/26 07:15

>kaina様 はい!ありがとうございました!頑張ります! ネットで調べてみると、デバッグのやり方の動画や 記事がたくさん公開されておりましたので、色々見て勉強いたします!
guest

回答1

0

ベストアンサー

For文がどうの以前にこれでは動かない気がするのですが、本当に固まるところまで動いているのでしょうか?
Long型の連番にOffsetがついていたり、Range型の金額に+1されていたりしていて、少なくとも私の環境では動きませんでした。エラーメッセージが出ていることに気付いていないだけということはありませんか?

投稿2021/01/26 05:16

Usirow

総合スコア364

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

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

daifuku-mochi

2021/01/27 00:29 編集

拙い内容にも関わらずコメントいただきありがとうございます!勉強不足で大変申し訳ありません。 ほとんど型に関して知識がありませんでしたので、Usirow様のご指摘を受けて型について調べました。 一晩悩んだ結果、以下のように書き換えたことで及第点の結果を得ることができました。 Private Sub Cnd_Click() Dim 入力月 As String: 入力月 = ComboBox1.Text UserForm1.Hide '以下、請求月の検索 Dim 列 As Long 列 = Worksheets("サンプル").Range("B1:F1").Find(What:=入力月).Column '連番の数だけ以下の処理を繰り返す Dim 最終行 As Long 最終行 = Worksheets("サンプル").Cells(Rows.Count, 1).End(xlUp).Row Dim 行 As Long For 行 = 2 To 最終行 If Worksheets("サンプル").Cells(行, 列).Value = "" Then Else 'テンプレートを新規で開く(長いため省略) Dim オフセット As Range Set オフセット = Worksheets("サンプル").Cells(行, 1) With ActiveSheet .Range("A1").Value = Worksheets("サンプル").Cells(行, 1).Value .Range("C15").Value = Worksheets("サンプル").Cells(行, 列).Value .Range("F20").Value = オフセット.Offset(0, 6).Value End With 'テンプレートを新規で指定の場所に保存する(長いため省略) End If Next 行 End Sub 未熟で不慣れな質問にも関わらず、ご意見いただきありがとうございました! 教えていただかなければ型について調べるきっかけがありませんでしたので、 今回の件で大変勉強になりました。
Usirow

2021/01/28 08:56

本当はコメント欄と間違えてしまっただけなのですが、解決のきっかけになったようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問