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

Microsoft Excel Електронни таблици Microsoft 365 Excel VBA Програмиране VBA за Excel

В урока предварително знаем, че 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+] маркира клетки, които се отнасят към текущата клетка (полезна преди изтриване на клетка)

Може ли малко помощ? Имам колони със сбор, искам ако сбора под някоя колона е 0, колоната да се трие. Дотук какво съм направил: Dim c As Range For Each c In Selection If c.Value > 0 Then ActiveCell.Offset(0, 1).Range("A1").Select If c.Value = 0 Then c.EntireColumn.Delete Next c Не мога да измисля: как да го повтаря докато срещне празна клетка да укажа ако срещне празна клетка да се върни примерно на А1.

Мисля, че тази процедура ще свърши работа:

А тук е екселската таблица, която използвам в процедурата

Резултатът след изпълнението:

Благодаря, яко го бях закъсал/;-) Аз го направих така: Range(Selection, Selection.End(xlToRight)).Select
Selection.Name = "suma" Set MR = Range("suma") For h = 1 To 19 For Each cell In MR If cell.Value = "0" Then cell.EntireColumn.Delete 'òðèå êîëîíà àêî ñáîðà è å 0 Next h

Радвам се, че помогнах. Затова е форумът на Аула - винаги може да попитате за помощ!

Привет, Искам да създам макрос с който да копирам клетки, в които има формула и да поставя същата информация чрез Paste Special - Paste Values в същите клетки (които всеки път са различни и не ми върши работа да определя Range от до определени клетки) Опитвах доста варианта, но все нещо не сработва. Моля за съдействие. Не съм сигурна дали е възможно.

Здравейте, Десислава. Предлагам 2 решения за Paste Special с макрос. 1. Определете Range за цялата таблица (всички клетки с и без формули). Команда Copy за цялата таблица и след това Paste Special Value. 2. Проверявате всяка клетка от Range с блок-оператор For each, дали съдържа формула - характеристика HasFormula. Ако има формула, изпълнявате PasteSpecial Value. В моя пример в диапазона Range("A1:E11") коя клетка съдържа формула. Ако има формула, избира клетката и изпълнява Paste Special.

Ако нещо не е ясно, моля пишете

Изключително много благодаря за подробният отговор. Сработи.


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация