お世話になっています
よく、gotoは悪名高いとか、使わないほうが良いとか言われていますが、何故なのでしょう??
使わないようにしようと思っても、別の方法がわからず使ってしまっています。
例えば、「aaa」というシートがあるかどうか調べ、なければ作成するとした場合、
Dim myWS As Object
For Each myWS In Worksheets
If myWS.Name = "aaa" Then GoTo 1
Next
Worksheets.Add
ActiveSheet.Name = "aaa"
1
次の処理
というように書いていますが、これをgotoを使わないで…となるとどのように書いたら良いのでしょうか?
No.5ベストアンサー
- 回答日時:
こんばんは。
こんなんでも出来るよということで。。。
--------------------------------------------
Sub Test()
On Error Resume Next
Sheets("aaa").Select
If Err.Number > 0 Then
Err.Clear
Worksheets.Add
ActiveSheet.Name = "aaa"
End If
End Sub
------------------------------------------
それから質問者のコードの変数myWSの宣言ですが、今回のような場合にはちゃんと型宣言もすべきです。
Dim myWS As Object → Dim myWS As Worksheet
以上です。
!!!なるほど~!!!!
エラーを逆手に取るわけですね!!なんか感動しました。
これなら変数も増えず(むしろ減り)シンプルですね!
エラーをこういう風に使ったことはないので、今後活用できるよう調べてみます。
型宣言もするようにしてみます!
ありがとうございました。
No.6
- 回答日時:
こんばんは。
確かに、あるレベルぐらいまでは、コーディングの際に、Goto は、なるべく使わない方法で考えるべきだと思います。しかし、Excelの場合、他人とチームを組むということもあまりないし、まして、自分のコードをどのように書いたところで、半年も経てば他人のコードのように化してしまうわけで、あまり、それに縛られる必要はないと思います。
あえて言うと、いくつかのVBのルールがありますが、それををそのまま、短絡的にVBAに持ち込むことは出来ません。
気になる人は、マイクロソフトが提示したVBAの『最適化』をMSDNライブラリで、チェックしておいたほうがよいと思います。簡単に言うと、VBAのルールは、可読性を犠牲にしてでも、文字数を減らす方向にあるということです。
ですから、私は、実際のVBAコードと、掲示板に書くマクロとでは、その書法には違いがある時があります。
ちなみに、私の場合は、記録マクロのような定番ですが、以下のように書きます。
全体の流れを失わないで済みます。
'---------------------------------------------------
Sub Test()
Dim myWS As Worksheet
On Error GoTo ErrHandler
'エラーを吐くものなら何でも可
Set myWS = Worksheets("aaa")
'Next_Procedure
'次のコード
Set myWS = Nothing
Exit Sub
ErrHandler:
Worksheets.Add
ActiveSheet.Name = "aaa"
Resume
End Sub
'---------------------------------------------------
例えば、オブジェクトを作らないなら、
Set myWS = Worksheets("aaa")
これでも可。#5のtaocat さんの Select でも可
Application.Goto Worksheets("aaa").Range("A1")
今回、gotoを使わなくても方法があると分かり、感動しました。
まだまだ勉強中の身であり、なるべくgotoを使わずにいろいろな方法を考えたいと思います。
確かに半年前のコードは自分でももうわかりません。
(今より知識がないため、より一層難解です)
エラーコードを最後にまとめておくと流れが見やすいですね。
参考にしたいと思います。ありがとうございました!!
No.4
- 回答日時:
構造化プログラミングがはやった頃は「GOTO文を使うな」とか「上から下へ飛ぶときにしか使うな」と良く言われました。
(1970年代後半ころ)下から上へGOTO文で飛ばすと、プログラムのロジックが追いにくくなる → デバッグしにくい。ループしやすい。→ プログラム品質が落ちる という理由からです。
質問のループを抜けるGOTO文はまだ許される範囲だと思いますが、構造化プログラミングではこのような場合はフラグを使用するのが一般的です。でも行数が増えるとか、余分な変数が必要になるという理由で好まない人も多いと思います。
(コード自体は#01さん、#03さんも書かれているので記載しません)
なお構造化プログラミングではEnd IfのないIf文も嫌われますね。
たしかに、gotoで飛ばされると、デバッグしにくいですね!
行数が増えたり、変数が増えるのもスマートでない気もしますが、フラグを使う処理を利用して行こうと思います。
End Ifも合ったほうがいいとは初耳でした。
どうも、作ったプログラムが他のPCで上手く動かなかったりするので、なるべく基本に忠実に作ろうと思います。
ありがとうございました!
No.3
- 回答日時:
こんばんは。
その程度の使い方であればいいと思いますよ。
多用すると処理が繁雑になるというか分かりにくくなるので、多用はするなと言うことだと思います。
とりあえずGotoを使わないとすれば、フラグを立てて判断するくらいでしょうか。
Dim myWS As Object
Dim flg As Boolean
flg = False
For Each myWS In Worksheets
If myWS.Name = "aaa" Then flg = True
Next
If flg = False Then
Worksheets.Add
ActiveSheet.Name = "aaa"
End If
次の処理
No.2
- 回答日時:
構造化プログラミングと言った話の流れからのようですが、
残念ながら私は詳しくないです。
構造化プログラミング-Wikipedia
http://ja.wikipedia.org/wiki/構造化プログラミング
Gotoを「むやみに使いすぎると」【何のプログラムだか把握できなくなる】から、気をつけよう、ということのようです
参考までに以下の文章を読んでみるとどーなるか判るかと
http://www.algolab.co.jp/~lum/pcnyumon/hosoku06. …
なるほど、こういった背景があったのですね。
スパゲッティーテキスト、たしかに読む気が起こりません(笑)
ありがとうございました。
No.1
- 回答日時:
こんな感じではどうでしょうか?
Dim myWS As Object
Dim bExistFlg As Boolean
bExistFlg=False
For Each myWS In Worksheets
If myWS.Name = "aaa" Then
bExistFlg=True
Exit For
Next
If Not bExistFlg Then
WorkSheets.Add
ActiveSheet.Name = "aaa"
End If
フラグを多用することもソースコードを難解にする要因ではありますが、
多少はしょうがないと思います。
ありがとうございます
フラグを使えばいいのですね。
行は増えても、コードが上に戻るよりは良いということでしょうか。
参考になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) でシートをコピーしたときに 見えないようにする方法 1 2022/04/10 20:27
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) chromedriverのver-upで動作不安定となった 3 2022/07/07 11:32
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
-
4
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
5
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
6
DoEventsがやはり分からない
Visual Basic(VBA)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
FriendとPublicの違い。。。
Visual Basic(VBA)
-
9
エクセルの表示形式を保ったまま、セルに値を代入するには?
Visual Basic(VBA)
-
10
【EXCEL VBA】Range(A:A").Find(What:="キーワード")の1行目について"
Visual Basic(VBA)
-
11
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
12
VBAで別モジュールへの変数の受け渡し方法
Visual Basic(VBA)
-
13
Variant型で宣言してるのにEmptyになる
Visual Basic(VBA)
-
14
VBA モジュールで共通に使う変数の宣言方法
その他(Microsoft Office)
-
15
UserForm1.Showでエラーになります。
工学
-
16
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
17
【VBA】3個の図形をコピーしてSheet2に貼り付けたい
Excel(エクセル)
-
18
callで順に実行されるプロシージャを途中で止める方法
Excel(エクセル)
-
19
Excel2010のinputboxで複数データ一括入力について
Visual Basic(VBA)
-
20
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
AppActivateの使い方
-
ニンニク鼻の柏木由紀とサイボ...
-
excelで別のファイルを参照した...
-
この顔文字の文字の意味
-
AKB4816期生のオーディションの...
-
上方落語家の、『大喜利』見た...
-
リユース リデュース リサイ...
-
山本彩ちゃんのグッズはどこで...
-
AKB48の大きい画像がある...
-
2000年へいこうの主張について
-
AKB48は「一目でわかるモーニン...
-
AKB48大声ダイヤモンド 名前...
-
島崎遥香(ぱるる)の恋チュンの...
-
オトナモード
-
バンドのメンバー脱退は人間関...
-
バンドのメンバーが脱退したら...
-
キムタク、顔は男前なんですけ...
-
サクセス コスモス 百恵バッ...
-
ウツがおデブになった訳・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
AppActivateの使い方
-
上方落語家の、『大喜利』見た...
-
この顔文字の文字の意味
-
AKB前田敦子さん卒業発表時抱き...
-
郵便局の振込み手数料土日は?
-
KAT-TUNのリーダーって誰ですか?
-
TeXで\\fboxの中で\\begin{verb...
-
thunderbirdのメール設定について
-
6/16日放送のAKBINGOの、野菜シ...
-
AKB48の柏木由紀さんが総選挙で...
-
AKB48って?
-
HTML 横幅制限
-
アルミ缶ジュースはさびにくいか
-
この三人誰が1番「UZA」って感...
-
AKBの巨乳メンバー
-
AKB48大声ダイヤモンド 名前...
-
お色気番組によく出ていそうな...
-
AKBの画像がたくさんあるサイト...
-
AKB48 Beginner のPVで・・・
おすすめ情報