Обект Range - характеристики (properties), които определят текущия ред и колона

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

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

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

 
Характеристиките (properties) Row и Column връщат референцията съответно за ред и колона на обект ActiveCell
Твърдението е вярно
Твърдението НЕ е вярно

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

  • Как се тълкува знакът "<>"

    Dimitar Milanov:

    Здравейте,


    Първо да ви поздравя за страхотните уроци! Много добре структурирани и полезни.

    Въпросът ми е, ако може да добавите разяснения за следната инструкция:

    If Cells(row_nu + 6, 4) <> "Средно" Then Exit Sub

    Какво означава знакът : "<>"  ? и как се тълкува посоченият ред?

    Благодаря предварително.
    Димитринка:

    Знакът "<>" е аритметичен оператор, който означава "Не е равно", така както се използва и в екселските формули. А инструкцията означава  "ако записаното в клетка 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)= "" (две двойни кавички). Това означава, ако клетката е празна, т.е. няма въведена стойност. Тествайте тези проверки и веднага ще видите разликата.

    Диян Милев:

    да, исках да запиша празна клетка, без интервал

  • Как да изпълня следната задача

    Cvetelina Raykova:

    Здравейте,

    Имам една задача, която трябва да реша с макроси, но не мога да напиша процедурата. Може би не съм достигнала такова ниво на курса, но ще попитам, а Вие ще прецените.

    Като използвам колона АМ за начална колона в редовете от 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 разглеждам подробно в следващия модул.
    Но за да помогна, ми трябва повече информация, една картинка също ще свърши работа!

    Cvetelina Raykova:

    Ето това се опитвам да направя и успях, но трябва да опростя кода. Целта ми е в колони от "Е6" нататък да сумирам данни от други два файла със същата структура и колони.

    Cvetelina Raykova:

    Това е процедурата.

    Cvetelina Raykova:

    Процедурата продължава. В последните инструкции съм записала файловете да се затварят, но реално те не се затварят, защото ексел пита дали да ги запазва или не. Инструкцията не ми е пълна.

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

    Цветелина,  за съжаление от картинката не виждам всички инструкции в процедурата, както и екселската таблица.
    В следващите уроци на модул_3 показвам как се управляват (отварят, записват и затварят) други файлове, което ще ти помогне за задачата. Показвам и как се скриват съобщенията на Excel, така че автоматично да се записват направените промени и да се затваря файла без  екселските съобщения.
    Съветвам те да изгледаш  всички уроци от модул_3, ще намериш много полезни неща за тази задача.
    Но за да ти помогна, ще трябва да прегледам цялата процедура. 

    Cvetelina Raykova:

    Добре, благодаря. Първо ще изгледам модула и тогава пак ще задам въпроса, ако сама не съм намерила отговора.

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

    Готова съм да помогна, така че ако имаш въпроси или нещо не ти е ясно, пиши!
    Успех!

    Cvetelina Raykova:

    Здравейте,

    Пренаписах кода и всичко работи, но има една особеност, която незнам как да дефинирам в макроса.

    Консолидирам данни от еднотипни файлове по номер на седмица -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.
    Надявам се това описание да ти помогне.

    Cvetelina Raykova:

    Здравейте,

    Как мога да ви изпратя файла?
    Cvetelina Raykova:

    Бях определила седмицата за текущата дата във файла и преди това. И всички колони от Е до BD, в ред 6 имат номерата на седмиците, но под номерата на седмиците има данни за консолидиране и тъй като съм задала твърд рейндж за консолидиране, то консолидирането започва всеки път от седмица 1, а трябва да започва от текущата седмица +1.Трябва да видите кода.


    Public Sub ConsolidateData()

    'Присвоява номерата седмиците в колоните

    For i = 1 To 52

    Range("D6").Offset(0, i) = i

    Next

    ' Задава стойност на редовете с видовете приходи и разходи

    Range("C11").Select
    ActiveCell.Value = "Плащания от клиенти"
    ActiveCell.Offset(1, 0).Value = "Факторинг"
    ActiveCell.Offset(2, 0).Value = "Авансови плащания"
    ActiveCell.Offset(3, 0).Value = "Други постъпления"


    Range("C16").Select
    ActiveCell.Value = "Течни суровини (вино,спирт,дестилат)"

    ActiveCell.Offset(1, 0).Value = "Зърно, грозде, слама"
    ActiveCell.Offset(2, 0).Value = "Други материали"
    ActiveCell.Offset(3, 0).Value = "Други търговски задължения (услуги)"
    ActiveCell.Offset(4, 0).Value = "Наеми и лизинг"
    ActiveCell.Offset(5, 0).Value = "Разходи за маркетинг"
    ActiveCell.Offset(6, 0).Value = "Слуебни аванси"
    ActiveCell.Offset(7, 0).Value = "Заплати"
    ActiveCell.Offset(8, 0).Value = "Осигуровки"
    ActiveCell.Offset(9, 0).Value = "Данъци"
    ActiveCell.Offset(10, 0).Value = "ДДС"
    ActiveCell.Offset(11, 0).Value = "Капиталови разходи"
    ActiveCell.Offset(12, 0).Value = "Други разходи"

    Range("E11").Select

    Workbooks.Open Filename:="C:\W13\Logistics Director.xlsx"
    Workbooks.Open Filename:="C:\W13\HR.xlsx"
    Workbooks.Open Filename:="C:\W13\Operations.xlsx"
    Workbooks.Open Filename:="C:\W13\Purchasing_1.xlsx"
    Workbooks.Open Filename:="C:\W13\Purchasing_2.xlsx"
    Workbooks.Open Filename:="C:\W13\Purchasing_3.xlsx"
    Workbooks.Open Filename:="C:\W13\Finance.xlsx"
    Workbooks.Open Filename:="C:\W13\Legal.xlsx"
    Workbooks.Open Filename:="C:\W13\Marketing.xlsx"
    Workbooks.Open Filename:="C:\W13\Bulk Sales.xlsx"
    Workbooks.Open Filename:="C:\W13\Sales Bulgaria.xlsx"
    Workbooks.Open Filename:="C:\W13\Export Sales.xlsx"
    Workbooks.Open Filename:="C:\W13\Technical.xlsx"

    ' Консолидира данните от всички файлове

    Windows("Cashflow_W13_report.xlsm").Activate

    '  Консолидира приходната част

    Selection.Consolidate Sources:=Array( _
    "'C:\W13\[Logistics Director.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[HR.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Operations.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Purchasing_1.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Purchasing_2.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Purchasing_3.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Finance.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Legal.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Marketing.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Bulk Sales.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Sales Bulgaria.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Technical.xlsx]Sheet1'!R11C5:R14C17", _
    "'C:\W13\[Export Sales.xlsx]Sheet1'!R11C5:R14C17"), Function:=xlSum

    'Консолидира разходната част

    Range("E16").Select

    Selection.Consolidate Sources:=Array( _
    "'C:\W13\[Logistics Director.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Technical.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[HR.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Operations.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Purchasing_1.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Purchasing_2.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Purchasing_3.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Finance.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Legal.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Marketing.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Bulk Sales.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Sales Bulgaria.xlsx]Sheet1'!R16C5:R28C17", _
    "'C:\W13\[Export Sales.xlsx]Sheet1'!R16C5:R28C17"), Function:=xlSum
    Cvetelina Raykova:

    Ето и как изглежда файлът:


    Cvetelina Raykova:

    Здравейте, Следвах инструкциите Ви и успях да изпълня задачата. Справих се със рейнджа (прочетох в нета как се изписва рейндж с променлива). Променливата я сложих на мястото на колоната (R11:C & col_nu) и консолидирането се отмества точно спрямо текущата седмица +1. Благодаря Ви много.

    Cvetelina Raykova:

    Прибързано се зарадвах. Като пусна кода да де изпълнява, не показва никакви грешки, но данните не се консолидират.

    Cvetelina Raykova:

    Открих си грешката. Диапазонът за консолидиране трябва да е изписан : !R11C" & col_nu & ":R14C56 Благодаря за насоките.

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

    Цветелина, отговарям на съобщенията тук. Най-напред поздравления! Няма по-ценно от това сама да откриваш грешките си и да ги решаваш! Това е опит, който придобиваш сама, ето защо е толкова ценно. В Интернет има достатъчно и полезна информация, много добре си се сетила да потърсиш. Освен това винаги можеш да ми пишеш, когато имаш въпроси или срещаш затруднения! По отношение на изпращането на файлове (attached files) чрез платформата на Аула, ще проуча как точно става и веднага ще ти пиша. Препоръчвам ти да не спираш и да продължиш със следващите уроците в курса - ще намериш много полезни неща (например как се работи с масиви - arrays). Така тази задача, която между другото е истинско предизвикателство! можеш да използваш, за да прилагаш наученото в курса и сама да намериш по-добри решения, т.е. да оптимизираш кода. Успех и смело продължавай напред!

    Cvetelina Raykova:

    Благодаря Ви. Не смятам да спирам с уроците. Просто сега ми се наложи в работата да консолидирам данни и нямах време да гледам уроците първо. Каквото научиш сам с ровене и чудене, много трудно се забравя.

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

    Цветелина, за съжаление не виждам изображението и не мога да ти отговоря