Sub compare()
'Not 演算子のあとの(カッコ)は本当は不要なのですが可読性のためにあえて付与
Dim wSummary As Worksheet
Dim w As Worksheet
Set wSummary = Worksheets("Summary")
Debug.Print "= で比較"
For Each w In Worksheets
Debug.Print w.Index; w.Name = wSummary.Name
Next
Debug.Print "<> で比較"
For Each w In Worksheets
Debug.Print w.Index; w.Name <> wSummary.Name
Next
Debug.Print "not = で比較"
For Each w In Worksheets
Debug.Print w.Index; Not w.Name = wSummary.Name
Next
Debug.Print "not <> で比較"
For Each w In Worksheets
Debug.Print w.Index; Not w.Name <> wSummary.Name
Next
Debug.Print "is で比較"
For Each w In Worksheets
Debug.Print w.Index; w Is wSummary
Next
Debug.Print "not is で比較"
For Each w In Worksheets
Debug.Print w.Index; Not w Is wSummary
Next
End Sub
> 日付を扱う時はDateAddを使わないと不具合が生じる事もあるのでしょうか。
日付は内部的には小数値として保持されています。
Sub dt_sample()
Dim dt As Date
dt = #9/10/2023 3:23:00 PM#
Debug.Print dt '2023/09/10 15:23:00
Debug.Print CDbl(dt) '45179.6409722222
dt = 0
Debug.Print dt '0:00:00
Debug.Print CDbl(dt) '0
dt = #12:00:00 AM#
Debug.Print dt '0:00:00
Debug.Print CDbl(dt) '0
End Sub
凜さんの投稿
(投稿ID: 5504)
今回のカレンダー作成も先に自分でやってから、本文を読ませて頂きました。
実際に自分で手を動かしてから読んでみると、より理解しやすく答え合わせを楽しみながら出来ています。
その中で2カ所、気になるところがありましたので質問させてください。
まず下記の部分についてです。
私はこのように書きました。
これは書き方の違いと理解していいものかわからず、使い慣れていない「Not」「Is」をまず調べてみました。
Isは比較演算子で値ではなくオブジェクトを対象として使う。Notは「~でなければ」という条件を表すので、小川先生はオブジェクトを検証し、私はプロパティを比較しているという事がわかりました。
ここまで考えたのですが、これが書き方の違いなのか理由があるのかがわかりませんでした。
次に日付を1ずつ足していく下記部分ですが、私は「D = D + 1」としていました。
今回は動作として問題はなさそうですが、日付を扱う時はDateAddを使わないと不具合が生じる事もあるのでしょうか。
ご指導宜しくお願い致します。
小川 慶一さんのコメント
(コメントID: 8258)
エクセルではシート名は同一ファイル内で Unique なのでオブジェクトの .name プロパティの比較でも唯一の対象を見いだせます。
Is 演算子は、「同一オブジェクトかどうか」を比較する演算子なので、プロパティまで調べることなく同一かどうかの判定を行えます。
以下の2つの動画を復習してください。
発展1講座第4章 - 論理演算子 イントロダクション
https://forum.pc5bai.com/lesson/page/207/
発展1講座第4章 - 論理演算子 解説
https://forum.pc5bai.com/lesson/page/208/
そのうえで、以下のコードを実行してみてください。
> 日付を扱う時はDateAddを使わないと不具合が生じる事もあるのでしょうか。
日付は内部的には小数値として保持されています。
整数部分が日付なので dt = dt + 1 とすれば 24時間分が加算されます。
日付であればこの計算でよいでしょうが、24進数の時間や60進数の分、月によって日数の異なる月を加算するには DateAdd関数のほうが便利でしょう。
凜さんなら以上で十分と思いますが、まだしっくり来ないことがあるようでしたらまたご相談ください。
凜さんのコメント
(コメントID: 8260)
私はつまづかないと「理解できたけど使えていない」事に気付けないので、いいきっかけになりました。
ありがとうございます。
記載して頂いたコードも実行してみました。
どれも必要な結果を得られますが、可読性を考えるとプロパティで比較するよりオブジェクトで比較した方が良いと理解しました。
特に今回必要なのは「シートの名前が同じか」ではなく「同じシートか」という事なので、何を比較しているか考えれば Is を用いるという判断ができそうです。
(小川先生の意図した事を理解できたのかドキドキしています・・)
時間についてはとてもすっきりしました。
日頃、業務で使っているファイルの関数で日をまたいだ時に日時の計算結果がおかしい事があります。それも表面に見えていない数値があるとわかっているのに、意識が及んでいない事が原因なんだろうと納得しました。
常に意識しておかないと思わぬところで計算を狂わせてしまいそうなので、DateAdd関数を使う癖をつけておこうと思います。
今回も丁寧なご説明をありがとうございました。
いつもやる気を引き出して頂いています。