2017-01-05 9 views
-1

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

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

Если открыть файл и сделать еще один щелчок, макрос делает не авторизовать мою первую строку и столбцы. Буквально один клик, и мои результаты не достигнуты.

Мне нужно исправить это. Я не уверен, что это вопрос выбора или активного листа. Очень ограниченное понимание.

'Unmerge all Cells in Worksheet 
ActiveSheet.Cells.UnMerge 

'Delete Columns A1 thru D1 
Range("A1:D1").EntireColumn.Delete 

'Delete Rows A1 thru A9 
Range("A1:A9").EntireRow.Delete 

'Cut and Paste Cells 
Range("A2").Cut Range("A1") 
Range("G1").Cut Range("F1") 
Range("P1").Cut Range("O1") 
Range("AA1").Cut Range("Z1") 

'Sort by Column A to Remove Extra Rows from View 
Columns("A:AM").Sort key1:=Range("A:A"), order1:=xlAscending, Header:=xlYes 

'Auto Fit Contents in Columns and Rows 
ActiveCell.Columns("A:AG").EntireColumn.Select 
ActiveCell.Columns("A:AG").EntireColumn.AutoFit 
ActiveSheet.Rows.EntireRow.AutoFit 

'Delete Empty Columns 
Range("B:B, D:D, G:I, K:L, N:N, P:Q, T:V, X:Y, AA:AB, AD:AF").EntireColumn.Delete 

'Remove Wrap Text from Cell B1 
Range("B1").WrapText = False 

'Autofit Contents of Columns 
Range("A1:AF1").Columns.AutoFit 

'Autofit Row A2 Contents 
Range("A2:A2").Rows.AutoFit 

'Save File As 
Application.GetSaveAsFilename 

ответ

0

Этот блок выглядит не так со мной:

'Auto Fit Contents in Columns and Rows 
ActiveCell.Columns("A:AG").EntireColumn.Select 
ActiveCell.Columns("A:AG").EntireColumn.AutoFit 
ActiveSheet.Rows.EntireRow.AutoFit 

Попробуйте изменить ActiveCell к ActiveSheet:

'Auto Fit Contents in Columns and Rows 
ActiveSheet.Columns("A:AG").EntireColumn.Select 
ActiveSheet.Columns("A:AG").EntireColumn.AutoFit 
ActiveSheet.Rows.EntireRow.AutoFit 

(Потому что вы используете относительные ссылки, а не абсолютные ссылки, ActiveCell.Columns («A: AG») будет относиться к какой бы ячейке вы не нажали, а не начинать с начала листа)

+0

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

+0

OK - вот некоторые предложения по созданию код более надежный: 1. Узнайте о различии между относительными и абсолютными ссылками в Excel (ref: https://support.office.com/en-us/article/Switch-between-relative-absolute-and-mixed-references -dfec08cd-ae65-4f56-839e-5f0d8d0baca9) 2. Узнайте, как использовать объект Range в Excel VBA (ссылка: https://msdn.microsoft.com/en-us/library/office/ff838238.aspx) - особенно, как использовать нотацию Cells (как рекомендует статья) Это сделает вашу программу гораздо менее подверженной тем проблемам, которые вы испытываете. – Ben

+0

Хотя я ценю то, что вы говорите, всегда будут те же строки и столбцы, которые нужно удалить, поэтому я не сделал его более динамичным. Я мог бы использовать точные ссылки. Единственная проблема заключается в том, что когда пользователь нажимает на любом месте листа, это заставляет вещи перепутаться, но только в сегменте автозапуска. Все остальное выполняется безупречно. Я рассмотрю информацию, которую вы приложили, я ценю подсказку :), я согласен, что буду тратить больше времени на изучение этого. Я не называл диапазон, потому что столбцы всегда будут одинаковыми, количество строк будет меняться каждый месяц в зависимости от amoun – user7263910