質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

VBSで、指定のカラムの値が23:59:59のとき、別のカラムの値を0:00:00にしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 335

amatsuno

score 40

VBSで、指定のカラムの値が23:59:59のとき、別のカラムの値を0:00:00にしたい

VBSで指定のカラムの値に[23:59:59]が指定されていた場合に、別カラムの値を[0:00:00]にしたいと考えています

変更条件:

①OFF1の値が[23:59:59]の時、同じ[u_no]の翌日のON1の値を[0:00:00]にしたい
(2019/5/7,,8:32:00,23:59:59,15,8:06:56 → 2019/5/8,AAA,0:00:00,17:12:00,15,7:25:27 
⇒ u_no15の5/7のOFFが[23:59:59]なので、u_no15の5/8のONの値を[0:00:00])

元csv:csv_tmp1.csv

日付,表示名,ON1,OFF1,u_no,act_time
2019/5/14,AAA,8:29:00,8:30:00,15,0:01:00
2019/5/14,BBB,8:49:00,8:51:00,18,0:01:00
2019/5/14,CCC,8:38:00,11:26:00,19,2:14:36
2019/5/13,,8:28:00,17:04:00,15,7:33:15
2019/5/13,,8:49:00,17:58:00,18,7:54:07
2019/5/13,CCC,8:36:00,19:21:00,19,8:05:25
2019/5/12,,8:31:00,17:04:00,15,7:34:01
2019/5/12,,8:48:00,18:40:00,18,8:50:37
2019/5/12,,8:30:00,23:59:59,19,11:43:57
2019/5/9,,8:51:00,19:10:00,18,8:23:09
2019/5/9,,8:52:00,23:28:00,19,10:33:02
2019/5/8,AAA,8:25:00,17:12:00,15,7:25:27
2019/5/8,,8:48:00,18:46:00,18,7:50:56
2019/5/8,,8:48:00,22:49:00,19,11:43:39
2019/5/7,,8:32:00,23:59:59,15,8:06:56
2019/5/7,,9:01:00,18:13:00,18,6:33:28

変更後csv:csv_tmp2.csv

日付,表示名,ON1,OFF1,u_no,act_time
2019/5/14,AAA,8:29:00,8:30:00,15,0:01:00
2019/5/14,BBB,8:49:00,8:51:00,18,0:01:00
2019/5/14,CCC,0:00:00,11:26:00,19,2:14:36
2019/5/13,,8:28:00,17:04:00,15,7:33:15
2019/5/13,,8:49:00,17:58:00,18,7:54:07
2019/5/13,CCC,8:36:00,19:21:00,19,8:05:25
2019/5/12,,8:31:00,17:04:00,15,7:34:01
2019/5/12,,8:48:00,18:40:00,18,8:50:37
2019/5/12,,8:30:00,23:59:59,19,11:43:57
2019/5/9,,8:51:00,19:10:00,18,8:23:09
2019/5/9,,8:52:00,23:28:00,19,10:33:02
2019/5/8,AAA,0:00:00,17:12:00,15,7:25:27
2019/5/8,,8:48:00,18:46:00,18,7:50:56
2019/5/8,,8:48:00,22:49:00,19,11:43:39
2019/5/7,,8:32:00,23:59:59,15,8:06:56
2019/5/7,,9:01:00,18:13:00,18,6:33:28

コードは以下で確認しましたが、
どちらもうまくいきませんでした

コード1:

Dim dic, fw, sA, dt , sd,ckck5,ckck6
Const CPATH = "C:\csvtest\"
Const CINFILE = "csv_tmp1.csv", COUTFILE = "csv_tmp2.csv"
Const ForReading = 1, ForWriting = 2

Set dic = CreateObject("Scripting.Dictionary")

With CreateObject("Scripting.FileSystemObject")
Set fw = .OpenTextFile(CPATH & COUTFILE, ForWriting, True)
With .OpenTextFile(CPATH & CINFILE, ForReading)
If (Not .AtEndOfStream) Then fw.WriteLine .ReadLine
While (Not .AtEndOfStream)
sA = Split(.ReadLine, ",")
If (UBound(sA) = 5) Then

sd =sA(0)
ckck5 = replace(sd,"""","")
'msgbox ckck5
ckck6 = sA(3)
'msgbox ckck6
'dt = CDate(sA(0))
dt = CDate(ckck5)
If (dic.Exists(sA(4))) Then
If (dic(sA(4)) = dt) Then
sA(2) = "0:00:00"
dic.Remove sA(4)
ElseIf (sA(3) = "23:59:59") Then
dic(sA(4)) = dt + 1
End If
ElseIf (sA(3) = "23:59:59") Then
dic(sA(4)) = dt + 1
End If
fw.WriteLine Join(sA, ",")
End If
Wend
.Close
End With
fw.Close
End With
Set dic = Nothing

このコードでは、[0:00:00]へ変換されません

コード2:

Dim a, c, co, cr, d(), f, m, n, i, j, so, x, z(5),ckck2,ckck1
Set so = CreateObject("Scripting.FileSystemObject")
f = so.GetParentFolderName(WScript.ScriptFullName)
Set co = so.OpenTextFile(f & "\csv_tmp1.csv", 1)
Set cr = so.OpenTextFile(f & "\csv_tmp2.csv", 2, True)
x = co.ReadLine
cr.WriteLine x
c = - 1
Do Until co.AtEndOfStream
a = Split(co.ReadLine, ",")
c = c + 1
ReDim Preserve d(5, c)
For i = 0 to 5
d(i, c) = a(i)
Next
Loop
co.Close
Set co = Nothing
For i = 0 to c
ckck1=d(3, i)
msgbox ckck1

If d(3, i) = "23:59:59" Then
m = i
n = DateAdd("d", 1, d(0, i))
End If
For j = m + 1 to c

'msgbox m
ckck2=(d(0, j))
'msgbox ckck2
'msgbox n

'If n = DateValue(d(0, j)) and d(3, j) = "23:59:59" and d(4, j) = d(4, i) Then
If d(3, j) = "23:59:59" and d(4, j) = d(4, i) Then
'msgbox n

d(2, j) = "0:00:00"
Exit For
End If
Next
Next
For i = 0 to c
For j = 0 to 5
z(j) = d(j, i)
Next
cr.WriteLine Join(z, ",")
Next
cr.Close
Set cr = Nothing
Set so = Nothing
'MsgBox("Finished!")

このコードでは、同日のONが[0:00:00]になります

すいません。
修正内容のご教授をお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

日付の降順に並んでいるのなら逆にたどらなければいけないのでは?

    If d(3, i) = "23:59:59" Then
        For j = i - 1 to 0 Step -1
            If d(4, j) = d(4, i) Then
                d(2, j) = "0:00:00"
                Exit For
            End If
        Next
    End If

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/15 18:49

    すいません。
    直の上記は無視してください
    (こちらの記載ミスでした)

    キャンセル

  • 2019/05/15 20:15

    If ~ Next(最初の)までですね。
    内側のForは条件を満たしたときだけ回せば十分でしょうということで

    キャンセル

  • 2019/05/16 12:27

    ありがとうございます。
    こちらのコードを使用させていただきまして、
    狙い通りの動作が実現できました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る