Здравейте,
Знакът "<>" е аритметичен оператор, който означава "Не е равно", така както се използва и в екселските формули. А инструкцията означава "ако записаното в клетка Cells(row_nu + 6, 4) не е равно на "Средно", да завърши процедурата - Exit Sub.
В модул 5 подробно разглеждам аритметичните оператори и блок-оператори на VBA.
Моля пишете, ако нещо не Ви е ясно. Успех!
Здравейте, мога ли вместо:
If Cells(row_nu +7, 4) <> "средно" Then Exit Sub
да напиша:
If Cells(row_nu +7, 4) = " " Then Exit Sub
Диян, зависи какво проверявате. Ако проверката е дали стойността на клетката е равна на един празен интервал Cells(row_nu+7,4)= " ", тогава ДА, може да се запише. Има разлика, ако запишете като проверка Cells(row_nu+7,4)= "" (две двойни кавички). Това означава, ако клетката е празна, т.е. няма въведена стойност. Тествайте тези проверки и веднага ще видите разликата.
да, исках да запиша празна клетка, без интервал
Здравейте,
Имам една задача, която трябва да реша с макроси, но не мога да напиша процедурата. Може би не съм достигнала такова ниво на курса, но ще попитам, а Вие ще прецените.
Като използвам колона АМ за начална колона в редовете от 11 до 29 трябва да сумирам стойностите на същите редове, но от предишните два шийта, като там данните са в 14 колони и същите редове. Например в АМ11 трябва да сумирам от sheet "Test" и sheet "Test2" стойностите от АY11 до АY29" и така за всички 14 колони на двата шийта.
<
p>
Цветелина, ако диапазоните са статични, може да ги дефинирате с обект Range.
Например, rng_test = Worksheets("Test").Range("AY11:AY29"), а след това да използвате WorksheetFunction.Sum(rng_test). Използването на екселските функции във VBA разглеждам подробно в следващия модул.
Но за да помогна, ми трябва повече информация, една картинка също ще свърши работа!
Ето това се опитвам да направя и успях, но трябва да опростя кода. Целта ми е в колони от "Е6" нататък да сумирам данни от други два файла със същата структура и колони.
Цветелина, за съжаление от картинката не виждам всички инструкции в процедурата, както и екселската таблица.
В следващите уроци на модул_3 показвам как се управляват (отварят, записват и затварят) други файлове, което ще ти помогне за задачата. Показвам и как се скриват съобщенията на Excel, така че автоматично да се записват направените промени и да се затваря файла без екселските съобщения.
Съветвам те да изгледаш всички уроци от модул_3, ще намериш много полезни неща за тази задача.
Но за да ти помогна, ще трябва да прегледам цялата процедура.
Добре, благодаря. Първо ще изгледам модула и тогава пак ще задам въпроса, ако сама не съм намерила отговора.
Готова съм да помогна, така че ако имаш въпроси или нещо не ти е ясно, пиши!
Успех!
Здравейте,
Пренаписах кода и всичко работи, но има една особеност, която незнам как да дефинирам в макроса.
Консолидирам данни от еднотипни файлове по номер на седмица -52 колони с номер на седмица във всяка една, но ако сега сме седмица номер 4, то консолидирането трябва да започва от седмицата след текущата.
Доста четох за WeekNum, но не мога да разбера как да дефинирам това отместване с една седмица от текущата. Според мен ще е с променлива, но как да дефинирам на промеливата да е равна на текущата седмица +1?
Без файла ми е малко трудно, но ще се опитам да дам подробно описание, така както разбирам проблема ти.
Колоните съответстват на номерата на седмиците. Например, седмица 1 е в колона С (индекс 3). На променлива, да кажем col_nu, присвояваш col_nu=3.
Трябва да направиш проверка за номера на текущата седмица. Най-лесно, това може да стане като в клетка на екселската таблицата въвеждаш функцията WEEKNUM за датата. След това стойността на тази клетка (номерът на седмицата) добавяш към променливата col_nu. Например, в клетка А2 въвеждаш функцията WEEKNUM, за да получиш номера на седмицата за датата (в твоя пример седмицата е 4). В процедурата (макроса) ще запишеш
col_nu=col_nu + Range("A2").Value +1.
Надявам се това описание да ти помогне.
Бях определила седмицата за текущата дата във файла и преди това. И всички колони от Е до BD, в ред 6 имат номерата на седмиците, но под номерата на седмиците има данни за консолидиране и тъй като съм задала твърд рейндж за консолидиране, то консолидирането започва всеки път от седмица 1, а трябва да започва от текущата седмица +1.Трябва да видите кода.
Здравейте, Следвах инструкциите Ви и успях да изпълня задачата. Справих се със рейнджа (прочетох в нета как се изписва рейндж с променлива). Променливата я сложих на мястото на колоната (R11:C & col_nu) и консолидирането се отмества точно спрямо текущата седмица +1. Благодаря Ви много.
Прибързано се зарадвах. Като пусна кода да де изпълнява, не показва никакви грешки, но данните не се консолидират.
Открих си грешката. Диапазонът за консолидиране трябва да е изписан : !R11C" & col_nu & ":R14C56 Благодаря за насоките.
Цветелина, отговарям на съобщенията тук. Най-напред поздравления! Няма по-ценно от това сама да откриваш грешките си и да ги решаваш! Това е опит, който придобиваш сама, ето защо е толкова ценно. В Интернет има достатъчно и полезна информация, много добре си се сетила да потърсиш. Освен това винаги можеш да ми пишеш, когато имаш въпроси или срещаш затруднения! По отношение на изпращането на файлове (attached files) чрез платформата на Аула, ще проуча как точно става и веднага ще ти пиша. Препоръчвам ти да не спираш и да продължиш със следващите уроците в курса - ще намериш много полезни неща (например как се работи с масиви - arrays). Така тази задача, която между другото е истинско предизвикателство! можеш да използваш, за да прилагаш наученото в курса и сама да намериш по-добри решения, т.е. да оптимизираш кода. Успех и смело продължавай напред!
Благодаря Ви. Не смятам да спирам с уроците. Просто сега ми се наложи в работата да консолидирам данни и нямах време да гледам уроците първо. Каквото научиш сам с ровене и чудене, много трудно се забравя.
Цветелина, за съжаление не виждам изображението и не мога да ти отговоря
Бихте ли прикачили изображение на проблема, който срещате, за да бъде по-ясно и да можем да помогнем?
В началото на видеото макроса, и по-точно последният ред на края има една кавичка, а при мен две кавички и без втората макроса не се изпълнява, ето примера:
'изтрива редовете с формули If Cells(row_nu, 1) <> "Ñðåäíî" Then Exit Sub Range(Cells(row_nu - 1, 1), Cells(row_nu, col_nu)).clearcontent
Т.е. преди .clearcontent имам две кавички, а на видеото е само една и там макроса работи без проблем, да не би да се дължи на разлика в типа на ексел, моя е от 2007. Благодаря Ви!
Валентина, единичната кавичка или апостроф означава коментар по принцип е достатъчна само една, но може да има и повече. Но по-важното е, че компилаторът прави разлика между единична и двойна кавичка. Когато в началото на реда се постави единична кавичка, целият ред (инструкция) се оцветява в зелено, т.е. коментар и този ред не се изпълнява. Версията на ексел няма значение. Проверете внимателно какви кавички използвате. Надявам се, че успях да помогна. Ако имате още въпроси, пишете!
Здравейте, може ли да попитам как да селектирам втория ред от една таблица, чиийто първи вече съм селектирала с Range(Selection, Selection.End(xlToRight)).Select
Selection.Offset(1, 0).Select 'Селектира един ред под вече селектирания. Но, ако трябва да се селектират идвата реда, то тогава: Range(Selection, Selection.End(xlToRight).Offset(1, 0)).Select или Range(Selection.Offset(1, 0), Selection.End(xlToRight)).Select
Сърдечно благодаря!
Здравейте, искам след като съм направила формулата за сума на последния ред в първата колона, да копирам формулата до последната колона в таблицата. Създала съм променлива за брой колони, но някъде бъркам. Ето и скрипта: Range("A1").End(xlDown).Activate.Copy .Range(ActiveCell, column_nu - 1).Paste
В инструкцията има 2 грешки. 1. Range("A1").End(xlDown).Activate.Copy Една инструкция изпълнява само едно нещо - команда (method) или характеристика (property). Във Вашата инструкция има 2 команди (methods) - Activate i Copy. Трябва да запишете 2 инструкции.
Правилните инструкции: Range("A1").End(xlDown).Select (по-добре е от Activate, защото имате 1 клетка) ActiveCell.Copy Range(Cells(ActiveCell.Row,2), Cells(ActiveCell.Row, column_nu))
Обърнете внимание, обект Range се дефинира с референциите на 2 клетки (Cells), където първият аргумент е индекс на реда, а вторият - на колоната. За да определя индекса на реда, използвам характеристиката Row ActiveCell.Row.
В този и следващите уроци подробно обяснявам как се дефинира обект Range. Съветът ми е да изгледате още веднъж урока. И разбира се пишете, ако имате въпроси.
Весели празници!
Здравейте. Не разбирам кода за изтриване на формулите. Range(Cells(row_nu-1,1), Cells(row_nu,col_nu).Clear Content Как този код разбира че искаме да изберем най- последния ред и да го изтрием заедно с реда над него.
С променлива с име row_nu е означен номера на реда. С row_nu-1 се означава номера на предходния ред. Имената на променливите се избират от програмиста (този, който пише кода).
Здравейте, Мария. Имате пред вид урок 4 от модул 3, нали? Ако е така, променливата row_nu съхранява числото на последния ред в таблицата, а row_nu-1 - един ред над него. Така обект Range включва последните два реда от таблицата, които ще се изтрият, ако в колона А има текст "Средно". Ще стане още по-ясно, ако тествате процедурата по стъпки (с клавиш F8). Ако имате още въпроси, пишете.
Здравейте,
понеже сме избрали Range("D7").CurrentRegion както за row_nu, така и за col_nu, защо се налага да броим редовете и колоните от началото на Sheet-a (клетка A1) ? Въпросът ми е свързан с логиката на последната процедура. Ако правилно разбирам, всяка клетка във VBA си има координати, както и в Excel. "row_nu+5" задава начало на Range в клетка D27, която е на 27ми ред в Excel. Понеже сме присвоили на row_nu стойност 22, ни остава чисто математически да прибавим 5, за да кодираме координатите на клетка D27 във VBA. Респективно диапазон с координати "row_nu+6" и "col_nu+3" в Ексел би бил дефиниран от клетка D28 до клетка G28(отново защото col_nu има присвоена стойност 4 и на нас ни остава с аритметично действие събиране да достигнем до резултат=колона 7, в която се намира желаната клетка G28 от Ексел). Това ли е логиката?
Да, това е логиката. Примерът е специално избран, за да покажа разликата между двете характеристики (properties): Row - Rows и Column - Columns.