Разрешить пользователю делать записи на листе во время выполнения

Все:

Заранее спасибо, вы все очень помогли!!!

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

Что мне нужно сделать, так это поднять этот лист, приостановить макрос, если это возможно, пока они вносят свои изменения (может быть до 5 фильтров, которые они выбирают до того, как лист будет готов.

Затем скопируйте видимые ячейки только на определенный лист, а затем возобновите выполнение макроса.

Я не думаю, что событие изменения рабочего листа сделает это.

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

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

Код вызова:

UserForm3.Show
CopyToDisplay "AEP"
LastPos = LastPos + 1

Где AEP — это имя листа, из которого копируются отфильтрованные строки.

Пользовательская форма отображается, но нажатие кнопки «ОК» ничего не делает, и, конечно же, макрос продолжает работать.

Любые предложения будут ценны!

Спасибо,

Джефф


person Jeff Hyman    schedule 23.09.2014    source источник
comment
Вы задали ряд вопросов, на многие из которых были даны ответы (а на некоторые, по-видимому, удовлетворительно), но вы не приняли чей-либо ответ. Прочитайте ЭТО о том, что делать, когда кто-то ответит на ваш вопрос, а также ЭТО о том, что значит принять ответ. Я не говорю, что вы должны принимать ответ на каждый вопрос, который вы задаете, но именно так мы здесь выражаем благодарность, особенно за ответы, которые решают наши проблемы.   -  person David Zemens    schedule 23.09.2014
comment
Далее: вы задали достаточно вопросов, чтобы знать, что вам, вероятно, следует показать какой-то код. На самом деле вы, вероятно, не будете делать это в одной процедуре, но у вас будет одна процедура, которая вызывается для отображения рабочего листа, и она завершится. Затем, когда пользователь будет готов продолжить, он нажмет кнопку/и т.д. для запуска следующей процедуры.   -  person David Zemens    schedule 23.09.2014
comment
Не понял этого. Я вернусь и сделаю это, поскольку я принял ряд ответов. Что касается кода, мне пока нечего показать. Я спрашиваю, возможно ли это сделать. Я могу опубликовать код для автоматических листов, но здесь это не поможет, так как они в порядке. Я просто пытаюсь выяснить, возможно ли это, и если да, то как это сделать. Вот почему я предложил метод флага.   -  person Jeff Hyman    schedule 24.09.2014
comment
Хорошо, я бы предложил избавиться от идеи приостановки макроса и просто разделить его на части, как я упоминал выше. Есть один макрос для отображения листов/и т.д. Этот макрос заканчивается при отображении листов, что позволяет пользователю манипулировать фильтрами и т. д. Затем им нужно будет нажать кнопку или иным образом вызвать второй макрос, который завершит оставшуюся часть работы: )   -  person David Zemens    schedule 24.09.2014
comment
В противном случае можно эффективно приостановить процедуру ввода данных пользователем (см. здесь для одного метода, который было бы просто реализовать.   -  person David Zemens    schedule 24.09.2014
comment
Привет, Дэвид: Примерно так я и думал. Я попробовал ссылку, которую вы мне прислали, и протестировал ее, но независимо от того, что я делаю, я не могу закрыть пользовательскую форму, чтобы разорвать цикл.... Не уверен, что я делаю неправильно, но я понимаю, что она пытается сделать . да ладно... разделение это... Спасибо!!! Джефф   -  person Jeff Hyman    schedule 24.09.2014
comment
Покажите свой код, и, возможно, мы сможем помочь;)   -  person David Zemens    schedule 24.09.2014
comment
Дэвид: Только что подумал о другой проблеме... Я использую набор Globals... должен ли я сохранять их на скрытом листе и перезагружать при возобновлении?   -  person Jeff Hyman    schedule 24.09.2014
comment
Не надо этого делать. Хотя я стараюсь избегать глобальных запросов, когда это возможно... Я сейчас в машине, но постараюсь вернуться к вам позже этим вечером.   -  person David Zemens    schedule 24.09.2014
comment
Не проблема. Я тоже ненавижу использовать глобальные переменные, но в этом проекте они абсолютно необходимы. Поговорим позже и спасибо за совет и помощь! Джефф   -  person Jeff Hyman    schedule 24.09.2014


Ответы (1)


Джефф, давай попробуем. Ваш текущий код:

UserForm3.Show
CopyToDisplay "AEP"
LastPos = LastPos + 1

Когда мы отображаем пользовательскую форму, поведение по умолчанию — vbModal, что по существу останавливает приложение, и пользователь не может взаимодействовать ни с чем, кроме пользовательской формы, это не то, что вам нужно. Что вам нужно, так это способ отобразить форму, а затем просто дождаться, когда пользователь просигнализирует, что он/она закончил ввод.

Поэтому нам нужно изменить несколько вещей:

Пользовательская форма должна эффективно «приостанавливать», а также позволять пользователю взаимодействовать с рабочим листом. Форма vbModal не может этого сделать (она делает паузу без взаимодействия), и действительно не может vbModeless (она продолжает выполнение И разрешает взаимодействие).

