2016-11-20 3 views
-1

Я работаю над независимым проектом для моего клиента. Они хотели создать кнопку, которая после щелчка пользователя открыла бы пользовательскую форму и имела бы различные макроопределяемые опции: выпадающий список, флажок, кнопка выбора опций и т. Д.Проблемы с копированием кода VBA

Я создал тестовую формулу и отправил ее клиенту; они наслаждались этим и решили отправить мне файл, чтобы «скопировать &» в мой оригинальный код в их файле excel.

Проблема в; потому что я немного неопытный с VBA, у меня возникла проблема, когда я нажимаю кнопку - пользовательская форма не появляется.

Ниже приведена ссылка Dropbox исходного файла, который я создал, и его оригинальный код; а также файл, который я пытаюсь скопировать.

Любая помощь будет радушна и приветствуется.

Ссылка на раздаточной: https://www.dropbox.com/sh/l1t37lz8uritrua/AAAdWPGvw0GDZ6hW4SwmbBdRa?dl=0

+0

Когда я пытаюсь сохранить ваши файлы из Dropbox, он хочет сохранить их как файлы Htm. Я не могу получить доступ к вашему коду. Если я правильно понял, вы скопировали код в рабочую книгу клиента. Вы также скопировали форму? –

+0

Если вы нажмете кнопку загрузки, она даст вам возможность открывать файлы в excel. И код, который я скопировал, я изо всех сил старался соответствовать характеристикам кода, который был в исходном файле (если это имеет смысл). –

+0

Спасибо за инструкции, я не заметил кнопку «Загрузить». Теперь я успешно загрузил ваши файлы. Я рассмотрю их. Это ваш вопрос, поэтому вы автоматически получаете сообщение в папке «Входящие», когда комментарий отправляет его снова. Если вы начнете свой ответ с @ сразу после моего имени, я получу сообщение о том, что вы ответили. –

ответ

0

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 не существует в форме. Вы изменили подписи, но не имена.

Насколько я вижу, форма не выполняется, потому что вы начали ее обновлять, но не закончили.

+0

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

+0

@JerryStackhouse.Версии sub 'honor_roll_button' в OriginalProject и CopyOfOriginal не совпадают. Заявления в разделе «Установка флажков по умолчанию» отличаются. В CopyOfOriginal они адресуют кнопки, которые не существуют. Возможно, вам нужно также скопировать модуль show_button. –

+0

Я сделал так, как вы заявили, и теперь я получаю ошибку отладки о строке Me.Projectbox1.Value - я не могу @ вы. –

Смежные вопросы