[[20190613104553]] 『ユーザーフォーム上の土日祝のみのについて』(Qu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォーム上の土日祝のみのについて』(Qu)

お世話になります。

ユーザーフォーム上で期間を入れると、
土日祝の日数が計算されるようにしたいのですが、
表示ができません。(エラーも返ってきません)

コード内のどこかが間違っているかお教えいただけないでしょうか。

シート名_祝日には、
A列−日付
B列−曜日
C列−祝日名       になっております。

そのコードの前も影響しているかもしれないので、
合わせて、コードを記載させていただきます。

よろしくお願いいたします。


Private Sub TB1_Change() '開始日

 Call setDateDiff
End Sub

Private Sub TB3_Change() '終了日

 Call setDateDiff
End Sub

Private Sub setDateDiff() '期間

 TB5.Value = ""
 If IsDate(TB1.Text) Then
 If IsDate(TB3.Text) Then
 TB5.Value = DateDiff("D", DateValue(TB1.Text), DateValue(TB3.Text)) + 1
End If
End If
End Sub

Private Sub TB2_Change() '開始時間

 Call setDateDiff2
End Sub

Private Sub TB4_Change() '終了時間

 Call setDateDiff2
End Sub

Private Sub setDateDiff2()' ‘時間

 TB6.Value = ""
 If IsDate(TB2.Text) Then
 If IsDate(TB4.Text) Then
 TB6.Value = DateDiff("n", TimeValue(TB2.Text), TimeValue(TB4.Text)) / 60
End If
End If

End Sub

Private Sub LB2_change() '条件

If LB2.Value = "A" Then

   TB7.Value = "0"
ElseIf LB2.Value = "B" And TB6.Value > 4 Then
   TB7.Value = “100"
ElseIf LB2.Value = "B" And TB6.Value <= 4 Then
   TB7.Value = "50"
ElseIf LB2.Value = "C" And TB6.Value > 4 Then
   TB7.Value = "300"
ElseIf LB2.Value = "C" And TB6.Value <= 4 Then
   TB7.Value = "150"
End If

End Sub

Private Sub TB7_change() ’計算1

 TB8.Value = TB7.Value * TB5.Value

End Sub

Private Sub TB5_afterupdate() '土日祝日表示

Dim 開始日 As Date
Dim 終了日 As Date
Dim 稼働曜日 As String
Dim 最終行 As Long
Dim 祝日 As Range

開始日 = TB1.Text
終了日 = TB3.Text
稼働曜日 = "0000011"

最終行 = Sheets("祝日").Cells(Rows.Count, 1).End(xlUp).Row
Set 祝日 = Range(Cells(2, 1), Cells(最終行, 1))

TB9.Value = TB5.Value - NetworkDays_Intl(開始日, 終了日, 稼働曜日, 祝日)

End Sub

Private Sub TB9_change() ’計算2

TB10.Value = TB9.Value * 900

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 おはようございます ^^
詳しくは見ていないし、オブジェクト名も変えておられるみたいで
フォームの再現も難しく気が付いた点だけで恐縮ですが。。。。。
この掲示板でのミスタイプでなければ
Private Sub TB5_afterupdate() '土日祝日表示 
が起動(呼ばれると)すればエラーが出ると思いますが
呼ばれていないのでは(イベントが発生していない??)
?。。。ないでしょうか
Debug.Print か Msgboxでも先頭に
ほりこんで確認するのも良いかもしれませんね。
外していましたら済みません
(隠居じーさん) 2019/06/14(金) 07:23

隠居じーさん 様

ご連絡ありがとうございます。
遅くなり申し訳ございません。

お教え頂いた、Debug.Print、Msgboxをしても何も返ってきませんでした。

オブジェクトを直したものを貼らせて頂きます。
よろしくお願いいたします。

Private Sub UserForm_Initialize()

    With ListBox1
        .AddItem "A"
        .AddItem "B"
        .AddItem "C"
    End With
End Sub
Private Sub TextBox1_Change() '開始日
 Call setDateDiff
End Sub
Private Sub TextBox3_Change() '終了日
 Call setDateDiff
End Sub
Private Sub setDateDiff() '期間
 TextBox5.Value = ""
 If IsDate(TextBox1.Text) Then
 If IsDate(TextBox3.Text) Then
 TextBox5.Value = DateDiff("D", DateValue(TextBox1.Text), DateValue(TextBox3.Text)) + 1
End If
End If
End Sub
Private Sub TextBox2_Change() '開始時間
 Call setDateDiff2
End Sub
Private Sub TextBox4_Change() '終了時間
 Call setDateDiff2
End Sub
Private Sub setDateDiff2() '時間
 TextBox6.Value = ""
 If IsDate(TextBox2.Text) Then
 If IsDate(TextBox4.Text) Then
 TextBox6.Value = DateDiff("n", TimeValue(TextBox2.Text), TimeValue(TextBox4.Text)) / 60
End If
End If
End Sub
Private Sub ListBox1_change()

If ListBox1.Value = "A" Then

   TextBox7.Value = "0"
ElseIf ListBox1.Value = "B" And TextBox6.Value > 4 Then
   TextBox7.Value = "100"
ElseIf ListBox1.Value = "B" And TextBox6.Value <= 4 Then
   TextBox7.Value = "50"
ElseIf ListBox1.Value = "C" And TextBox6.Value > 4 Then
   TextBox7.Value = "300"
ElseIf ListBox1.Value = "C" And TextBox6.Value <= 4 Then
   TextBox7.Value = "150"
End If
End Sub
Private Sub TextBox7_change() '計算1
 TextBox8.Value = TextBox7.Value * TextBox5.Value
End Sub

Private Sub Textbox5_Afterupdate()
Dim 開始日 As Date
Dim 終了日 As Date
Dim 稼動曜日 As String
Dim 最終行 As Long
Dim 祝日 As Range

開始日 = DateValue(TextBox1.Text)
終了日 = DateValue(TextBox3.Text)
稼動曜日 = "0000011"
最終行 = Worksheets("祝日").Cells(Rows.Count, 1).End(xlUp).Row
Set 祝日 = Range(Cells(1, 1), Cells(最終行, 1))
TextBox10.Value = TextBox5.Value - NetworkDays_Intl(開始日, 終了日, 稼動曜日, 祝日)

End Sub

Private Sub textbox9_change() '計算2
TextBox10.Value = TextBox9.Value * 900
End Sub

(Qu) 2019/06/16(日) 10:01


 こんにちは!

 大体のイベントが change() なのに対して

 TextBox5 だけが Afterupdate() なのは何か意味があるのですか?

 もしも、イベントの連鎖でその動きを期待されているのでしたら、

 TextBox5.Value = ""

 時にも引っ掛かるでしょうし、意図しない動き?可読性が落ちますから

 サブルーチンという書き方に変えられた方がいいと思います。

 IF文などで判断されて、○○なら、、サブルーチン、、とかです。

 既に、、Private Sub setDateDiff2() '時間 でサブルーチンは使われていますので詳しくは書きません。

 それよりも、、ブレイクポイントを設定して一つ一つステップ実行していくことが基本です。

 どんなベテラン?コードを書くことに慣れたひとでもなかなか一度に書くことは難しくて思わぬ落とし穴があるものです。

 私なんかはしょっちゅう落ちてます。(^^;

 逆にこのステップ実行とローカルウィンドウ、イミデイトウィンドウをマスターすれば大体のコードは時間を掛ければ書けるものです。(←ちょっと言い過ぎましたm(__)m)

 抽象的になりましたが既にこれだけのコードが書けるのですから、もう達人です。

 頑張ってください。では、、、では、、、
(SoulMan) 2019/06/16(日) 11:14

 こんにちは ^^ SoulManさん 何時もお世話になり、ありがとうございます。
Quさんすみません m(_ _)m
えらそぉ〜なことを書いてしまいましたが。私よりQuさんのほうがベテランかもしれません
すこぉ〜し気が付いた点だけでして恐縮です。わたしは自分が書いたコードでも嵌って2〜3日
抜け出せないこともしばしばです。自身の勉強のため拝見はさせて頂いておりますが。原因が
究明できるかどうかは疑問です。他の方の回答もおおいに参考にしていただき、頑張ってください。
また気が付いた点があればアップしますね。でわでわ ← 私では見つけ出せないかも ( ̄▽ ̄)
m(_ _)m
(隠居じーさん) 2019/06/16(日) 12:03

 隠居じーさん さん おはようございます😃
 こちらこそ、いつもお世話になっております
 意図した動き?は、ご本人さんしかわかりませんものね(^^;;
 また、よろしくお願いします🤲
(SoulMan) 2019/06/16(日) 12:16

 >>意図した動き?は、ご本人さんしかわかりませんものね(^^;;
ははぁ〜〜〜 m(_ _)m 仰せのとおりかと。。。(^^;;;
こちらこそ。。。宜しくお願い致します。
(*^^*)
(隠居じーさん) 2019/06/16(日) 13:31

SoulMan 様
隠居じーさん 様

ご連絡ありがとうございます。

わたくしがベテラン・・・とんでもございません!!!
この部分については強く訂正をさせてください。
こちらのサイトにお世話になり、
本当にやっとの思いでvbaを作っています。(必死です)

 >TextBox5 だけが Afterupdate() で行っているのは、
特に意味はありません。
chenge()の際もエラーが返ってこず、
実行しても反映されませんでした。

自分の間違いに気が付かず、かつ、エラーが返ってこないので、
負のスパイラルから抜け出せずにいますが、
一つずつステップ実行をして、
それでもできないようであれば、
if文を使用することにいたします。

また、再度コメントにお助けのお願いをさせていただくかもしれません。
その時は何卒宜しくお願い申し上げます。
(Qu) 2019/06/17(月) 21:06


 TextBox10.Value = TextBox5.Value - NetworkDays_Intl(開始日, 終了日, 稼動曜日, 祝日) 

 WorksheetFunction.NetworkDays_Intl("2019/5/1", "2019/5/10")
私がエラーになると思う箇所だけ(2番目は私のテスト環境内での例です)
WorksheetFunction  か Application かを付けないとエラーになると思います
なので
何らかの理由でPrivate Sub Textbox5_Afterupdate() が実行されていない可能性が
有ると判断してアップさせていただきました。(外していましたらお許しを)
原因、早く見つかるといいですね。あまりお役に立てず、すみませんでした。
私はよくサブルーチンを作ると全てのプロシジャーの先頭にまずMsgbox "プロシジャー名" を
書いて実行して各プロシジャがー呼び出されているか流れを見ます。もちろんイミデエイト、ローカル
ウインドウでも見れますが(昔の癖です)何かの足しにでも、なれば幸甚です、でわでわ m(_ _)m
(隠居じーさん) 2019/06/17(月) 23:06

隠居じーさん 様

ありがとうございます。

お教えいただきました通り、WorksheetFunctionをつけるとできました!
やっと、ようやく負のスパイラルから抜け出せました。
感謝です。

ご助言を参考にさせていただき、
さらに手直しをして、

Private Sub textbox5_change() '土日祝のみ

 Dim 平日 As String
 Dim Lrow As Long
 Dim 祝日 As Range
 Dim i As Integer

 平日 = "0000011"

 Lrow = Sheets("祝日").Cells(Rows.Count, 1).End(xlUp).Row
 Set 祝日 = Range(Cells(2, 1), Cells(Lrow, 1))
  i = WorksheetFunction.NetworkDays_Intl(TextBox1.Text, TextBox3.Text, 平日, 祝日)
  TextBox9.Value = Val(TextBox5.Value) - i

 End Sub

上記で動作しました。

本当にありがとうございました。

厚かましいことにもう1つお伺いしてもよろしいでしょうか。
(本当に申し訳ございません。)

上記のコードで問題なく動くのですが、
テキストボックス内の日付を修正する、あるいは変更すると、
「worksheetfunctionクラスのnetworkDays_intlプロパティを取得できません。」
というエラーが発生します。

このエラーを回避、出ないようにすることはできるのでしょうか。
もしよろしければ、ご教授願いたく存じます。

よろしくお願いいたします。
(Qu) 2019/06/18(火) 21:17


 こんばんは!

 頑張っていますね。

 もう少し条件がいるかもしれませんが、、取り敢えず↓こんな感じで

 If IsDate(TextBox1.Text) * IsDate(TextBox3.Text) Then
    i = WorksheetFunction.NetworkDays_Intl(TextBox1.Text, TextBox3.Text, 平日, 祝日)
    TextBox9.Value = Val(TextBox5.Value) - i
 End If

 IF でくくってみてはどうでしょうか???

 ですけど、、、Step実行してますぅ???
(SoulMan) 2019/06/18(火) 21:27

 おお! な〜るほどです。
buf = WorksheetFunction.NetworkDays_Intl("20195/1", "2019/5/10")
てな感じだと 同じエラーが出ますね。
でも解決されたみたいで良かったですね。
iはこのままでも。。。?多分大丈夫だとは思いますが^^;
一応戻り値は#みたいっす ← 心配しすぎかも ( ̄▽ ̄)

 でわでわ Quさん SoulManさん
おやすみなさい。。。 m(_ _)m 
(隠居じーさん) 2019/06/18(火) 22:26

 的を得ているかわかりませんが(^^;;
とりあえず、おやすみなさい💤です
(SoulMan) 2019/06/18(火) 22:55

隠居じーさん 様
SoulMan 様

ご連絡が遅くなり、申し訳ございません。

お教えいただきました、if文で無事にできました。

ステップ実行はしているのですが・・・・
通常のステップ実行は順に一行ごと動きますよね・・・?
このコードの場合、行が飛ばされたり、一部しかステップ実行できなくなります。
(ステップ実行の基本的認識が間違っていれば申し訳ございません。)
(Qu) 2019/06/20(木) 21:20


 一行づづF8で行うのが基本ですけど、そうすると時間が掛かるので

 私はいつも止めたいところにブレイクポイントを設定してそこまでは、コードを走らせます。

 ここというところはF8でじっくりと、、黄色くDebugしたところはカーソルを当てて中身を確認します。

 どんなコードでも完成されたコードはないわけで常に変更→修正→Debugの繰り返しなんですね。

 なのでコードをDebugすることこそがコードが書けるか否かなのですね。。。多分???自論です。(^^;

 でも、解決されてよかったですね。早くこちらに来て悩める子羊たちにここで得た知識を還元してあげて下さい。

 では、、では、、、また、、、
(SoulMan) 2019/06/20(木) 21:32

 それからもう一つ思うことは、、Excelからのエラーメッセージを読み解くことですね。

 偉そうぶって申し訳ありませんが、、、ついでに自論を、、、ちょろっと

 >「worksheetfunctionクラスのnetworkDays_intlプロパティを取得できません。」

 Excel的にはこれで精一杯伝えているわけですよ。。 を取得できません と、、、Null、、無効か?空白か??Emptyか?

 上手く行く時もある。。駄目な時もある。。。何が駄目なのか???と推測していくと、、、判断する、、分岐する。。

 を、、上から順に書いていくと自然とコードが完成に近づいていく気がするのですね。。。

 こんなことを繰り返しているうちに使う側に伝えるMsgboxを書くときに ○○だから、、▲▲してください。。。

 というようなメッセージを書く必要が出てくるのですね。そうするとコードを書く人の立場になってエラーメッセージを読み解く様になると思うのです。。。

 わかったような???分からないような???(笑) まぁ、、、聞き流してください。。。失礼しました。では、、、
(SoulMan) 2019/06/20(木) 22:00

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.