Sub hogege()
Dim w As Worksheet
Dim f As String
Application.DisplayAlerts = False
For Each w In Worksheets
Debug.Print w.Name
f = False '最初判定フラグはfalseにしておく
ThisWorkbook.w.Select
If Left(w.Name, 4) = "main" Then
'選択したシート名の前4文字がmainならフラグをTrueにする
f = True
End If
If f <> True Then
w.Delete
End If
Next
End Sub
Sub set_w_sample()
'文法確認クイズ
'[2] は文法エラーです。
'なぜ[1] は OK で [2] は NG なのか、自分の言葉で説明してみてください。
Dim w As Worksheet
Set w = ThisWorkbook.Worksheets("main")
w.Tab.Color = vbRed '[1] OK
'ThisWorkbook.w.Color = vbBlue '[2] NG
End Sub
Sub foreach_thisworkbook_only()
'ThisWorkbook 内のすべてワークシートについて連続処理をする場合は、以下のように書きます
Dim w As Worksheet
For Each w In ThisWorkbook.Worksheets
Debug.Print w.Name
Next
'以下はNG
'For Each w In Worksheets
' Debug.Print ThisWorkbook.w.Name
'Next
End Sub
Sub hogege()
Dim w As Worksheet
Dim f As String
Application.DisplayAlerts = False
For Each w In Worksheets
Debug.Print w.Name
f = False '最初判定フラグはfalseにしておく
ThisWorkbook.w.Select
If Left(w.Name, 4) = "main" Then
'選択したシート名の前4文字がmainならフラグをTrueにする
f = True
End If
If f <> True Then
w.Delete
End If
Next
End Sub
>>> Sub set_w_sample() '文法確認クイズ '[2] は文法エラーです。 'なぜ[1] は OK で [2] は NG なのか、自分の言葉で説明してみてください。
Dim w As Worksheet
Set w = ThisWorkbook.Worksheets("main")
w.Tab.Color = vbRed '[1] OK
'ThisWorkbook.w.Color = vbBlue '[2] NG
End Sub
Sub foreach_thisworkbook_only()
'ThisWorkbook 内のすべてワークシートについて連続処理をする場合は、以下のように書きます
Dim w As Worksheet
For Each w In ThisWorkbook.Worksheets
Debug.Print w.Name
Next
'以下はNG
'For Each w In Worksheets
' Debug.Print ThisWorkbook.w.Name
'Next
End Sub
84nomuraさんの投稿
(投稿ID: 5440) 添付ファイルのダウンロード権限がありません
課題(Mondai1のモジュール)について質問あります。
<課題>
'シート「main1」、「main」以外のすべてのシートを削除するマクロを作れ
'(シートを削除するときに警告のダイアログが出るが、気にしなくてよい)
'ヒント: For Each構文を使用する。ある条件を満たさなかったら削除。その条件とは、以下のどちらか
' [1] 「main1」、「main」に共通するのは、先頭4文字が"main"なこと。
' [2] w.name <> "main1" and w.name <> "main"
'シート「main」の「伝票作成」ボタンをクリックすると
'複数のシートを自動的に生成できますので、必要に応じ利用してください。
<作成したもの>
<質問>
シートを選択するところ、
ThisWorkbook.w.Selectと書くと、”メソッドまたはデータメンバが見つかりません”とエラーになりますが、
w.Select と書くとエラーになりません。基本的なことですみませんが、なぜでしょうか。また、できればブックまで指定したいのですが、どうすればよいでしょうか。
小川 慶一さんのコメント
(コメントID: 8045)
> w.Select と書くとエラーになりません。基本的なことですみませんが、なぜでしょうか。
> また、できればブックまで指定したいのですが、どうすればよいでしょうか。
以下のサンプルを示します。
これらを実際に動かし、コードの内容について検証し、ご自身で考察し、そして、自分なりに説明してみてください。
「説明できない」、「理解できない」ということになってしまっても良いのですが、その場合も、そう述べてください。
ただし、どのコードのどの行が理解できないのかをしっかり自分の言葉で説明してください。
たとえば、「sub xxx の ○行目のXXは△△となるが、これは納得できない。XXは☆☆なのだから、▲▲となるはずだと思う」等々。
小川 慶一さんのコメント
(コメントID: 8046)
全体的なコメントとしては、より思考/行動を洗練させられるかと思います。現状は、注意が甘いと感じます。
以下の2点等からです。
[1] コードが汚い
[2] 質問に最適化されたコードでない
[1] コードが汚い
[1-a] 不必要に空白が多い
[1-b] インデント不正
[1] に関する部分だけ解決したのものの一例を示します。
いただいたものより、だいぶ引きしまった印象かと思います。
(空白行を可読性を高めるために入れることはありますが、空白2行は多すぎです)
コードの中身について検討するならば、最低でも、上記くらいには整形してからにするべきです。
人に見せるのであればなおさらです。
おそらく、基礎編演習のころからコードの整形への配慮が不足していたからでしょう。
構造への配慮の欠けた可読性の低いコードで検討しようとしていても、構造的な思考力を高めることはできません。
「より洗練されたコードを書こう」という意識をこれまで以上に持ってください。コードがぐちゃぐちゃだと、問題があっても仔細に検討することが難しくなります。結果、より高度なコードを書ききることも難しくなります。
慣れれば、このくらいの整形は30秒もあれば完了できます。
ご自身のコードを上記の方になおすまで、何秒かかるでしょうか。ストップウォッチを使って計測してみてください。
これを5回くりかえし、そのすべての回の結果を報告してください。
そして、5回くりかえしたあとでの感想も示してください。
[2] 質問に最適化されたコードでない
今回の質問に関連しない部分は除外しました。
この状態でも現象は再現します。
質問するならば、質問内容に無関係なコードは削ぎ落とし、ここまでしてからにしたいところです。
「問題を絞りこむ」という姿勢をもっと持つように意識してください。
「自分が書いたプログラムについて評してほしい」ということであればいただいた投稿でも良いですが、今回は違いますね。
質問の趣旨に最適化されたコードを提示しましょう。
そのほか、「<作成したもの>」というタイトルラベルでは、「作成したもの」という文字列の前後の記号が、前のものは全角、後のものは半角になっています。
こういうのも、注意力不足の象徴です。
この取り組み方だと、すぐにまた次の限界が来てしまうでしょう。
学習内容の抽象度はどんどんあがっていきます。対応力をつけるため、上記の点、今から十分に心がけてください。
まずは、上で書いた「5回連続でトライして時間を計測する」ワークを行ってください。
先のコメントでお渡しした宿題とは同時にでなくてかまいませんので、こちらについても、返答お待ちします。
5回やると、人生変わりますよ。
84nomuraさんのコメント
(コメントID: 8047) 添付ファイルのダウンロード権限がありません
以下の結論となりました。
1回目_3分
2回目_2分10秒
3回目_1分6秒
4回目_58秒
5回目_55秒
添付のvisual basic editorの"Mondai1"をご確認ください。
<感想>
Dim,for next,forが来るたびにスペースを空ける
スペースを空ける時は、半角スペース一つずつ開ける(Dimの段落とforの段落はスペース1つ、forとnextの間はスペース1つetc・・)
空白行を消すには、shift &↓が有効か
日頃、社内向けのゆるい仕事をしているため、社会の厳しさを教わった思いです。
小川 慶一さんのコメント
(コメントID: 8048)
技術力が高まった感触はあるでしょうか。
最初にご自身で提示されたマクロと比較して、改めてどんな感想を抱きますか。
そして、新たにイチから書くとして、同様の形状にさせることを最初から意識してマクロを書き上げられそうだという感触はありますか。
もちろん、感想ですので、相手の期待に沿った優等生的な回答が望ましいというわけではありません。
たとえば、「技術が高まった感触はない」、「当初に提示したマクロの方が、質問の趣旨をより明確に反映していると考える。また、読みやすく、メンテナンスも容易そうに思える」、「さっぱり今後に活かせる気がしない」でも良いです。
84nomuraさんのコメント
(コメントID: 8049)
整形したほうが見やすいので、今後も意識してメンテナンスするようにします。
84nomuraさんのコメント
(コメントID: 8050)
最初の宿題に対する回答です。
>>>
Sub set_w_sample()
'文法確認クイズ
'[2] は文法エラーです。
'なぜ[1] は OK で [2] は NG なのか、自分の言葉で説明してみてください。
>>>
[1] がOKなのは、
で、このコードが書いてあるブックの、"main"というシートにwというニックネームを付けている
[1]は、wに従属するtabというオブジェクトのcolorというプロパティの色を赤くする、という風に
従属関係が成立している構文になっているため、OK
[2]は、 'ThisWorkbook.w.Color = vbBlue '[2] NG
のwの中にThisworkbookが含まれているので、Thisworkbookを二回繰り返している
Thisworkbookという上位オブジェクトに従属するオブジェクトは、それよりも下位のオブジェクトでなくては
ならないのですが、Thisworkbookの後に自分と同じ階層のオブジェクトであるThisworkbookを持ってこようとしているのでNG ?
と思いました。
話がそれますが、最初の私の質問
>>
>>
が何故ダメなのか、というところは、
ThisWorkbook.w.Selectについて
wがThisworkbookに従属する要素になっていないのでNGという理解であっていますか
・wは、アクティブ(=現在表示されている)ブックの中のどれか一つのシートという意味
・アクティブブック=Thisworkbookとは限らないため、wは、Thisworkbookを構成する一要素ではない。
よって、wはThisworkbookに従属しているわけではない
小川 慶一さんのコメント
(コメントID: 8051)
その説明だと、 ActiveWorkbook と ThisWorkbook が同じブックを指している場合の説明がつきませんね。
当初のエラーメッセージも以下のものでした。
> ThisWorkbook.w.Selectと書くと、”メソッドまたはデータメンバが見つかりません”とエラーになります
上記のとおり、「w は、 ThisWorkbook の メソッドでもデータメンバでもないから」というのが、いちばんシンプルな回答です。
「メンバ」という言葉については、発展編第2章で扱いました。
これについては、しっかり理解されているでしょうか。
たとえば、 ThisWorkbook のメンバーとして、 Worksheets というものがあります。
なので、以下の書き方はありです。
上記のコードで、 ThisWorkbook にある、 Worksheets というメンバーのうちの、 "main" という名前のワークシートに対して、 w というニックネームをつけました。
でも、以下の [2] は、NGです。
なぜ [2] がダメかというと...。
たしかに、[1] では 変数 w をシート「main」のニックネームとしました。
でも、これは、ただの変数です。たとえそれをシート「main」のニックネームとしたからといって、 ThisWorkbook のメンバーに 「w」 なるのものが勝手に追加されるわけではありません。
もうちょっと、露骨に書くと、以下のような感じです。
以下がNGなのはさすがにご理解いただけるかと。
であれば、「途中に前記の [1] が挟まったからといって、 [2] のような書き方ができるわけはない」というところに理解が至れば良いのですが。
まずは、この説明でいかがですか。
何度か読み返してみて、それでもしっくりこなかったら、声に出して丁寧に数回読み返してみて、それでも分からなかったら、それから数時間置いてからもういちど同じことをしてみてください。
84nomuraさんのコメント
(コメントID: 8073)
>>
たしかに、[1] では 変数 w をシート「main」のニックネームとしました。
でも、これは、ただの変数です。たとえそれをシート「main」のニックネームとしたからといって、 ThisWorkbook のメンバーに 「w」 なるのものが勝手に追加されるわけではありません。
確かに、今後mainをWと呼ぶことにします! となっても、ThisWorkbookにwという従属要素の何かプロパティがあるかというと、ないのでエラーになるのだと思いました。ありがとうございます。
小川 慶一さんのコメント
(コメントID: 8075)
> 確かに、今後mainをWと呼ぶことにします! となっても、ThisWorkbookにwという従属要素の何かプロパティがあるかというと、ないのでエラーになるのだと思いました。ありがとうございます。
ですね (^^
理解が深まったようで良かったです。
ひきつづき、よろしくお願いいたします (^^