У нас есть база данных таблиц Excel с предварительной регистрацией для программы непрерывного образования пенсионеров. В базе данных имеется 37 столбцов данных, из которых 3 вычисляются, один - в формате даты один, а все остальные получают либо ноль, либо единицу в качестве индикаторов того, регистрируется ли резидент или нет для лекции / класса (на самом деле 1 или поле оставлено пустым). В настоящее время в нем 1126 рядов, отражающих 1123 жителей.
Если жители предварительно регистрируются, они в основном платят 1 доллар за урок, но некоторые мероприятия - это музыкальные представления, которые стоят 8 долларов. Если они появляются без предварительной регистрации, они платят 2 и 9 долларов соответственно. Кроме того, некоторые являются классами, которые являются более чем однократными событиями, и регистрация для них может стоить до 111 долларов США, таким образом, существует необходимость в вычислениях, чтобы выяснить, какую сумму чека необходимо отправить резиденту с помощью своей регистрационной формы. Какую сумму чека составляет столбец итоговой суммы. У нас также есть промежуточные итоги для одноразовых событий и еще один для многодневных занятий.
Я нашел отлично недавно больше не функционирует в основном бесплатная надстройка Excel , которая допускает неограниченное количество полей, поэтому ограничение в 32 поля для формы не является проблемой. Я взломал пароль, поэтому у меня есть доступ к VBA формы и я смог добавить пару кнопок, например, одну, которая заполняет одну для всех вечерних событий, поскольку это обычный выбор для регистров. Я был бы счастлив заплатить $ 15 программисту за привилегию пароля, которую он использовал для оплаты, и постараюсь связаться, чтобы сделать это.
Я хотел бы знать, возможно ли это для Форма для мгновенного обновления электронной таблицы и вычисленных полей, а затем рассчитанные поля должны быть обновлены в форме сразу. У меня есть кнопка обновления, но я хотел бы, чтобы электронная таблица обновлялась по мере ввода данных в случае, если участник забыл нажать кнопку обновления. Я понимаю, что ввод данных непосредственно в электронную таблицу делает это, но я хотел бы придерживаться формы.
Я полагаю, что для этого потребуется каким-то образом распознать изменение состояния формы, но я не знаю как написать VBA, чтобы сделать это. Мне удалось выяснить, как повторно ввести рассчитанные суммы в форму после нажатия кнопки обновления, которую затем можно сравнить с суммой чека резидента из общей суммы, представленной в форме.
Вот, я полагаю, куда будет вставлен соответствующий VBA или из которого получится отдельная подпрограмма, основанная на одной или обеих подпрограммах:
Sub UpdateForm()
'This sub updates the fields in the form
Dim ctl As Control
Dim Col As Long
Dim CurrentCell As Range
Col = 0
On Error Resume Next
For Each ctl In Frame1.Controls
If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then
Col = Col + 1
Set CurrentCell = Cells(CurrentRecord + RowOffset, Col + ColumnOffset)
ctl = CurrentCell
If CurrentCell.PrefixCharacter = "'" Then ctl = "'" & ctl
'Check for True/False cells (they would appear as 0 or -1)
If Application.WorksheetFunction.IsLogical(CurrentCell) Then
ctl = CurrentCell.Text
End If
'Is the cell displaying an error value?
If Err <> 0 Then
ctl = CurrentCell.Text 'Display this if the cell has an error value
Err = 0
End If
' Date?
If IsDate(Cells(CurrentRecord + RowOffset, Col + ColumnOffset)) Then
ctl = CurrentCell.Text
End If
'Formula?
If Cells(CurrentRecord + RowOffset, Col + ColumnOffset).HasFormula Then
ctl = FormatCurrency(CurrentCell)
ctl.Enabled = False
ctl.BackColor = RGB(240, 240, 240)
Else
ctl.Enabled = True
ctl.BackColor = RGB(255, 255, 255)
End If
End If
Next ctl
LabelRecNum = Text(9) & " " & CurrentRecord & " " & Text(10) & " " & RecordCount
On Error GoTo 0
End Sub
Sub UpdateDatabase()
'Updates the database with new data from the form
Dim ctl As Control
Dim Col As Long
Dim TestCell As Range
Dim NumberWritten As Long
Col = 0
NumberWritten = 0
For Each ctl In Frame1.Controls
If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then
Col = Col + 1
Set TestCell = Cells(CurrentRecord + RowOffset, Col + ColumnOffset)
If Not TestCell.HasFormula Then ' Don't check formula cells
'Use Clean so cells with non-printing characters will be compared correctly
If TestCell.PrefixCharacter & Application.WorksheetFunction.Clean(TestCell) <> Application.WorksheetFunction.Clean(ctl.Text) Then
'Save original data for undo
NumberWritten = NumberWritten + 1
ReDim Preserve UndoArray(1 To NumberWritten)
With UndoArray(NumberWritten)
.Address = TestCell.Address
.Contents = TestCell.PrefixCharacter & TestCell.Text
.RecNum = CurrentRecord
End With
'write the new data
'(date check code is new in v3) - revised Aug 6-08
If IsRealDate(ctl.Text) Then
If IsDate(DateValue(ctl.Text)) Then
TestCell.Value = CDate(ctl.Text)
End If
Else
TestCell.Value = ctl.Text
End If
End If
End If
End If
Next ctl
If NumberWritten <> 0 Then
UndoButton.Caption = Text(18) '"Undo Entry"
UndoButton.Visible = True
End If
End Sub
Также, если у кого-то есть какие-либо предложения о том, как собрать данные и более эффективно рассчитать Я был бы счастлив услышать это. Сейчас мы используем ручные формы с флажками и полагаемся на старших, чтобы вычислить их суммы чеков. Галочки переносятся в электронную таблицу Excel вручную. Я предложил поместить в каталог курсов машиночитаемую форму, например, те, которые вы найдете для сдачи стандартных тестов, но она была сбита как слишком сложная для пожилых людей. Я не согласен и хотел бы попробовать, но я новичок здесь и не отвечаю, поэтому я не могу провести эксперимент.
Редактировать для PEH: Вот код, который не работа -
Sub FormMain_Change()
UpdateDatabase
Call UpdateForm
End Sub
Также добавление ".ControlSource" к моим элементам управления ("ctl") в кодовом блоке UpdateForm не исправляет ситуацию.