Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
NETWORKDAYS関数について
投稿日時: 18/01/16 15:27:46
投稿者: Dellcasio

お世話になっております。
 
NETWORKDAYS関数で休日に0を返すのですが、
下記のコードだと月の最終日だけ
入力されません。
どこに原因があるのかわかりませんので
ご指導を頂けないでしょうか?
 
宜しくお願い致します。
 
 
 
Option Explicit
 
 
Dim i
Dim i2
 
 
Sub test02()
 
For i = 2 To 35
 
Cells(i, "A") = DateSerial(Year(Now), Month(Now), i - 1)
Cells(i, "B") = Format(DateSerial(Year(Now), Month(Now), i - 1), "aaa")
 
 
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
 
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
 
Next i
 
End Sub

回答
投稿日時: 18/01/16 16:08:38
投稿者: mattuwan44

Sub test02()
    Dim i
 
    For i = 2 To 35
 
        Cells(i, "A") = DateSerial(Year(Now), Month(Now), i - 1)
        Cells(i, "B") = Format(DateSerial(Year(Now), Month(Now), i - 1), "aaa")
        Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
         
        If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
    Next i
End Sub
 
数式を入れる前に強制終了しているから、最後、数式がセルにはいらないですね。。。
 
遊びで、ループしないでも書けます^^
 
Sub test03()
    Dim s As Long
    Dim a As Long
    Const myAddr As String = "A2"
 
    s = DateSerial(Year(Date), Month(Date), 1)
    a = DateSerial(Year(Date), Month(Date) + 1, 1) - s
 
    With Range(myAddr).Resize(a)
        .Cells(1, 1).Value = s
        .Cells(1, 1).AutoFill Destination:=.Cells, Type:=xlFillDays
        .Offset(, 1).Formula = "=TEXT(" & myAddr & ",""aaa"")"
        .Offset(, 3).Formula = "=IF(WEEKDAY(" & myAddr & ",11)<6,1,0)"
    End With
End Sub

投稿日時: 18/01/16 17:21:17
投稿者: Dellcasio

mattuwan44さん
ご回答ありがとうございます。
mattuwan44さんのコードだと
問題なく出来ました。
ありがとうございます。
 
あと質問なのですが、
 
 
下のコードですが、D 列を C 列に変更すると
戻り値が、Oとか1ではなく 1900/1/1 の様な
日付が返って来ます
この理由がわかりません
もし分かれば教えて頂けないでしょうか?
宜しくお願い致します。
 
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
 
     ↓    ↓      ↓
 
