お世話になっています
よく、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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
5
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
6
UserForm1.Showでエラーになります。
工学
-
7
VBAでワークシートを引数としてサンプル関数に渡したい
Visual Basic(VBA)
-
8
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
9
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
10
モーダルフォームとモードレスフォーム
Visual Basic(VBA)
-
11
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
12
Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。
Visual Basic(VBA)
-
13
(Excel VBA)and,orについて
Excel(エクセル)
-
14
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
15
ExcelVBAで質問です。Workbook_openイベントが発生し
その他(Microsoft Office)
-
16
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
17
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
18
【EXCEL VBA】Range(A:A").Find(What:="キーワード")の1行目について"
Visual Basic(VBA)
-
19
VBA モジュールで共通に使う変数の宣言方法
その他(Microsoft Office)
-
20
for each の現在の配列ポインタ VBA
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
DHCPサーバの設定について
-
akbで抜いたことありますか? ...
-
顕正会 脱退 顕正会を脱退した...
-
櫻坂についてです。 毎月グリー...
-
サザンオールスターズや桑田佳...
-
ケツメイシのトモダチのPVに...
-
初代恵比寿マスカッツのメンバ...
-
「脱退」の反対語は何ですか?
-
逆再生PV
-
ラッツ&スターのメンバー構成...
-
ジェイル大橋の脱退理由 ~聖...
-
矢沢永吉のファンって。
-
リミックスバージョンって、音...
-
チョベリバとキムタクはなにか...
-
元AKB48の中西里菜が「やまぐち...
-
ブランニューソングってなんですか
-
女性2人男性1人のバンドの曲...
-
この下記のGReeeeNのメンバーの...
-
国民年金を未納した場合の問題点
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのVBAでGoToの代わりに…
-
AppActivateの使い方
-
KAT-TUNのリーダーって誰ですか?
-
AKB48の松井珠理奈はAKBファン...
-
NEWSのメンバー
-
AKB48はなぜ爆発的な人気を得た...
-
山本彩ちゃんのグッズはどこで...
-
日置明子さん SONOさん が ...
-
AKB48について語りません...
-
Excelでマクロを使いセルの内容...
-
「ハロー!プロジェクト2004夏...
-
AKB48は「一目でわかるモーニン...
-
エクセル:日付を曜日で表示す...
-
AKBの巨乳メンバー
-
AKB48、顔と名前が分かる...
-
DHCPサーバの設定について
-
thunderbirdのメール設定について
-
エクセル IF関数 複数条件?
-
AKB島崎遙香さんは なぜ「...
-
関数で整理する方法を教えてく...
おすすめ情報