Возможно ли обновить ячейку Excel из формы мгновенно, вместо того чтобы требовать нажатия кнопки обновления? - PullRequest
0 голосов
/ 17 февраля 2020

У нас есть база данных таблиц Excel с предварительной регистрацией для программы непрерывного образования пенсионеров. В базе данных имеется 37 столбцов данных, из которых 3 вычисляются, один - в формате даты один, а все остальные получают либо ноль, либо единицу в качестве индикаторов того, регистрируется ли резидент или нет для лекции / класса (на самом деле 1 или поле оставлено пустым). В настоящее время в нем 1126 рядов, отражающих 1123 жителей.

Если жители предварительно регистрируются, они в основном платят 1 доллар за урок, но некоторые мероприятия - это музыкальные представления, которые стоят 8 долларов. Если они появляются без предварительной регистрации, они платят 2 и 9 долларов соответственно. Кроме того, некоторые являются классами, которые являются более чем однократными событиями, и регистрация для них может стоить до 111 долларов США, таким образом, существует необходимость в вычислениях, чтобы выяснить, какую сумму чека необходимо отправить резиденту с помощью своей регистрационной формы. Какую сумму чека составляет столбец итоговой суммы. У нас также есть промежуточные итоги для одноразовых событий и еще один для многодневных занятий.

enter image description here

Я нашел отлично недавно больше не функционирует в основном бесплатная надстройка 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 не исправляет ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...