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

Безплатни 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). Ако имате още и други въпроси, пишете.

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

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

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

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

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

    Здравейте, имам нужда от помощ за една задача. Под колоните трябва да се добави сумарен ред и да се провери, ако сумата е 0 се трие колоната, ако не е се продължава напред и така до края. Стигнах до тук: Range("B1").Select Range(Selection, Selection.End(xlDown)).Select ActiveCell.Range("A1:A13").Select ActiveCell.Offset(12, 0).Range("A1").Activate ActiveCell.FormulaR1C1 = "=SUM(R[-12]C:R[-1]C)" ActiveCell.Offset(-12, 0).Range("A1:A13").Select Selection.End(xlDown).Select Selection.AutoFill Destination:=ActiveCell.Range("A1:F1"), Type:= _ xlFillDefault ActiveCell.Range("A1:F1").Select Selection.End(xlToRight).Select Selection.End(xlToLeft).Select

    If ActiveCell > 0 Then ActiveCell.Offset(0, 1).Range("A1").Select If ActiveCell = 0 Then ActiveCell.EntireColumn.Delete

    И сега не искам да започва макроса пак от начало а от иф?

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

    Здравейте, Пламен. За да се изпълнява IF (проверката) трябва да включите оператор за повторение (Loop), например For each или For за диапазона със сумарните формули, който вече сте дефинирали. Според мен тази процедура ще се изпълнява само за таблица, с 12 реда и 4 колони (B:F). Помислите как да редактирате макроса (процедурата), така че да не зависи от броя на редовете и колоните в таблицата. Когато се създава процедура (макрос) добре е тя да бъде универсала, т.е. да работи винаги, когато се решава тази задача без значение колко реда и колони има в таблицата.

    Райна:

    Клавишната комбинация Ctrl+] маркира клетки, които се отнасят към текущата клетка (полезна преди изтриване на клетка)