Как отредактировать мой код пользовательской формы, чтобы изменения могли обновляться - PullRequest
0 голосов
/ 23 января 2020

Я работаю над пользовательской формой Excel и у меня работает весь код, кроме одного. Я приложу код ниже, но я надеюсь, что это легко исправить. Как вы можете видеть из моего кода, когда пользователь вводит время отправления и время прибытия, данные поступают в мою базу данных, и выполняются вычисления, которые затем отправляются обратно в мои пользовательские флажки. Хотя это работает по мере необходимости, я обнаружил, что если пользователь вносит изменения один раз перед тем, как покинуть пользовательскую форму, информация обновляется в моей базе данных соответствующим образом, но флажки пользовательской формы не обновляются. Может кто-нибудь сказать мне, что мне нужно сделать, если есть что-нибудь, чтобы они работали в режиме реального времени и менялись с моим документом базы данных?

Private Sub txtDepartTime_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'When time is entered, time transfers immediately to spreadsheet time calculations datafield.

Dim TargetRow As Long
TargetRow = Sheets("Codes").Range("D43").Value + 1

If Not txtDepartTime Like "##:## [ap]m" Then
  MsgBox "Time entered is not valid.  Please enter time as hh:mm am/pm.", vbExclamation
  Cancel = True
  Exit Sub
End If

With Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 25)
 .Value = TimeValue(txtDepartTime)
 .NumberFormat = "hh:mm" 'departure time for checkbox calculation

 End With

End Sub

Private Sub txtArrivalTime_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'When time is entered, time transfers immediately to spreadsheet datafield and sends back to userform which meals are allowed.

Dim TargetRow As Long
TargetRow = Sheets("Codes").Range("D43").Value + 1

If Not txtArrivalTime Like "##:## [ap]m" Then
  MsgBox "Time entered is not valid.  Please enter time as hh:mm am/pm.", vbExclamation
  Cancel = True
  Exit Sub
End If

With Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 26)
 .Value = TimeValue(txtArrivalTime)
 .NumberFormat = "hh:mm" 'arrival time for checkbox calculation
End With

'''MEALS ALLOWED PER SPREADSHEET TO USERFORM'''
With Me.chkMorning
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 28).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With

With Me.chkMidday
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 30).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With

With Me.chkEvening
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 32).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With
'''END MOVEMENT OF MEALS ALLOWED TO USERFORM'''

End Sub

1 Ответ

0 голосов
/ 23 января 2020

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

Dim Check As Boolean

Check = (Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 28).Value = "T")
With chkMorning
    .Enabled = vbTrue
    .Value = Abs(Check)
    .Enabled = .Value
End With

Теперь, с помощью какого метода конкретная ячейка в указанном рабочем листе получает значение «T», или нет, я не могу сказать. Я уже предложил изучить последовательность. Учитывая, что изменение, внесенное во время, повлияет на проверяемую ячейку для флажка, это изменение может вступить в силу только в том случае, если Excel пересчитает лист, пока VBA выполняет вашу пользовательскую форму. Это я не знаю. Поэтому я не буду опираться на это.

Базовая c схема - это - или должна быть - считывать данные в форму, когда она открыта (инициализирована), добавлять, изменять или манипулировать этими данными в форме в то время как пользователь смотрит на него и возвращает обратно на лист дополнительные, измененные или измененные данные, когда пользователь готов (с помощью формы). Ваша концепция не следует этой схеме. Поэтому это создает проблемы, с которыми вам не нужно сталкиваться.

...