![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になっています
よく、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で上手く動かなかったりするので、なるべく基本に忠実に作ろうと思います。
ありがとうございました!
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
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
次の処理
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
"I love you" をかっこよく翻訳してみてください
あなたが考えるいちばんかっこいい "I love you"の訳を教えてください。
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
6
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
エクセルの表示形式を保ったまま、セルに値を代入するには?
Visual Basic(VBA)
-
9
TextBoxから数字が文字として入力される?
Visual Basic(VBA)
-
10
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
11
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
12
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
13
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
14
エクセル マクロ 標準モジュールのマクロから、シートモジュールのマクロを呼び出す
Excel(エクセル)
-
15
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
16
オートフィルターをかけ、#N/A以外で絞込みするVBA記述をご教示ください
Excel(エクセル)
-
17
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
18
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
19
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
20
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
2000年へいこうの主張について
-
さっしーと支店メンバーの関係...
-
AKB島崎遙香さんは なぜ「...
-
AKB48大声ダイヤモンド 名前...
-
モーニング娘とベリーズ工房って
-
西川貴教さんは絶倫と言う噂は...
-
櫻坂についてです。 毎月グリー...
-
TOSHIとYOSHIKIの不仲の原因
-
顕正会 脱退 顕正会を脱退した...
-
矢沢永吉のファンって。
-
ウツがおデブになった訳・・・
-
B‘zの人気がいまいち理解でき...
-
ラッツ&スターのメンバー構成...
-
元EXILEのSHUNの脱退理由
-
ケツメイシのトモダチのPVに...
-
GENERATIONSのメンバーで 身体...
-
クローディーヌ ロンジェをご...
-
すとぷりの新曲の「苺色夏花火...
-
思い出せないバンドがあるんで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
AppActivateの使い方
-
AKB島崎遙香さんは なぜ「...
-
AKB48は「一目でわかるモーニン...
-
KAT-TUNのリーダーって誰ですか?
-
AKBの巨乳メンバー
-
AKB48はなぜ爆発的な人気を得た...
-
島崎遥香ことぱるるは何系の美...
-
アルミ缶ジュースはさびにくいか
-
2000年へいこうの主張について
-
ジャニーズ総選挙!!
-
郵便局の振込み手数料土日は?
-
上方落語家の、『大喜利』見た...
-
VBAのエラーについて
-
AKB48 Beginner のPVで・・・
-
AKB前田敦子さん卒業発表時抱き...
-
Excelでマクロを使いセルの内容...
-
AKB48の松井珠理奈はAKBファン...
-
TeXで\\fboxの中で\\begin{verb...
-
この顔文字の文字の意味
おすすめ情報