OriginalProject.xlsm имеет форму с именем honor_roll_form, который содержит 100 строк кода.
CopyOfOriginal.xlsm имеет форму под названием UserForm1, которая не содержит полезного кода.
Я не верю, что существует способ прямого копирования пользовательских форм из одной книги в другую. Вместо этого
- В редакторе VB от OriginalProject.xlsm выберите honor_roll_form.
- Нажмите «Файл», затем «Экспорт файла» и сохраните форму на рабочем столе или где хотите.
- Теперь у вас будет два файла на вашем рабочем столе; один с расширением frm и один с расширением frx.
- В редакторе VB CopyOfOriginal.xlsm нажмите «Файл», затем «Импортировать файл».
- Импорт honor_roll_form.frm
При попытке нажав кнопку «Honor Roll», я получаю «член Метод или данные не найдены» для project1Box. Я буду исследовать после обеда (18:57 здесь), если вы не скажете мне, что вы уже знаете, почему я получаю эту ошибку.
Дополнительные комментарии в ответ на запрос от OP
Уже поздно здесь, но я начал смотреть вниз к югу execute_button_Click в рамках второго CopyOfOriginal.xlsm. Я прокомментирую то, что вижу, даже если это не имеет прямого отношения к невыполнению макроса.
Если вы откроете редактор VB и посмотрите слева, вы увидите Project Explorer. В верхней части вы увидите:
Microsoft Excel Objects
Sheet1 (Sheet1)
Я всегда находил это запутанным. Первый «Sheet1» - это идентификатор Excel для рабочего листа и не может быть изменен. Второй «Sheet1» является именем по умолчанию для рабочего листа, который можно изменить. Вы можете написать Sheet1.Range("A1")
или Worksheets("Sheet1").Range("A1")
. То есть: вы можете ссылаться на рабочий лист по его идентификатору или его имени. Вы назвали переменную типа Worksheet как Sheet1.Использование имен Excel в качестве имен переменных может привести к причудливым ошибкам, поэтому важно избегать подобных действий.
Лучше всегда использовать значащие имена. На данный момент вы знаете, что означает Sheet1, но если вы вернетесь к этому макросу через шесть или двенадцать месяцев, вы помните. Я бы использовал переменную, как у вас, но я бы назвал ее WshtCis208 или WshtVBAProg или что-то подобное.
Set ID = Range(Sheet1.Cells(2, 1), Sheet1.Cells(52, 1))
можно записать в виде:
With WshtCis208
Set ID = Range(.Cells(2, 1), .Cells(52, 1))
End With
Использование With statements
производит быстрый код и, почти всегда, код, который проще читать.
«52» - это текущая нижняя строка для этой таблицы. Будете ли вы корректировать макрос для них каждый раз, когда они добавляют или удаляют ученика? Существует несколько методов поиска последней строки, ни одна из которых не идеальна в каждой ситуации. Техника, которая наиболее удобна в большинстве случаев:
Const ColCis208Id as Long = 1
Const ColCis208MidTermExam as Long = 5
Dim RowCis208Last as Long
RowCis208Last = .Cells(.Rows.Count, ColCis208Id).End(xlUp).Row
В настоящий момент столбец 1 является столбцом Идентификатор. Возможно, маловероятно, что столбец идентификатора будет перемещаться, но очень вероятно, что некоторые из остальных столбцов будут перемещаться, когда какой-то новый столбец будет идентифицирован как полезный. Вы хотите отсканировать код, пытаясь решить, какие 5s относятся к столбцу MidtermExam при добавлении столбца Project3?
Константы позволяют вам называть литералы, которые могут измениться. Это делает ваш код более легким для чтения и сохраняет столько боли при изменении значения.
.Rows.Count
дает число строк в листе для текущей версии Excel, так .Cells(.Rows.Count, ColCis208Id)
идентифицирует нижнюю ячейку столбца 1. End(xlUp).Row
говорит идти вверх, пока не упрется в ячейке со значением и возвращает номер строки. Это эквивалент VBA от . Ctrl + Up.
Следующая инструкция subjectCount = …
не работает, потому что projectBox не существует в форме. Вы изменили подписи, но не имена.
Насколько я вижу, форма не выполняется, потому что вы начали ее обновлять, но не закончили.
Когда я пытаюсь сохранить ваши файлы из Dropbox, он хочет сохранить их как файлы Htm. Я не могу получить доступ к вашему коду. Если я правильно понял, вы скопировали код в рабочую книгу клиента. Вы также скопировали форму? –
Если вы нажмете кнопку загрузки, она даст вам возможность открывать файлы в excel. И код, который я скопировал, я изо всех сил старался соответствовать характеристикам кода, который был в исходном файле (если это имеет смысл). –
Спасибо за инструкции, я не заметил кнопку «Загрузить». Теперь я успешно загрузил ваши файлы. Я рассмотрю их. Это ваш вопрос, поэтому вы автоматически получаете сообщение в папке «Входящие», когда комментарий отправляет его снова. Если вы начнете свой ответ с @ сразу после моего имени, я получу сообщение о том, что вы ответили. –