- ベストアンサー
エクセルVBAで繰り返し条件について
- エクセルVBAで繰り返し条件について教えてください。上手くいかない場合の処理方法も知りたいです。
- For Each ~ Next を使って繰り返し処理を行っています。特定のシートが存在する場合は内容をクリアし、他のシートから値をコピーして貼り付けたいです。
- 該当のシートが存在しない場合は、新しいシートを追加し、値を貼り付けたいです。上手くいかない時の処理方法が知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 >それぞれでほぼ同じ処理(実際にはコピペ+いくつかの処理)を行うのですが、 >同じ命令を変数のような扱いで省略して書くことは出来るのでしょうか。 「ほぼ同じ処理」と「全く同じ処理」で当然のコトです違いますので、 「全く同じ処理」の場合の一例です。 Sub Sample2() Dim k As Long, myFlg As Boolean For k = 1 To Worksheets.Count If Worksheets(k).Name = "指定した名前" Then myFlg = True Exit For End If Next k If myFlg = True Then GoTo 処理 Else Worksheets.Add after:=Worksheets(Worksheets.Count) With Worksheets(Worksheets.Count) .Activate .Name = "指定した名前" End With GoTo 処理 End If 処理: Worksheets("コピー元").Cells.Copy With Worksheets("指定した名前") .Activate .Range("A1").Select End With Selection.PasteSpecial Paste:=xlPasteValues End Sub ※ >同じ命令を変数のような扱いで・・・ というコトですので、 敢えてmyFlgがTRUEの場合とFALSEの場合で分岐しましたが myFlgがFALSEの場合だけのIF~Then にすれば 新しくSheetを追加 → Sheet名を"指定した名前" として End If の後に そのままTRUE・FALSE関係なく 「処理」のコードを記載すれば大丈夫だと思います。m(_ _)m
その他の回答 (3)
- keithin
- ベストアンサー率66% (5278/7941)
>For Each ~ Next を使って繰り返し処理を行っています。 この部分は今回ご質問の内容と無関係なのでスルーします。 >あるブックに指定した名前のシートがあれば、 >そのシート内の内容を全てクリアして、 >コピー元のシートの内容をコピーして値で貼り付けるようにしたい : >該当するシートがない場合は、 >該当するシート名のシートを追加し >コピー元のシートの内容をコピーして値で貼り付けるようにしたい ヤリタイ事: 「謎のコピー元ブック」の「コピー元シートの内容」をコピーする(仮にA1:Z100のセル範囲を) 「謎の貼り付け先ブック」の中で「指定した名前のシート」を探す 有れば値貼り付ける 無ければ「指定した名前のシート」を追加して値貼り付ける sub macro1() on error goto errhandle workbooks("目的ブック.xls").worksheets("指定の貼付先シート名").range("A1:Z100").value _ = workbooks("コピー元ブック.xls").worksheets("コピー元シート名").range("A1:Z100").value exit sub errhandle: workbooks("目的ブック.xls").activate workbooks("目的ブック.xls").worksheets.add activesheet.name = "指定の貼付先シート名" resume end sub
お礼
ご回答ありがとうございます。 そういった書き方もあるんですね! シートを追加した後に、Resumeを使って、エラーが起こったところからやり直せば良いということですね。 (↑理解が足りていなかったらすみません。) 全く自分では思いつきませんでした。 勉強になりました!ありがとうございます。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! ひとつのBook内での操作としています。 追加するSheetをどこに追加するか判らないので、とりあえず最終Sheetの次に追加しています。 一例です。 Sub Sample1() Dim k As Long, myFlg As Boolean For k = 1 To Worksheets.Count If Worksheets(k).Name = "指定した名前" Then myFlg = True Exit For End If Next k If myFlg = True Then 'うまくいっているコード Else Worksheets("コピー元").Cells.Copy Worksheets.Add after:=Worksheets(Worksheets.Count) With Worksheets(Worksheets.Count) .Activate .Name = "指定した名前" .Range("A1").Select End With Selection.PasteSpecial Paste:=xlPasteValues End If End Sub ※ コード内の「指定した名前」や「コピー元」は実際のSheet名にしてください。 こんな感じではどうでしょうか?m(_ _)m
お礼
ありがとうございます。 まさに悩んでいました、繰り返し処理とIF文の流れを狙ったように処理することができました。 Booleanを用いて先に繰り返し処理から抜け出せば良いんですね。 大変参考になりました。 もしよろしければ、もう一つ教えて頂けませんでしょうか。 後半のIF文でthen~、else~それぞれでほぼ同じ処理(実際にはコピペ+いくつかの処理)を行うのですが、 同じ命令を変数のような扱いで省略して書くことは出来るのでしょうか。
- mt2008
- ベストアンサー率52% (885/1701)
この様な流れで処理しましょう。 1.あるブックに指定の名前のシートがあるか確認 2.指定の名前のシートが無ければ作る 3.その名前のシートの内容をクリアしてコピー元シートから値をコピー 質問の意味を勘違いしていたら失礼
お礼
ご回答ありがとうございます。 私のそのようなイメージで作れれば良いなと思っていたのですが、 繰り返し処理(と、その脱出)とIF文を組み合わせいるうちに分からなくなってしまいました。
お礼
ご回答ありがとうございます。 Go to ~ を利用して処理のコードを書けば良いのですね。 上手く実行することが出来ました。 自分で書くと重複表現が多く、読みづらいと思っていました。 教えて頂いた内容を参考に書いていきたいと思います。 ありがとうございました。