Изпълнение на процедури - кои редове да се изтрият

Безплатни 20 урока
регистрирай се и научи

Ако сте вече потребител - Регистриран съм
Видео

Тест за преминаване към следващия урок

 
За да се запише една инструкция на два реда, първият ред трябва да завърши със знак:
"_"
"&"
"#"

Въпроси и отговори

  • Как да изтрием редовете, ако предварително не знаем колко са с формули?

    Ана Йонкова:

    В урока предварително знаем, че 2 реда трябва да се изтрият, но ако това не е ясно не е ли по-добре след като открием първата клетка с формула- без да правим Offset направо да зададем ActiveCell.Resize(1,1).EntireRow.Delete

    След като изтрием този ред правим нова проверка, намираме друга формула - изтриваме и нейния ред и така докато се изтрият всички редове с формули.

    Може ли активната клетка да не е в началото на реда за да го изтрием?

    Димитринка Вълкова:

    Здравейте, Ана. Много добър въпрос! Разбира се, че проверката може да се направи и за останалите редове, да се изтрият, ако съдържат формула.
    Може активната клетка да не е в началото на реда. Ето една идея:
    например проверявате дали в активната клетка е въведена формула и ако има формула се изтрива целия ред:
    If ActiveCell.HasFormula = True Then ActiveCell.EntireRow.Delete

    Обърнете внимание Resize в случая е излишен.
    Надявам се, че съм помогнала. 
    Ако имате въпроси, пишете ми.
    Ана Йонкова:

    Благодаря, за отговора!

    Диян Милев:

    не ми работи макроса, защото не ми приема процедурата from(име на другия макрос). Защо се получава така?

    Диян Милев:

    Има ли значение положенията на макросите в модулите?

    Димитринка Вълкова:

    Здравейте, Диян. Ако правилно съм разбрала, имате процедура Sub from(), която не се приема (изпълнява) от друг макрос. Обърнете внимание from е дума от синтаксиса на VBA - това са служебни думи, които не може да използвате като име на процедурата (макроса). По всяка вероятност това е причината. Променете името, например: Sub from_drug_macros. Ако проблемът не се реши, изпратете картинка, за да намерим решение.

    Отговарям на втория Ви въпрос: Ако имате пред вид последователността на записването на макросите и в кой модул са записани - няма значение. Макросите или процедурите могат да се изпълняват от различни модули. Много важно условие да не се дублират имената на процедурите, които записвате в едни модул.

    Надявам се, че успях да отговоря на въпросите.

    Диян Милев:

    :) сега ми се получи. Да, трябва да са еднакви имената на самият макрос и името на описанието в новият макрос с който го извикваме. Благодаря Ви!

    Пламен Калинов:

    На мен ми хареса идеята на Ана Йонкова. ActiveCell.SpecialCells(xlLastCell).Select Selection.End(xlUp).Select If ActiveCell.HasFormula = True Then ActiveCell.EntireRow.Delete If ActiveCell.HasFormula = False Then MsgBox "Формулите са изтрити" If ActiveCell.HasFormula = False Then ActiveCell.Offset(-1, 0).Select Само, че на мен ми се иска като прехвърли на горният ред да продължи проверката ред, по-ред до най-горният. Предполагам става с някакъв цикъл?

    Димитринка Вълкова:

    Здравейте Диян. Точно така, проверката на следващите редове (нагоре или надолу), става с блок-оператор за повторение (цикъл или Loop), разглеждам ги подробно в Модул 5 на курса. Но искам да обърна Ви внимание на характеристиката (property) SpecialCells(xlLastCell). Тя определя винаги последната използвана клетка в даден диапазон (object Range). Това означава, ако има изтрити колони или редове, винаги ще показва последната използвана клетка, дори и да е празна. Изтрийте няколко реда и колони и тествайте процедурата, така ще видите действието на SpecialCells(xlLastCell). Ако имате още и други въпроси, пишете.

    Димитринка Вълкова:

    Пламен, погрешно адресирах отговора си до Диян, за което се извинявам!

    Пламен Калинов:

    Благодаря. Ще тествам.;-)