Страницы: 1
RSS
Задать в VBA диапазон до последней заполненной строки.
 
Здравствуйте уважаемые Форумчане!  
Макрорекордером записал макрос для копирования формул и вставки их значений.  
Но хочу, чтобы каждый раз макрос работал только с реально заполненными данными (то есть до последней заполненной строки).  Нашёл на форуме функцию для поиска последней заполненной строки, попытался создать свою переменную на её базе, определяющую границу диапазона для вставки формул (нижнюю правую). Вроде как в msgBox её показывает правильно, а в макросе выдаёт ошибку …  
Бьюсь уже несколько часов, без нужных знаний сложновато. Как правильно это сделать, где ошибка? Файл с кодом прилагаю.  
Спасибо.
 
Range("I4:" & VDM).Select ' РАБОТАЕТ!!!  
Хотя я бы от селектов избавился.
 
ну, не вникая в суть:  
должно быть, наверное, не    
   Range("I4:VDM").Select  
а  
   Range("I4:" & VDM).Select    
 
и к тому же, раз вы работаете не в модуле листа, а в стандартном модуле, то для определенности лучше указывать перед Range Sheet, на котором он находится (у вас - ActiveSheet)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Дмитрий, с Вашего позволения добавлю самую малость.  
 
VDM или LastRow необходимо указать как VDM$ или LastRow$ (As Long).
<FONT COLOR="CadetBlue">
 
{quote}{login=Дъмитръ}{date=21.07.2010 01:34}{thema=}{post}LastRow$ (As Long).{/post}{/quote}  
???  
Это как это: стринг типа лонг? А почему в скобках?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Хотя, да, не смотрел Ваш файл.  
 
Это если не функцией, а с помощью переменной искать последнею строку. Я обычно так ищу.  
 
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row  
или    
LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1  
 
Но раз нужна Вам именно функция, тут мои пять копеек неуместны...
<FONT COLOR="CadetBlue">
 
VDM, а поделитесь, где это вы нарыли такое чудо от ZVI как  
 Dim SpecCells()  
 SpecCells = Array(xlCellTypeConstants, xlCellTypeFormulas, xlCellTypeComments)  
?  
Что-то я не пойму, что за массив SpecCells получается?  
Но ведь работает же!  
Но вообще-то, что-то сложновато вы вычисляете последнюю строку...  
Есть куча более простых методов.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Alex_ST, Вы правы, не на ту кнопку нажал, вот так: "VDM& или LastRow&".
<FONT COLOR="CadetBlue">
 

Спасибо огромное за такое количество откликов! Всё стало конечно работать. Просмотреть все ответы пока не успеваю - накатил аврал на работе. Пока только один вопрос - а какую роль выполняет "&" <BR>Для Alex_ST http://www.planetaexcel.ru/forum.php?thread_id=8203

 
VDM, тоже что и "As Long".  
 
"VDM&" или "LastRow&"  
или  
"Dim VDM As Long" или "Dim LastRow As Long".
<FONT COLOR="CadetBlue">
 
Variables types:  
 
Dim x%  'Integer  
Dim y#  'Double  
Dim z!  'Single  
Dim v&   'Long  
Dim w@   'Currency  
Dim q$  'String
 
Здравствуйте!  
 
Было время всё прочитать и разобраться! На все вопросы «почему всё так сложно – отвечу просто: потому, что ЧАЙНИК:)  
Учёл все комментарии и замечания. В результате:  
 
1. Избавился от функции VDM, заменив на    
«Range("I4:" & "M" & LastRow).Select» (The_Prist)  
 
2. Заменил способ определения последней строчки на    
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row (Дъмитръ)  
 
3. Добавил в свой код проверку на включённый автофильтр  
   On Error Resume Next  
   ActiveSheet.ShowAllData (опять же нарыл на форуме)  
4. Теперь у меня всё в одной процедуре и в модуле листа.  
5.Назначил Dim LastRow%, (кол-во строк листе не будет превышать 10 000) вычитал в полезной литературе что этот тип данных самый быстрый.  
Вот что получилось:  
 
Ещё раз всем спасибо.
 
Избавьтесь по возможности от кучи не нужных Select.  
Ну, зачем вы несколько раз делаете  
   Range("I1").Select, когда после этого сразу начинаете выбирать другие диапазоны?  
Работайте непосредственно с Range, а не с ActiveCell где это только возможно. Например, заполнение формулами первой (на самом деле - третьей) строки будет работать намного быстрее если сделать просто:  
   '"Вставляем в формулы в первую строку:"  
   Range("I3").FormulaR1C1 = "=RC[-4]&RC[-3]&RC[3]"
   Range("J3").FormulaR1C1 = "=IF(RC[-2]=""РАСХОД"",-RC[-3],RC[-3])"
   Range("K3").FormulaR1C1 = "=YEAR(RC[-9])&"" - ""&MONTH(RC[-9])"
   Range("L3").FormulaR1C1 = _  
       "=IF(RC[-10]>=R1C11,IF(RC[-10]<R1C12,RC[-1],""NOPR.""),""до"")"
   Range("M3").FormulaR1C1 = _  
       "=IF(RC[-1]=""до"",IF(SUMIF(R3C9:R3000C10,RC[-4],R3C10:R3000C10)=0,""NOPR."",""PRINT""),""PRINT"")"
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
VDM, я специально написал 2-а метода определения последней строки (возможно их больше, у ZVI универсальная функция).  
 
Как я понимаю:  
 
1. Ищет последнею только с заполненными данными (текстом, цифрами и т.д.).  
2. Ищет "1." + граница и т.п.
<FONT COLOR="CadetBlue">
 
{quote}{login=Alex_ST}{date=22.07.2010 04:44}{thema=}{post}Избавьтесь по возможности от кучи не нужных Select.  
Ну, зачем вы несколько раз делаете  
   Range("I1").Select, когда после этого сразу начинаете выбирать другие диапазоны?  
{/post}{/quote}  
Спасибо, подправил.  
Основной код писал макрорекордером, поэтому и Select. Я ведь даже и не задумывался, что без этого можно обойтись - на будущее учту.
 
{quote}{login=Дъмитръ}{date=22.07.2010 04:47}{thema=}{post}VDM, я специально написал 2-а метода определения последней строки (возможно их больше, у ZVI универсальная функция).  
 
Как я понимаю:  
 
1. Ищет последнею только с заполненными данными (текстом, цифрами и т.д.).  
2. Ищет "1." + граница и т.п.{/post}{/quote}  
 
Да согласен, но в моём случае, на сколько понимаю  - иду от сложного к простому..  
(найти на форуме функцию для последней строки и вставить её в макрос для меня на тот момент было проще для понимания).  
Так что Ваш совет оказался весьма кстати!
 
Вот тут обработку надо вернуть взад, а то потом может понадобиться:  
 
   'Если стоит автофильтр, то снимаем его  
   On Error Resume Next  
   ActiveSheet.ShowAllData  
   On Error GoTo 0
Страницы: 1
Читают тему
Наверх