Excel (VBA)

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

 
(Windows 10 Home : Excel 2013)
「開始日時が終了日時より遅くなっています」15秒おきに書き込み更新させたいのですが…。
投稿日時: 17/09/12 18:06:11
投稿者: TANAKA17250
投稿者のウェブサイトに移動

自動売買ツールを自作してみようとWebサイト(http://atmtech.ibi-square.jp/)を参考に作っている最中です。初っ端からつまづきました。詳しい方いましたら助けて頂けると嬉しいです。
 
Dim mcolTask As Collection
 
Sub Tasc_Bigin()
' セッティング-------------------------------------------------------
    dayBigin = "07/01/01" ' 開始日付
    datBigin = TimeValue("00:00:00") ' 開始時刻
    dayend = "07/01/01" ' 終了日付
    Datend = TimeValue("00:00:00") ' 終了時刻
    datInterval = TimeValue("00:00:15") ' 実行間隔(少なくとも数秒以上で)
    datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
    blnJustTime = True ' datInterval で丸めるか
    strProcName = "Ashi" ' 実行するマクロ名
    int5 = TimeValue("00:00:05") ' 設定した終了時間からのマイナス時間
'---------------------------------------------------------------
 
If mcolTask Is Nothing Then
    ' 日付シリアル値を加算
    datBigin = datBigin + Val(Application.WorksheetFunction.Text(dayBigin, "yyyy/mm/dd"))
    Datend = Datend + Val(Application.WorksheetFunction.Text(dayend, "yyyy/mm/dd")) - int5
         
    If Datend < datBigin Then
        MsgBox "開始日時が終了日時より遅くなっています。"
        Exit Sub
    End If
     
    ' 現在時刻が既に終了時刻を過ぎている場合
    If Datend < Now() Then
        MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
        Exit Sub
    End If
     
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin <= Now() Then
        ' 開始時刻を datInterval で指定された値で丸めるか
        If blnJustTime Then
            datBigin = Application.Floor(Now() + datInterval, datInterval)
        Else
            datBigin = Now() + datInterval
        End If
    End If
 
    ' 初期化
    Set mcolTask = New Collection
 
    ' メイン部分
    For i = datBigin To Datend Step datInterval
        ' 後から取り消せるようにコレクションに退避
        mcolTask.Add CStr(i) & "," & strProcName
        ' Application.Ontime で実行予約を行う
        Application.OnTime EarliestTime:=i, _
                            Procedure:=strProcName, _
                            LatestTime:=i + datTimeout, _
                            Schedule:=True
    Next i
 
 
Else
    MsgBox "既に実行中です", vbInformation
End If
 
         
Exit Sub
     
error:
  MsgBox "エラーが発生しました。設定された日時をご確認ください。"
         
 
End Sub

回答
投稿日時: 17/09/12 19:09:11
投稿者: Suzu

「何」に つまずいているのかは、明らかにしましょう。
 
 
第三者の書いたコードをとやかく言うのもどうかと思うのですが。。
 
・変数はきちんと宣言しましょう。
・暗黙の型変換は止めた方が良いです。
・"07/01/01" は、2007年1月1日? 2001年7月1日? 年は 4桁にした方が無難です。
・ If Datend < datBigin Then は セッッティングの初期値 のままだと必ず True になるので、
   MsgBoxが表示され、Exit Sub となります。
 
上記の意味判りますか?
分からないのであれば、コードを丸写しして使用する事になりますよね。
 
このプロシージャは、時間の判断をして、【Ashi】を呼び出すコードの様ですが、
最終的には、売買の判断材料にするのですよね?
お金 の絡む話ですから、理解せずに使用するのはどうかと思いますよ。

投稿日時: 17/09/12 21:50:07
投稿者: TANAKA17250
投稿者のウェブサイトに移動

Suzuさん返答ありがとうございます。
初心者のため分からないことだらけです。
 
ご指摘のあった部分を修正してみましたが、どうでしょうか?
・変数はきちんと宣言しましょう。 ⇒宣言しました。
・暗黙の型変換は止めた方が良いです。 ⇒修正出来ている?
・"07/01/01" は、2007年1月1日? 2001年7月1日? 年は 4桁にした方が無難です。⇒4ケタにしました。
・ If Datend < datBigin Then は セッッティングの初期値 のままだと必ず True になるので、
   MsgBoxが表示され、Exit Sub となります。 ⇒ヒントも頂いて考えて、何となく分かるのですが整理ができず頭がパンクしそうです。
 
まだ考え続けていますが助言頂けると助かります!
 
===================
Sub Tasc_Bigin()
' セッティング-------------------------------------------------------
    Dim dayBigin As Date
    Dim datBigin As Date
    Dim dayend As Date
    Dim Datend As Date
    Dim datInterval As Date
    Dim datTimeout As Date
    Dim blnJustTime As Variant
    Dim strProcName As Variant
    Dim int5 As Date
         
    dayBigin = "2007/01/01" ' 開始日付
    datBigin = TimeValue("00:00:00") ' 開始時刻
    dayend = "2007/01/01" ' 終了日付
    Datend = TimeValue("00:00:00") ' 終了時刻
    datInterval = TimeValue("00:00:15") ' 実行間隔(少なくとも数秒以上で)
    datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
    blnJustTime = True ' datInterval で丸めるか
    strProcName = "Ashi" ' 実行するマクロ名
    int5 = TimeValue("00:00:05") ' 設定した終了時間からのマイナス時間
'---------------------------------------------------------------
 
If mcolTask Is Nothing Then
    ' 日付シリアル値を加算
    datBigin = datBigin + Val(Application.WorksheetFunction.Text(dayBigin, "yyyy/mm/dd"))
    Datend = Datend + Val(Application.WorksheetFunction.Text(dayend, "yyyy/mm/dd")) - int5
         
    If Datend < datBigin Then
        MsgBox "開始日時が終了日時より遅くなっています。"
        Exit Sub
    End If
     
    ' 現在時刻が既に終了時刻を過ぎている場合
    If Datend < Now() Then
        MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
        Exit Sub
    End If

回答
投稿日時: 17/09/13 10:14:20
投稿者: Suzu

引用:
「何」に つまずいているのかは、明らかにしましょう。

 
こちらについては、どうなのでしょう。
Exit Sub してしまって先に進まない事が問題なのでしょうか?
 
TANAKA17250 さんの引用:
初心者のため分からないことだらけです。

先にも言いましたが、お金の絡む話ですから 動作を理解しないで使う事は 止めましょう。
 
躓いていらっしゃる部分が、 Exit Sub の部分なのであるなら、単なる条件分岐の結果ですから
その条件分岐の判断基準となる Datend datBigin の値を変えれば良いでしょう。
 
ただし、それらの変数には意味があるのでしょうけど、コードの中では把握できません。
また、リンク先のそのページには記されて無いようです。
(別のページに書かれているのかもしれませんが、当方そこまで確認する気はありません。)
 
 
引用:
・変数はきちんと宣言しましょう。 ⇒宣言しました。

 i が抜けています。
 
引用:
・暗黙の型変換は止めた方が良いです。 ⇒修正出来ている?

dayBigin = #2007/01/01#
dayend = #2007/01/01#
 
 
引用:
・"07/01/01" は、2007年1月1日? 2001年7月1日? 年は 4桁にした方が無難です。⇒4ケタにしました。

OKです。
 
引用:
・ If Datend < datBigin Then は セッッティングの初期値 のままだと必ず True になるので、
   MsgBoxが表示され、Exit Sub となります。 ⇒ヒントも頂いて考えて、何となく分かるのですが整理ができず頭がパンクしそうです。

 
   コードが先に進むためには
 
   1 Datend < datBigin であってはならない。
   2 Datend < Now() であってはならない。
 
   2 Datend が、現在よりも未来。
   1 Datend と datBigin では、Datend の方が大きくなければならない。
 
    1に関して、
     ' 日付シリアル値を加算 
       datBigin = datBigin + Val(Application.WorksheetFunction.Text(dayBigin, "yyyy/mm/dd")) 
       Datend = Datend + Val(Application.WorksheetFunction.Text(dayend, "yyyy/mm/dd")) - int5 

では、適正な計算がなされません。
 
     ' 日付シリアル値を加算
      datBigin = datBigin + dayBigin
      Datend = Datend + dayend - int5
とします。
 
コードを先に進めるのであれば、
 
' セッティング-------------------------------------------------------
の初期値を変える必要があります。
ヒントは既に出していますし、金銭案件には関わりたくありませんので回答はここまでとさせて頂きます。

回答
投稿日時: 17/09/13 10:28:04
投稿者: 半平太

多分、運用日時は動的に変化させるのだと思うんですが、
それなのに何故、こんな固定値で作るんですか? しかも2007年? 古すぎませんか?
         ↓
>dayBigin = "2007/01/01" ' 開始日付
 
開始日と終了日が同じで、開始時刻と終了日が同じだったら
これはいつもTrueになりますよ。だって、終了日は「int5」をマイナスしているんですから。
 ↓
>If Datend < datBigin Then
 
まともな、開始時刻と終了時刻を設定してください。
 
また、2007年を想定していたら、現在2017年ですから、
これはいつもTrueになっちゃいますよね?
   ↓
>' 現在時刻が既に終了時刻を過ぎている場合
>If Datend < Now() Then
 
もう一度書きます。「まともな条件を設定して」から、旨く行くとか、行かないとか悩んでください。

回答
投稿日時: 17/09/13 16:08:53
投稿者: WinArrow
投稿者のウェブサイトに移動

↓のコードは、何を取得する目的ですか?
  
 >Val(Application.WorksheetFunction.Text(dayBigin, "yyyy/mm/dd"))
 
「シリアル値を加算」ってコメント記述しているが、
貴方が意図したシリアル値になっているか検証しましたか?
 
今のレベルで「お金」が絡むプログラムを作成することは、大やけどするから・・・
よく考えた方がよい。

投稿日時: 17/09/15 19:49:40
投稿者: TANAKA17250
投稿者のウェブサイトに移動

Suzuさん、半平太さん、WinArrowさん回答ありがとうございます。
アドバイスを頼りに調べながら試行する事で上手く動くようになりました。
今のところはですが…。
 
質問に対して「何が分からないのか明確に」というのは至極真っ当な意見だと思うのですが、分からないところが分からない状況なのです。
 
まさに手探りで、手に負えないほどの初心者です。
手探りの状況ですが、少しづつ進むのが楽しいと感じています。
 
お金に関するものなので忠告して下さるのは非常にありがたいことだと思っております。
ですが、損失の話であれば既に相当額の損失が出ているのでご安心ください。
 
今のプログラムもこれらの損失も趣味の範囲でやっている事です。余剰資金というやつですね。
貯金は余剰資金ではないので使用しません。
 
懲りずに質問すると思いますが、その時はまたよろしくお願い致します。