Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел). "Удивительно, но подсел немного"
Прилагаю файл.
Задача: После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы). Для определения ее использую переменную. Думаю что проблема в этом.
З.Ы. посмотрите код может кто увидит еще косяки.
PPS. В файле таблицы исходники до выполнения макроса.
Всем доброго времени суток!
Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел). "Удивительно, но подсел немного"
Прилагаю файл.
Задача: После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы). Для определения ее использую переменную. Думаю что проблема в этом.
З.Ы. посмотрите код может кто увидит еще косяки.
PPS. В файле таблицы исходники до выполнения макроса.mikaelw
а по факту форматирует на диапазоне B2:B46.. почему?
Дело в том, что Вы поудаляли перед этим несколько строк. До удаления сочетание Контрл Енд (это Ваш xlLastCell) выделяло Вам ячейку Т46. После удаления строк все равно Контрл Енд будет выдавать Вам Т46. До того момента, пока Вы не обновите информацию файла о самом себе. Например
а по факту форматирует на диапазоне B2:B46.. почему?
Дело в том, что Вы поудаляли перед этим несколько строк. До удаления сочетание Контрл Енд (это Ваш xlLastCell) выделяло Вам ячейку Т46. После удаления строк все равно Контрл Енд будет выдавать Вам Т46. До того момента, пока Вы не обновите информацию файла о самом себе. Например
Для себя когда-то сделал шпаргалку с разными методами:
[vba]
Код
' http://msoffice.nm.ru/article/lastcell.htm - "Поиск последней заполненной ячейки" Private Sub LAST_CELL() ' последняя ячейка используемого диапазона на листе Dim sLastAddr$, lLastRow&, iLastCol% 'With Sheets("Лист1") With ActiveSheet 'МЕТОД 1: правильно работает в большинстве случаев 'игнорируются скрытые строки/столбцы (шириной/высотой, группировкой, фильтром …) lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 'lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'lLastRow = .Range("A" & Rows.Count).End(xlUp).Row iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column sLastAddr = .Cells(.Rows.Count, 1).End(xlUp).Address 'sLastAddr = .Cells(.Rows.Count, "A").End(xlUp).Address 'Arr = Range("A1:A" & Cells(Rows.Count, "C").End(xlUp).Row).Value
lLastRow = .Cells(5, 2).End(xlDown).Row ' последняя заполненная ячейка в столбце В, начиная с 5-й строки
'МЕТОД 2: МОЖЕТ СЧИТАТЬ НЕ ВЕРНО после удаления последней ячейки, _ а также может учесть пустую, но форматированную ячейку (заливка, границы, УФ, …) 'правильно работает в только что созданном документе, _ в котором только добавляются данные в строки/столбцы lLastRow = .Cells.SpecialCells(xlLastCell).Row iLastCol = .Cells.SpecialCells(xlLastCell).Column sLastAddr = .Cells.SpecialCells(xlLastCell).Address
'МЕТОД 3: те же недостатки, что и у метода 2… Но т.к. есть обращение к UsedRange, то считает верно! lLastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1 iLastCol = .UsedRange.Column + .UsedRange.Columns.Count - 1
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Восстановить правильное положение последней ячейки можно, просто обратившись к UsedRange: With .UsedRange: End With 'или так: lLastRow = .UsedRange.Cells.SpecialCells(xlLastCell).Row iLastCol = .UsedRange.Cells.SpecialCells(xlLastCell).Column sLastAddr = .UsedRange.Cells.SpecialCells(xlLastCell).Address
End With End Sub
[/vba]
До сих пор иногда пользуюсь (Прошу прощения, что не по примеру топик-стартера. У меня с работы собаки-сисадмины скачивание файлов с макросами запретили )
Для себя когда-то сделал шпаргалку с разными методами:
[vba]
Код
' http://msoffice.nm.ru/article/lastcell.htm - "Поиск последней заполненной ячейки" Private Sub LAST_CELL() ' последняя ячейка используемого диапазона на листе Dim sLastAddr$, lLastRow&, iLastCol% 'With Sheets("Лист1") With ActiveSheet 'МЕТОД 1: правильно работает в большинстве случаев 'игнорируются скрытые строки/столбцы (шириной/высотой, группировкой, фильтром …) lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 'lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'lLastRow = .Range("A" & Rows.Count).End(xlUp).Row iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column sLastAddr = .Cells(.Rows.Count, 1).End(xlUp).Address 'sLastAddr = .Cells(.Rows.Count, "A").End(xlUp).Address 'Arr = Range("A1:A" & Cells(Rows.Count, "C").End(xlUp).Row).Value
lLastRow = .Cells(5, 2).End(xlDown).Row ' последняя заполненная ячейка в столбце В, начиная с 5-й строки
'МЕТОД 2: МОЖЕТ СЧИТАТЬ НЕ ВЕРНО после удаления последней ячейки, _ а также может учесть пустую, но форматированную ячейку (заливка, границы, УФ, …) 'правильно работает в только что созданном документе, _ в котором только добавляются данные в строки/столбцы lLastRow = .Cells.SpecialCells(xlLastCell).Row iLastCol = .Cells.SpecialCells(xlLastCell).Column sLastAddr = .Cells.SpecialCells(xlLastCell).Address
'МЕТОД 3: те же недостатки, что и у метода 2… Но т.к. есть обращение к UsedRange, то считает верно! lLastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1 iLastCol = .UsedRange.Column + .UsedRange.Columns.Count - 1
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Восстановить правильное положение последней ячейки можно, просто обратившись к UsedRange: With .UsedRange: End With 'или так: lLastRow = .UsedRange.Cells.SpecialCells(xlLastCell).Row iLastCol = .UsedRange.Cells.SpecialCells(xlLastCell).Column sLastAddr = .UsedRange.Cells.SpecialCells(xlLastCell).Address
End With End Sub
[/vba]
До сих пор иногда пользуюсь (Прошу прощения, что не по примеру топик-стартера. У меня с работы собаки-сисадмины скачивание файлов с макросами запретили )Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 17.09.2014, 09:00