Загадка? Нет. Мы можем имитировать паузу с помощью формы vbModeless и сохранить способность пользователя взаимодействовать с таблицей. Лучший из двух миров!!

Мы покажем форму с необязательным vbModeless, это позволяет пользователю взаимодействовать с остальной частью приложения/рабочими листами/и т. д. Поскольку немодальная форма продолжает выполнение кода, нам нужно имитировать паузу, и мы можем сделать это с помощью Loop. Цикл будет работать бесконечно и прервется только после закрытия пользовательской формы, после чего остальная часть кода продолжит выполнение.

UserForm3.Show vbModeless 

Do While UserForm3.Visible
    DoEvents
Loop

LastPos = LastPos + 1

'You MAY need to reset some variables, if the Filter/Autofilter has affected these/etc.

С точки зрения дизайна, дайте вашей форме один элемент управления Label и установите его свойство .Caption (и свойство формы .Caption) каким-нибудь полезным/поучительным способом. Вы можете добавить командную кнопку, но это кажется ненужным, поскольку все, что будет делать кнопка, — это вызывать событие Terminate (что всегда можно сделать с помощью красного «X»)

введите здесь описание изображения

Для вашей проблемы с копированием (очевидная ошибка при вставке) попробуйте изменить это:

Sheets("AEP").Select  

With ActiveSheet      
    .UsedRange.SpecialCells(xlCellTypeVisible).Copy _
        Destination:=Sheets("Display").range("A" & LastPos)     
    .AutoFilterMode = False     
    Application.CutCopyMode = False  
End With

К этому:

With ActiveSheet      
    .UsedRange.SpecialCells(xlCellTypeVisible).Copy 
     Sheets("Display").range("A" & LastPos).PasteSpecial
    .AutoFilterMode = False     
    Application.CutCopyMode = False  
End With
person David Zemens    schedule 24.09.2014
comment
Дэвид: Это великолепно... У меня не получилось с немодальным по той же причине, что и выше... Позвольте мне попробовать это и вернуться к вам!! - person Jeff Hyman; 24.09.2014
comment
Дэвид, кажется, сначала работает, но я не могу закрыть пользовательскую форму ни с помощью кнопки «x», ни с помощью кнопки cmd, у которой есть только команда unload userform3 . Вы хоть представляете, в чем может быть проблема? - person Jeff Hyman; 24.09.2014
comment
Этого не может возможно произойти, если только вы не создали обработчик событий UserForm_QueryClose и по какой-то причине не отключили событие закрытия формы. Хотя я уверен, что ты этого не делал. Вы уверены, что в вашем коде не установлена ​​активная точка останова? Это предотвратит любое взаимодействие с формой, если код находится в режиме приостановки. - person David Zemens; 24.09.2014
comment
Дэвид: Игнорировать предыдущее... Проклятый режим отладки... Я добавил этот код, поиск работает, и когда я возобновляю работу, пытаюсь сделать простую копию видимых ячеек, но субмарина просто взрывается и возвращается в исходное состояние. процедура вызова.Sheets("AEP").Select UserForm3.Show Modeless Do While UserForm3.Visible DoEvents Loop LastRow = range("A65536").End(xlUp).Row LastPos = LastRow + 1 With ActiveSheet .UsedRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Display").range("A" & LastPos) .AutoFilterMode = False Application.CutCopyMode = False End With - person Jeff Hyman; 24.09.2014
comment
ооо, это странно, ошибок нет, просто не вставляется, да? - person David Zemens; 24.09.2014
comment
Это сделало это! Я сейчас в зелени!!! Спасибо, Давид, за помощь. Я очень ценю это! - person Jeff Hyman; 24.09.2014
comment
Дэвид: Короткий вопрос... Почему Excel просто вылетает из подпрограммы без какого-либо сообщения об ошибке? У меня есть фрагмент кода Worksheets("Display").range("D" & LastPos & ":" & "AM" & LastPos).Select .... excel попадает в него, и хотя книга открыта на этой странице, она просто выпрыгивает. Любые идеи? - person Jeff Hyman; 24.09.2014
comment
Честно говоря, я не думаю, что когда-либо видел такое раньше. Это действительно странно. Предыдущий случай был первым, который я видел, и я знаю, что в методе UsedRange есть некоторые странности, поэтому я решил, что он каким-то образом виноват. Этот конкретный случай я не могу воспроизвести, но вы можете избежать этого с помощью этого: stackoverflow.com/questions/10714251/ Обычно не рекомендуется использовать методы Select или Activate, а также полагаться на выделения или ссылки на активные ячейки и т. д. - person David Zemens; 25.09.2014
comment
Я бы предложил повторить аналогичную ошибку в новой/пустой книге с минимальным объемом кода, необходимым для создания ошибки. Затем опубликуйте это как новый вопрос. Если ничего другого, по крайней мере, некоторые другие люди увидят это и могут получить дополнительное представление о том, в чем может быть проблема/ошибка/ошибка. - person David Zemens; 25.09.2014
comment
Отличная ссылка. Благодарю вас! Я в значительной степени удалил все выборки и активации и перешел к переменным или явному определению. Спасибо еще раз! - person Jeff Hyman; 25.09.2014