Для повторяющейся формы ввода VBA (например, 100 флажков, которые заполняют 100 ячеек) есть ли способ автоматической генерации кода? - PullRequest
0 голосов
/ 17 мая 2019

Я использую Excel и VBA для создания базы данных людей и их хобби / навыков. Я создал форму пользователя, в которой пользователь может ввести свое имя (в nameTextBox), отдел (deptTextBox), а затем отметить, какие навыки у него есть, из списка 150.

Если пользователь нажимает кнопку «Сохранить и закрыть» в форме, его данные должны заполнить электронную таблицу Excel. Флажки соответствуют «True» или «False». Однако их так много, что мне интересно, возможно ли сгенерировать этот код автоматически (или найти более простой способ его кодирования).

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

Я попытался вставить его сначала в Блокнот или WordPad, а затем в VBA, но я получаю ту же ошибку. Это происходит, даже если код и символы выглядят ТОЧНО ТО ЖЕ, как то, что я печатаю - это работает, если я набираю его, не получается, если я копирую и вставляю его.

'Если пользователь нажимает «Сохранить и закрыть», я хочу сохранить его данные на Листе 3, в следующей доступной строке, а затем закрыть форму

    Dim lRow As Long
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet3")
    lRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
        With ws
            .Cells(lRow, 1).Value = nameTextBox.Value
            .Cells(lRow, 2).Value = deptTextBox.Value
            .Cells(lRow, 3).Value = notesTextBox.Value

            ' This next bit adds all the skills as TRUE (checkbox ticked) or FALSE (unticked). There are 150, so I'm wondering if I can generate this code automatically rather than write it all by hand!

            .Cells(lRow, 5).Value = CheckBox1.Value
            .Cells(lRow, 6).Value = CheckBox2.Value
            .Cells(lRow, 7).Value = CheckBox3.Value
            .Cells(lRow, 8).Value = CheckBox4.Value
            .Cells(lRow, 9).Value = CheckBox5.Value
            .Cells(lRow, 10).Value = CheckBox6.Value
            .Cells(lRow, 11).Value = CheckBox7.Value
            .Cells(lRow, 12).Value = CheckBox8.Value
            .Cells(lRow, 13).Value = CheckBox9.Value
            .Cells(lRow, 14).Value = CheckBox10.Value
            .Cells(lRow, 15).Value = CheckBox11.Value
            .Cells(lRow, 16).Value = CheckBox12.Value
            .Cells(lRow, 17).Value = CheckBox13.Value
            .Cells(lRow, 18).Value = CheckBox14.Value
            .Cells(lRow, 19).Value = CheckBox15.Value
            .Cells(lRow, 20).Value = CheckBox16.Value
            .Cells(lRow, 21).Value = CheckBox17.Value
            .Cells(lRow, 22).Value = CheckBox18.Value
            .Cells(lRow, 23).Value = CheckBox19.Value
            .Cells(lRow, 24).Value = CheckBox20.Value
            .Cells(lRow, 25).Value = CheckBox21.Value
            'And so on, until....
            .Cells (1Row, 151).Value = Checkbox148.Value

Ожидаемый результат: при сохранении пользовательской формы каждый флажок заполняет новую ячейку значением ИСТИНА или ЛОЖЬ. Фактический результат: я получаю сообщение об ошибке «Ошибка компиляции: ожидается: разделитель списка или)». Обратите внимание, что этот код работает, когда я набираю его вручную, но не работает, если я вставляю его из буфера обмена, несмотря на то, что он выглядит идентично.

1 Ответ

0 голосов
/ 17 мая 2019

Вы можете сделать что-то вроде этого, используя цикл:

    Dim lRow As Long, n As Long
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet3")
    lRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

    With ws.Rows(lRow)
            .Cells(1).Value = nameTextBox.Value
            .Cells(2).Value = deptTextBox.Value
            .Cells(3).Value = notesTextBox.Value

            For n = 1 to 150
                .Cells(4 + n).Value = Me.Controls("CheckBox" & n).Value
            Next n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...