
お世話になっています
よく、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も見ています
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
-
4
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
5
「Columns(A:C")」の列文字を数字にして表記したい"
Excel(エクセル)
-
6
GoTo文とかSelect文の処理の仕方に関して
Visual Basic(VBA)
-
7
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
8
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
9
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
10
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
11
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
12
エクセルStatusBar表示が変化しない
Excel(エクセル)
-
13
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
14
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
15
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
16
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
17
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
18
マクロ実行時、ユーザーフォームにラベルのテキストが表示されません。
Access(アクセス)
-
19
配列をループでたくさん宣言したいのですが、配列名や変数名を変数で宣言することはできませんか?
Visual Basic(VBA)
-
20
2つ以上の変数を比較して最大数を求めたい
Word(ワード)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DHCPサーバの設定について
-
ExcelのVBAでGoToの代わりに…
-
上方落語家の、『大喜利』見た...
-
ラッツ&スターのメンバー構成...
-
サザンのことで教えてくださぁい!
-
木村拓哉について
-
ウルフルズが3人になったのっ...
-
ザローリングストーンズの、ブ...
-
ザローリングストーンズは、202...
-
ナイナイサイズ
-
ちびまる子ちゃんの登場キャラ...
-
ヒステリックブルーのメンバー...
-
嵐のメンバーはいくつに見えま...
-
超速弾きアルペジオのギタリスト
-
脱退届け
-
モーニング娘の矢口さんはどう...
-
西川貴教さんは絶倫と言う噂は...
-
矢沢永吉のファンって。
-
顕正会 脱退 顕正会を脱退した...
-
おニャン子クラブが、いまだに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
AppActivateの使い方
-
DHCPサーバの設定について
-
Cygwinの正規表現
-
オートシェイプの位置
-
AKB48
-
エビ中の松野莉奈さん天国に行...
-
第63回紅白SKE48ダジャレ場面...
-
ワイルドカードにしたくない
-
さかなくんは、結婚してますか。
-
AKB48の・・・
-
Excelでマクロを使いセルの内容...
-
AKB48について教えてください
-
6/16日放送のAKBINGOの、野菜シ...
-
今年のAKB48の総選挙 1位〜3位...
-
AKB48
-
今年のAKB48総選挙について
-
iMACのG3が売っている中...
-
KAT-TUN
-
thunderbirdのメール設定について
おすすめ情報