- ベストアンサー
Excel VBAの繰り返し処理を教えてください
- Excel VBAの繰り返し処理について教えてください。初心者です。
- リストから担当者社員番号をキーとしてデータ転記し、別ファイルに保存するマクロを作成しています。
- 担当者別にファイルを作成したいのですが、1行ごとの処理で無限ループになります。解決策がわかりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Q列に式が入っていても、その式の返り値が空白("")ならDo~Loopから抜けて 処理は止まりますので、そこは問題ないかと。 コードを拝見させていただきましたが、見た感じ「無限ループ」の理由は無いように思います。 ただ一つ、私が気になったのは、Do~Loopの中の > If Cells(行, 17).Value <> 担当者社員番号 Then > > End If このIfの部分なのですが、この中では何か処理をされているのでしょうか? 処理が無いなら、このIfは全く意味が無いですよね。 処理があるなら、この中にループの原因があるかもしれません。 変数「担当社員番号」はマクロ起動時には空白("")ですから、 繰り返し(Do)の処理一回目でIf内に入りますから。 ここに原因があるのであれば、現状でこちらでは検証が不可能です。 VBE画面で当該コード内にカーソルを置き、 F8キーでステップインモードでコードを確認しながら動かせますので (※F8キーを押すと、次の行の処理に移ります。) とりあえず、これで「無限ループする行(処理)=理由」を自力で特定してみましょう。 原因がわかれば、良い対処法が出てくるかもしれません。 余計なお節介ですが、 > 社員番号 = Cells(行, 1).Value > (中略) > 担当者 = Cells(行, 18).Value > > Sheets("個人用").Select > Range("A5").Select > > Cells(メール行, 1).Value = 社員番号 > (中略) > Cells(メール行, 18).Value = 担当者 ここは Sheets("健康診断問診票").Range(Cells(行, 1), Cells(行, 18)).Copy Sheets("個人用").Range(Cells(行, 1), Cells(行, 18)).PasteSpecial Paste:=xlPasteValues Sheets("個人用").Select Range("A5").Select これでいわゆる「値の貼り付け」が可能です。 変数も少なく出来ますし、コードも短く済みます。 ちょっとスッキリすると思いますが・・まぁ、この辺は好みですけどね。
その他の回答 (1)
- kybo
- ベストアンサー率53% (349/647)
コード自体に特に問題となる部分はないと思います。 おそらく、表のほうの問題ではないかと思われます。 Do Until Cells(行, 17).Value = "" は、空欄のセルになるまで続けます。Q列に実は数式等入っていて、値は空欄ではないセルがかなり長く続いているのではないかと思います。 Q列のデータを新規シートなどに値で貼り付けし、どこまでデータがあるか見たほうがいいです。
お礼
お礼が大変遅くなり申し訳ございませんでした。 ご回答頂きまして有難うございます。 質問と異なる質問をしてしまい申し訳ございませんでした。
補足
言葉足らずで申し訳ございません。 Do Until Cells(行, 17).Value = ""でファイルを作成することはできるのですが、 各担当者にデータをまとめて1ブックに保存し、次の担当者へ進むというイメージでマクロを作成しています。 イメージと現状は以下になります。 1行目 2行目 3行目 A列 B列 省略 Q列 R列 4行目 社員番号 社員名 省略 担当者ID 担当者 5行目 111 山田 200 山本 6行目 112 鈴木 200 山本 7行目 113 田中 200 山本 8行目 114 佐藤 201 安藤 9行目 115 山口 201 安藤 ↓ マクロの処理をすると・・・ 1行目 2行目 3行目 A列 B列 省略 Q列 R列 4行目 社員番号 社員名 省略 担当者ID 担当者 5行目 111 山田 200 山本 6行目 112 鈴木 200 山本 7行目 113 田中 200 山本 5・6・7行目を勤怠抽出2012年11月(200 山本さん).xlsで作成 1行目 2行目 3行目 A列 B列 省略 Q列 R列 4行目 社員番号 社員名 省略 担当者ID 担当者 5行目 114 佐藤 201 安藤 6行目 115 山口 201 安藤 5・6行目を勤怠抽出2012年11月(201 安藤さん).xlsで作成 【現状】 1行目 2行目 3行目 A列 B列 省略 Q列 R列 4行目 社員番号 社員名 省略 担当者ID 担当者 5行目 114 佐藤 201 安藤 6行目 115 山口 201 安藤 5行目を勤怠抽出2012年11月(201 安藤さん).xlsで作成 ※6行目を上書きで勤怠抽出2012年11月(201 安藤さん).xlsを作成 Q列に空欄が現れても、Q5に戻って繰り返しファイルを作成し続けます。
お礼
大変お礼が遅くなり申し訳ございません。 詳しいご説明とアドバイスを頂きまして有難うございました。 やっと作業ができそうなのでマクロを改良してみます。
補足
ご回答頂きまして有難うございます。 無限ループは空のデータセルをクリアしたところ解消されました。 If Cells(行, 17).Value <> 担当者社員番号 Thenにつきましては、 リスト内に各担当者の複数データを1ファイルにまとめてファイル保存を繰り返す(1行下セルの担当者が変更したら別ファイル)ということで入力をしました。 まったく異なるコードで申し訳ございません。 ご教示頂きました、 >Sheets("個人用").Range(Cells(行, 1), Cells(行, 18)).PasteSpecial Paste:=xlPasteValues をF8キーで実行したところ、 「'1004'アプリケーション定義またはオブジェクトの定義エラーです」とエラー表示がされました。 大変お手数をお掛けいたしますがご教示頂けないでしょうか。 詳しいExcelの内容は、No.1kyboさんの補足に記載いたしましたのでご参照頂ければと思います。 よろしくお願い致します。