2016-08-09 6 views
0

очень новый для Excel VBA и работает над упражнением для создания листа заказа на поставку с пользовательской формой.Row Function Maths ClearContents - Excel VBA

При попытке очистить строки на основе пары переменных столкнулись с проблемой.

У меня есть кнопка, чтобы очистить строку, которая только что был добавлен к листу, с помощью следующего кода:

Private Sub RemovePrevious_Click() 

'Removes last line of PO 

If LineItemTotal > 1 Then 

Rows(LineItemTotal + POrowstart - 1).SpecialCells(xlCellTypeConstants).ClearContents 

End If 

End Sub 

LineItemTotal является диапазон на листе, который увеличивается по мере добавления новых линий. Он объявляется публично с POrowstart в начале UserForm:

Private LineItemTotal As Integer 
Private POrowstart As Integer 

Затем они назначены в других подразделах:

LineItemTotal = Range("LineItemTotal") 
POrowstart = 10 

Проблема заключается в том, что при использовании кнопки для запуска removeprevious юга, математика не складывается. Например, когда LineItemTotal равно 3, он должен удалить строку 12 (правильный), но вместо этого удаляет строку 11. Если вы снова нажмете ее (LineItemTotal теперь на 2, поэтому должен удалить 11), он выдает ошибку «нет ячеек» были найдены «как будто он удаляет 11, но он уже ошибочно очистил это.

У меня есть специальные коды в коде, так как есть формулы в строке, которую я хотел бы сохранить.

Спасибо за любую помощь в этом.

+1

Я могу дать вам небольшой, но очень мощный совет: запишите MACRO, в котором вы делаете все, что вам нужно (например, очищаете выделенные ячейки), прекратите запись, а затем скопируйте сгенерированный код в свой VBA (вам, возможно, потребуется сделать некоторые корректировки). Вот как я нахожу способ сделать много вещей в VBA. – FDavidov

+0

Простейшим способом отладки этого является использование окна locals в vbexplorer и просмотр значений для переменных с каждым шагом вашего кода. Нажмите F8, чтобы запустить одну строку. View> Locals Window, чтобы показать местных жителей. Наслаждайтесь! – User632716

+0

Спасибо, оба! Действительно хорошие советы, однако до сих пор не попали в корень проблемы, если вы все еще можете помочь? Код работает, если я объявляю и устанавливаю переменные в моей подгруппе, но не в том случае, если я объявляю в общих объявлениях и устанавливаю их в другом поднаборе, поэтому, похоже, что-то связано с переменными и областью? И tom preston, я не могу показаться, что вступаю в этот код с отладчиком, он просто переходит к другому суб! Еще раз спасибо –

ответ

0

Двойную проверку ваших переменных, поскольку они объявлены на уровне модуля, они могут иметь другое значение от ожидаемого. Вообще говоря, рекомендуется избегать переменных уровня модуля и объявлять их на самом низком уровне. VBA предлагает: уровень ROutine. Если вам нужно передать значения в другую процедуру, дайте эти обычные аргументы и передайте значения в качестве аргументов.

+0

Спасибо JKpieterse, есть ли способ передать переменные между подмножествами, не вызывая целое под? То есть Я просто хочу установить LineItemTotal и POrowstart в первом подполе, а затем использовать эти значения в другом суб. Тем не менее, это не сработало бы, чтобы называть любой из них внутри друг друга. Еще раз спасибо. –

+0

Вы пробовали пройти через код и посмотреть на значения ваших переменных? (мышь над ними) – jkpieterse