2

ユーザーが2つの別々のコンボボックスcboStartDate、cboStartTimeを介して特定の日付と時刻を入力する必要があるユーザーフォームがあります。また、テキスト フィールド txtDuration に期間を入力する必要があります。

保存すると、開始日時がフォーマットされたセル [DD/MM/YYYY HH:MM AM/PM] に保存されます。終了日時は期間フィールドから計算され、同じフォーマットで別のセルに保存されます。このようなもの:

+-------------------------------------+-----------------------+
| | 開始時間 | 終了時間 |
+-------------------------------------+-----------------------+
| | 2012 年 2 月 4 日午前 11:30:00 | 2012 年 2 月 4 日 14:00:00 |
+-------------------------------------+-----------------------+

ただし、ユーザーフォームを実行した後、開始時刻は保存されず、終了時刻は計算されません。このようなもの:

+-------------------------------------+-----------------------+
| | 開始時間 | 終了時間 |
+-------------------------------------+-----------------------+
| | 2012 年 2 月 4 日 12:00:00 午前 | 2012 年 2 月 4 日 12:00:00 午前 |
+-------------------------------------+-----------------------+

以下は私のVBAコードの一部です:

Dim iRow As Long
Dim ws As Worksheet
Dim startDate As Date
Dim unFmtStartDuration() As String
Dim startDuration As Double
Dim minTest As Integer
Dim endDate As Date
Dim endDuration As Double

Set ws = Worksheets("EVENTS")

'Search for the last row in the worksheet
iRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

'Date manipulation and set start and end timings
unFmtStartDuration() = Split(cboStartTime.Text, ":")
startDuration = unFmtStartDuration(0)
If unFmtStartDuration(1) = "00" Then
    minTest = 0
Else
    minTest = unFmtStartDuration(1)
    If minTest = 30 Then
        startDuration = startDuration + 0.5
    End If
End If
startDate = DateValue(DateAdd("h", startDuration, cboDate.Text & " 12:00AM"))
ws.Cells(iRow, 4).Value = startDate
endDuration = txtDuration.Value
endDate = DateValue(DateAdd("h", endDuration, startDate))
ws.Cells(iRow, 5).Value = endDate

では、この部分を整理するにはどうすればよいでしょうか。ここで何か助けていただければ幸いです。ありがとう。

PSここにスクリーンショットを投稿したいのですが、ここでの私の評判は低すぎます. ごめん。

4

1 に答える 1

2

時間だけを追加しているように見えますがminTest = 30、この値はおそらくかなり異なります。また、あるインスタンスでは、参照時に文字列と別の数値を比較していますunFmtStartDuration。これは機能する可能性がありますが、コードを読むときに混乱します。

現在の方法に従うには、次を使用します

startDuration = Val(unFmtStartDuration(0) + Round(Val(unFmtStartDuration(1)) / 60, 2)

これを交換する

startDuration = unFmtStartDuration(0)
If unFmtStartDuration(1) = "00" Then
    minTest = 0
Else
    minTest = unFmtStartDuration(1)
    If minTest = 30 Then
        startDuration = startDuration + 0.5
    End If
End If

これは、一致に依存するのではなく、時間がかかり、使用している10進数形式に変換します30。(具体的に必要な場合を除きます。もしそうなら、丸めのトリックでまだアレンジできると思うので、そう言ってください。)

ただし、より良いオプションは使用することだと思います

startDuration = TimeValue(cboStartTime.Text) * 24

したがって、他の数学やチェックは関係ありません。

また、cboStartTime.Text(およびその後startDuration) が 24 時間を超えない限り、これは

startDate = DateValue(DateAdd("h", startDuration, cboDate.Text & " 12:00AM"))

は常にcboDate.Text、暗黙の12:00:00 AMで指定された日付を返します。これを修正するには、次のように変更します。

startDate = DateAdd("h", startDuration, cboDate.Text & " 12:00AM")

他にも修正すべき点があると思いますが、うまくいけば、これで正しい方向に進むことができます...

于 2012-03-29T14:53:19.850 に答える