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

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

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

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

Q&A

解決済

2回答

3509閲覧

VBA シートの数だけ繰り返す処理

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2020/10/29 06:17

編集2020/10/29 07:09

前提・実現したいこと

excel vbaにてシートの数だけ処理を繰り返し、シートの名前が"雛形"になると
処理を抜けるコードを書き、処理が終了したシートを削除するマクロを組もうと
しています。

※処理:セルの値のコピペ

-追記-
前提・実現したいことに致命的な部分が抜けておりました。
雛形(A)に値を代入後、代入完了した雛形(A)をコピーで増やし、増やした雛形(B)の名前を、代入元シートのセル値を充てております。

発生している問題・エラーメッセージ

2回目以降の繰り返しが上手くいかず、値の代入先がずれてしまいます。

該当のソースコード

VBA

1 Dim i As Variant 2 For i = Worksheets.Count To 1 Step -1 3 Sheets("雛形").Range("A4") = Worksheets(i).Range("B2") 4 Sheets("雛形").Range("B1") = Worksheets(i).Range("B3") 5 Sheets("雛形").Range("B2") = Worksheets(i).Range("B4") 6 7 Sheets("雛形").Range("V13") = Worksheets(i).Range("B8") 8 Sheets("雛形").Range("Z13") = Worksheets(i).Range("B9") 9 10 Range("A4,B1,B2,V13,Z13").VerticalAlignment = xlCenter 11 12 Sheets("雛形").Range("AA1:AE1").Merge 13 Sheets("雛形").Range("V13:X14").Merge 14 Sheets("雛形").Range("Z13:AA14").Merge 15 16 Worksheets("雛形").Copy after:=Worksheets("雛形") 17 18 Sheets("雛形 (2)").Name = Range("A4") 19 20 Sheets("雛形").Range("AA1:AE1").UnMerge 21 Sheets("雛形").Range("V13:X14").UnMerge 22 Sheets("雛形").Range("Z13:AA14").UnMerge 23 24 Worksheets("雛形").Range("A4,B1,B2").Clear 25 Worksheets("雛形").Range("AA1,B29,V13,Z13").ClearContents 26 Sheets(2).Select 27 Application.DisplayAlerts = False 28 Worksheets(Worksheets.Count).Delete 29 Application.DisplayAlerts = True 30 31 Next 32

試したこと

シート削除のコードがfor worksheets.countを邪魔しているのかと思い、
コメントアウトしたものの結果は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

excel2010

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

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

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

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

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

guest

回答2

0

ベストアンサー

Worksheets("雛形").Copy after:=Worksheets("雛形")
でシートを増やしているからずれるのでは。

busyodaさんの回答とダブってしまったので追記します。
未確認ですが、
For i = Worksheets.Count To 1 Step -1

For i = Worksheets.Count To 2 Step -1
に修正して、
Worksheets(i)

Worksheets(Worksheets.Count)
に変更しては、いかがでしょうか。

投稿2020/10/29 06:54

編集2020/10/29 07:08
kitasue

総合スコア314

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

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

退会済みユーザー

退会済みユーザー

2020/10/29 07:17

ご回答、具体的な例を出していただきありがとうございます。 試させて頂いた結果、代入先がずれるという部分がやはり修正されず 思ったところに代入されませんでした。 しかし、代入元がズレるという部分は無事修正できておりました。 ありがとうございます。 お時間ございましたら引き続き宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2020/10/29 07:51

何度もすいません。 自分が分岐のコードを書いてないばかりに上記の症状が起こってしまいました。 お騒がせして申し訳ございませんでした...。
guest

0

やりたいことが「シートの数だけ処理を繰り返す」とのことですが、
途中でシートが追加されているのを見て、
あなたのやりたいことの詳細や、どうなれば期待通りなのかが分からなくなってしまいましたが、

Worksheets("雛形").Copy after:=Worksheets("雛形")

をコメントアウトして期待通りの動作になる場合は、これが原因と思います。

ループの度にシートを追加してるので、step -1 では一生シート「雛形」に辿り着きません。

投稿2020/10/29 06:53

編集2020/10/29 06:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/10/29 07:08

ご回答ありがとうございます。 成程、確かにおっしゃる通りですね...。 合点がいきました。 前提・実現したいことに致命的な部分が抜けておりました。 雛形(A)に値を代入後、代入完了した雛形(A)をコピーで増やし増やした雛形(B)の名前を、代入元シートのセル値を充てております。 その後、雛形(A)に代入しているものを全てクリアし、改めて別シートの値を代入しようとするVBAです。 後出しになってしまい、申し訳ございません。 前提のところへ追記させていただきます。
退会済みユーザー

退会済みユーザー

2020/10/29 07:16 編集

なるほど。 ちなみに、その処理でコピーしたシートはループ処理の対象になりますか? 多分対象外とは思いますが。
退会済みユーザー

退会済みユーザー

2020/10/29 07:21

ご返信ありがとうございます。 雛形(A)は含まれます。 理由としては、代入前の状態を保っておきたいというのがあります。 雛形(B)の事を仰っているのであれば、含まれません。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2020/10/29 07:34

「代入先がずれる」についてですが、 具体的にどの箇所のことですか? 後、その箇所で期待している代入先と、現状の代入先を教えて下さい。
退会済みユーザー

退会済みユーザー

2020/10/29 07:49

ご返信ありがとうございます。 代入先の件ですが、そもそもfor文の中で抜ける為の分岐が書かれていないというのがあり、 回した結果ずれが生じてしまった形になります お騒がせして申し訳ございません...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問