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

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

Здравейте,

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

Като използвам колона АМ за начална колона в редовете от 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.Трябва да видите кода.


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

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


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

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

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

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

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


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

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