Сумма значений меток в VBA - PullRequest
0 голосов
/ 10 июля 2019

введите описание изображения здесь В основном, когда выбран день, я буду вводить время каждого сотрудника, время начала и время их перерыва, а также вводить их выходные данные за день.

Когда выбран следующий день, я хочу сделать точный расчет для данного дня и составить таблицу в последних трех столбцах.

Option Explicit

Dim hour1 As Date
Dim hour2 As Date
Dim hour3 As Date
Dim Totalhour As Date
Dim StartNumber As Integer
Dim EndNumber As Integer
Dim Sum As Double
Dim i As Integer
Dim x As Integer
Dim Total As Double

Private Sub cmdHoursWorked_Click()

If OpMon.Value = True Then

hour1 = txtTimeIn1.Text
hour2 = txtTimeOut1.Text
hour3 = cmbBreak1.Text
Total = txtUnitCom1.Text
Totalhour = ((hour2 - hour1) - hour3)
lblHrsWorked1.Caption = Round((Totalhour * 24), 2)
lblMon1.Caption = Round(((lblHrsWorked1.Caption * 3600) / txtUnitCom1.Text), 1)
'lblUnitWeek1.Caption = txtUnitCom1.Text'
'lblTHW1.Caption = lblHrsWorked1'

ElseIf OpWed.Value = True Then

hour1 = txtTimeIn1.Text
hour2 = txtTimeOut1.Text
hour3 = cmbBreak1.Text
Totalhour = ((hour2 - hour1) - hour3)
lblHrsWorked1.Caption = Round((Totalhour * 24), 2)
lblWed1.Caption = Round(((lblHrsWorked1.Caption * 3600) / txtUnitCom1.Text), 1)
'lblUnitWeek1.Caption = txtUnitCom1.Text'
'lblHrsWorked1.Caption = lblTHW1.Caption'
lblSecUnit1.Content = (lblMon1.Caption + lblTue1.Caption + lblWed1.Caption + lblThu1.Caption + lblFri1.Caption)

End If

End Sub

Скажите, если я выберу понедельник, я введу 9:00 и 17:30 как время начала и окончания с 30-минутным перерывом.И я ввожу 500 в текстовое поле заполненных единиц.Затем я вычисляю отработанные часы (метка), а также вычисляю единицы измерения в секунду на метке метки понедельника.

Теперь, если выбран другой день, я хочу сделать точно такие же вычисления, а также добавить к последним трем столбцамна основе ввода от пользователя

ElseIf OpTue.Value = True Then
    start_time = CDate(txtTimeIn1.Text)
    end_time = CDate(txtTimeOut1.Text)
    break_time = CInt(cmbBreak1.Text)
    units = CSng(txtUnitCom1.Text)
    ttl_secUnit1 = CSng(lblSecUnit1.Caption)
    sec_Mon1 = CSng(lblMon1.Caption)
    'sec_Tue1 = CSng(lblTue1.Caption)

   ' Calculation
    hours_worked = (CSng(end_time) - CSng(start_time)) * 24! - break_time / 60!
    rate = units / (3600! * hours_worked)
    ttl_secUnit1 = (CSng(sec_Mon1) + CSng(sec_Tue1))
    lblSecUnit1.Caption = WorksheetFunction.Sum(lblMon1.Caption, lblTue1.Caption)


    ' Results
    lblHrsWorked1.Caption = Round((hours_worked), 2)
    lblTue1.Caption = Format(rate, "0.000")
    'lblSecUnit1.Caption = Format(ttl_secUnit1, "0.000")

End If

1 Ответ

0 голосов
/ 10 июля 2019

Вы делаете математику со строками и надеетесь, что интерпретатор VBA сделает то, что вы хотели. Не делай этого. Вместо этого обрабатывайте данные в три этапа:

  1. Возьмите входные данные из меток и преобразуйте их в значения типа Integer, Single или Date, используя CInt(), CSng() или CDate().
  2. Посчитайте со значениями.
  3. Преобразование значений в строки с использованием функции Format() для отображения.

В простом примере ниже

output

Public Sub CalculateRate()

    ' Input values
    Dim start_time As Date, end_time As Date
    Dim break_time As Integer, units As Single

    start_time = CDate(Label1.Caption)
    end_time = CDate(Label2.Caption)
    break_time = CInt(Label3.Caption)
    units = CSng(Label4.Caption)

    ' Calculation
    Dim hours_worked As Single, rate As Single
    hours_worked = (CSng(end_time) - CSng(start_time)) * 24! - break_time / 60!
    rate = units / (3600! * hours_worked)

    ' Results
    Label5.Caption = Format(rate, "0.000")

End Sub

Обратите внимание, что компилятор интерпретирует следующие литералы

  • 1000 как Integer (16 бит)
  • 100000 как Long (32-бит)
  • 1000! как Single число с плавающей запятой (32-разрядное)
  • 1000# как Double число с плавающей запятой (64-разрядное)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...