Range("C" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
 
 
 

投稿日時: 18/01/16 17:47:26
投稿者: Dellcasio

 
あと 追加質問なのですが、、
 
For i = 2 To 35
&nbsp;
Cells(i, "A") = DateSerial(Year(Now), Month(Now), i - 1)
Cells(i, "B") = Format(DateSerial(Year(Now), Month(Now), i - 1), "aaa")
&nbsp;
&nbsp;
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
&nbsp;
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
&nbsp;
Next i
 
のコードの下に以下のようなコードを書き足すと
以下のコードは実行されません
 
ただし、下記のコードを単独で書くと問題なく
実行出来ます。
 
この様な問題は、時間の関数を使っているから起きる
のでしょうか?
詳しい方がいらっしゃったら
ご教授をお願い致します。
 
 
 
For k = 2 To 35
 
Range("M" & k).Formula = "=NETWORKDAYS(A" & k & ", A" & k & ")"
 
Next k

回答
投稿日時: 18/01/16 18:00:18
投稿者: もこな2

引用:
下のコードですが、D 列を C 列に変更すると戻り値が、Oとか1ではなく 1900/1/1 の様な
日付が返って来ますこの理由がわかりません
もし分かれば教えて頂けないでしょうか?
ちょっと自信ないけど、むしろ戻り値が1だから1900/1/1
って表示されてるんじゃないでしょうか?
 
適当なセルに1 って入力してから セルの書式設定の表示形式を 日付に直してみて下さい。
同じ状況になるとおもいます。

回答
投稿日時: 18/01/16 18:07:04
投稿者: もこな2

引用:
以下のコードは実行されません

If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End 
ここの条件満たして、プロシージャが終わってるからとか?

回答
投稿日時: 18/01/16 18:18:40
投稿者: もこな2

連続投稿すみません。
コードを読み直してみたんですが
 
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
じゃなくて
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then Exit For
ってやりたかったのではないかと思ったりしました・・・ちがってたらすみません。

回答
投稿日時: 18/01/16 18:47:50
投稿者: bi

Dellcasio さんの引用:

あと 追加質問なのですが、、
 
For i = 2 To 35
&nbsp;
Cells(i, "A") = DateSerial(Year(Now), Month(Now), i - 1)
Cells(i, "B") = Format(DateSerial(Year(Now), Month(Now), i - 1), "aaa")
&nbsp;
&nbsp;
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
&nbsp;
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
&nbsp;
Next i
 
のコードの下に以下のようなコードを書き足すと

mattuwan44さんが16:08:38の投稿で
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
を入れる位置が違うと青字でわかりやすく指摘していたのになぜまた修正前のコードを使うのですか?

投稿日時: 18/01/16 19:15:44
投稿者: Dellcasio

bi さんの引用:
Dellcasio さんの引用:

あと 追加質問なのですが、、
 
For i = 2 To 35
&nbsp;
Cells(i, "A") = DateSerial(Year(Now), Month(Now), i - 1)
Cells(i, "B") = Format(DateSerial(Year(Now), Month(Now), i - 1), "aaa")
&nbsp;
&nbsp;
If DateSerial(Year(Now), Month(Now), i - 1) = DateSerial(Year(Now), Month(Now) + 1, 0) Then End
&nbsp;
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
&nbsp;
Next i
 
のコードの下に以下のようなコードを書き足すと

mattuwan44さんが16:08:38の投稿で
Range("D" & i).Formula = "=NETWORKDAYS(A" & i & ", A" & i & ")"
を入れる位置が違うと青字でわかりやすく指摘していたのになぜまた修正前のコードを使うのですか?

 
 
biさん
ご回答ありがとうございます。
それと前回のレスも、回答が入れ違いになり
お礼が言えませんでしたのでこちらで
お礼を言わせて頂きます。
ありがとうございます。
 
この質問は、問題を解決する前のもので
どうしても実行できないので
質問をしたものです。
 
 

投稿日時: 18/01/16 19:22:27
投稿者: Dellcasio

もこな2 さんの引用:
引用:
下のコードですが、D 列を C 列に変更すると戻り値が、Oとか1ではなく 1900/1/1 の様な
日付が返って来ますこの理由がわかりません
もし分かれば教えて頂けないでしょうか?
ちょっと自信ないけど、むしろ戻り値が1だから1900/1/1
って表示されてるんじゃないでしょうか?
 
適当なセルに1 って入力してから セルの書式設定の表示形式を 日付に直してみて下さい。
同じ状況になるとおもいます。

 
もこな2さん、
ご回答ありがとうございます。
それと前回のレスも、回答が入れ違いになり
お礼が言えませんでしたのでこちらで
お礼を言わせて頂きます。
ありがとうございます。
 
ご指摘の通り 1 を入れると日付が入力されました。

回答
投稿日時: 18/01/17 08:08:17
投稿者: mattuwan44

のコードの下に以下のようなコードを書き足すと 
以下のコードは実行されません 
 
ただし、下記のコードを単独で書くと問題なく 
実行出来ます。 

何をもって実行された、あるいは実行されてないと判断されてますか?
 
コードは間違って実行されたりされなかったりはしません。
書いてある通りに実行されます。
書いてある通りに実行されますが、書いた人の思い通りに動くかは保証されません。
書く人の思いを確実に反映した文章を書かなければ、間違った結果が出ます。
 
こういう時はスッテップインというのを使って1行づつ実行してみるのが一番です。
http://www.239-programing.com/excel-vba/basic/basic023.html
プロシージャ内にカーソルを置き、
F8キー連打で実行します。
 
プログラムが長くなれば、
ブレークポイントを置いて見たり、
ウォッチ式をセットしてみたりして、
どこが思い通りに書けてないか間違いを見つけます。(この一連の作業をデバッグと呼びます)
 
http://www.ken3.org/vba/excel-help.html

回答
投稿日時: 18/01/17 08:29:34
投稿者: mattuwan44

<<ヒント>>
ヘルプからの引用〜〜〜〜〜〜
ステートメント 内容
End プログラムの実行を終了させます。この場合、End ステートメントは必ずしも必要ではありませんが、プロシージャ内の任意の場所に指定できます。コードの実行を終了させたり、Open ステートメントで開いたファイルを閉ることができます。また、変数の値をクリアすることもできます。
〜〜〜〜〜引用終わり
 
Endステートメントはあまり使うことがないです。
ましてや、プログラムの途中で出てくればそれ以後の行は実行されるわけないですよね???
 
それから、、、、
 
For i = 2 To 35
〜〜〜
For k = 2 To 35
〜〜〜
 
変数がもったいないです。(表現がおかしいかな^^;)
2回目のループも変数iが空いてるから、
また再利用したらいいです。
 
あと、「35」。
余裕を見て35にして途中で抜ければいいやってことなんでしょうけど、
それやるなら、Do〜Loopでも使った方が解りやすい。
できれば、はっきり、
「1日から月末まで」とはっきり書いた方が、後で見て、
「あぁ、これは月の日付分のループだな。」と解る。
半年後、1年後に見ても意味が解るように書きましょう。
行番号に利用したいという事なんでしょうけど、
それは基準のセルの位置からの相対位置で指定すればよいでしょう。
 
例)
Range("C5").Cells(3,5).select
 
Range("D3").Range("E4").select
 
 
 
 
 

投稿日時: 18/01/17 08:54:26
投稿者: Dellcasio

mattuwan44 さんの引用:
のコードの下に以下のようなコードを書き足すと 
以下のコードは実行されません 
 
ただし、下記のコードを単独で書くと問題なく 
実行出来ます。 

何をもって実行された、あるいは実行されてないと判断されてますか?
 
コードは間違って実行されたりされなかったりはしません。
書いてある通りに実行されます。
書いてある通りに実行されますが、書いた人の思い通りに動くかは保証されません。
書く人の思いを確実に反映した文章を書かなければ、間違った結果が出ます。
 
こういう時はスッテップインというのを使って1行づつ実行してみるのが一番です。
http://www.239-programing.com/excel-vba/basic/basic023.html
プロシージャ内にカーソルを置き、
F8キー連打で実行します。
 
プログラムが長くなれば、
ブレークポイントを置いて見たり、
ウォッチ式をセットしてみたりして、
どこが思い通りに書けてないか間違いを見つけます。(この一連の作業をデバッグと呼びます)
 
http://www.ken3.org/vba/excel-help.html

 
 
 
mattuwan44さん
いつも御親切なご指導ありがとうございます。
これからデバックの勉強に力を入れて参ります。
もっともっと勉強致します。
今後ともご指導宜しくお願い致します。
有難う御座いました。