Получавам грешка при изпълнение на макроса по стъпки: run tume error 1004 Method Range of object Global failed, може ли някой да ми помогне? Благодаря предварително
Здравейте,
Кода, който се вижда не е причина за тази грешка. Вероятно има по-надолу команда, която я предизвиква. Като натиснете Debug ще видите реда с причината маркиран в жълт цвят. Ако искате направете снимка на другата част от кода и ще се опитам да помогна по-конкретно.
Забелязвам обаче нещо друго:
Определила сте променливи mgs_row и mgs_col, които да съдържат броят редове и колони за таблицата и съответно думите реда и колони.
По този начин данни за броят редове и колони няма да получите, защото в съобщението използвате празни променливи.
Препоръчвам ви при писането на макроси да използвате опцията Option Explicit. Тя предпазва от подобни технически грешки, тъй като не позволява изпълняването на макрос ако не са дефинирани всички променливи. Също така не позволява дефиниране на променливи с едно и също име.
Опцията Option Explicit може да се зададе като се напише в полето Declarations Option Explicit - показала съм на първата картинка къде се намира полето Declarations.
На втората картинка съм показала как се задава тази опция да се включва автоматично за всеки макрос без да е необходимо да се записва ръчно. Автоматичното й добавяне е валидно за създадените след включването й макроси.
Здравейте, кода е следния:
Sub RowsColumnsCells_New()
row_nu = Range("D7").CurrentRegion.Rows.Count
col_nu = Range("D7").CurrentRegion.Columns.Count
cell_nu = Range("D7").CurrentRegion.Cells.Count
msg = "Таблицата има" msg_row = row_nu & " реда" msg_col = col_nu & " колони" msg_cell = cell_nu & " клетки"
MsgBox msg & vbNewLine & msg_row _ & vbNewLine & msg_col & vbNewLine & msg_cell
Range(Cells(7, 4), Cells(row_nu + 6, col_nu + 3)).ClearFormats
End Sub
т.е. под последния ред е само End Sub, но аз промених настройките както е показано и се получи. Имам един въпрос, как разбрахте, че променливите са празни? Тук: "Забелязвам обаче нещо друго: Определила сте променливи mgs_row и mgs_col, които да съдържат броят редове и колони за таблицата и съответно думите реда и колони. Обаче при определяне на съобщението в командата MsgBox сте ги записала като msg_row и msg_col. По този начин данни за броят редове и колони няма да получите, защото в съобщението използвате празни променливи." Благодаря за помощта отново!
Здравейте, радвам се че нещата са се получили с новия код :)
Относно въпросът ви - вижда се, че променливите са празни, тъй като никъде не бяхте написала mgs_row = ..... и m*gs*_col = ....., т.е. те не съдържат нищо.
След като първия код (на снимката) няма други команди, а в новия сте променила само областта на данните и имената на променливите, то сега се сещам, че възможна причина за показалата се грешка може да бъде ако в един или няколко от следващите редове сте записала "А2" с А на кирилица...
row_nu = Range("A2").CurrentRegion.Rows.Count
col_nu = Range("A2").CurrentRegion.Columns.Count
cell_nu = Range("A2").CurrentRegion.Cells.Count
Ако сте натиснала Debug бутона при появата на грешката в първия код, бихте ли ми казала кой ред се оцвети в жълто (добре ще е да се разбере конкретната причина за появата на грешката в първия код, за да се избягва в бъдеще)?
Здравейте, моят код е зададен по същия начин, но броят на преброените колони/редове/клетки е единица.
row_nu = Range("A1").CurrentRegion.Rows.Count col_nu = Range("A1").CurrentRegion.Columns.Count Cells_nu = Range("A1").CurrentRegion.Cells.Count
Благодаря предварително.
По всяка вероятност Range("A1") е празна клетка над диапазона, за който искате да преброите редовете. Дефинирайте клетка вътре в диапазона, за да използвате CurrentRegion. В примера на Силвия - Range("A2"), a на Валентина - Range("D7"), докато при Вас е Range("A1").
Здравейте, впоследствие открих проблема. Бях го записала така, че да се изпълнява в Sheet, който е празен. Благодаря ви за разяснението!
Здравейте, в редактора на VBA е активна опцията Да се декларират променливите. Може да проверите в редактора на VBA изберете команда Tools--> Options
Има отметка, което означава, че задължително променливите трябва да се декларират
За да тествате примера, махнете отметката и изтрийте Option Explicit , първият ред в началото на модула. В следващите уроци става ясно за какво се използва Option Explicit
А каква е разликата в това да се активира полето за деклариране и не, ако работят и в двата случая?
Когато е активна опцията Require Variable Declaration, всички променливи, които използвате в процедурата трябва да се декларират с оператор Dim. В този случай преди да се изпълни процедурата компилаторът проверява всички променливи и ако има грешка в синтаксиса (например грешно изписано име на променливата), издава съобщение за грешка. Тази проверка е много полезна както за изчистване на подобни грешки, които представляват някъде около 40% от грешките, а така също и за по-бързото изпълнение на процедурата. Ако опцията не е активна, тогава не е необходимо да декларирате променливите. Но понякога ще ви отнеме време, за да намерите грешката и процедурата да се изпълнява коректно.
Здравейте, бих искала да попитам дали разбирам правилно идеята. Последната процедура, която се изпълнява изисква от нас да зададем начална и крайна клетка. Клетката с координати (1,1) e началото на работния лист(понеже таблицата ни започва от A1). Row_nu и col_nu винаги ли задават последната клетка в последната колона? ( в случая D22) Задавам въпроса така, понеже предварително не сме присвоили координати за row_nu и col_nu, а тяхната роля реално е да връщат просто общ брой. В правилна насока ли разсъждавам?
Здравейте, правилно разбирате идеята, но пропускате малки детайли. Двете променливи, row_nu и col_nu съхраняват стойностите за брой редове и брой колони, след като се изпълни съответната инструкция (Rows.Count и Columns.Count). По този начин присвоявам стойности (координати) на двете променливи. Съобщението показва стойностите: row_nu = 22, a col_nu=4. Ето защо клетка Cells(row_nu,col_nu) определя последната, най-долна дясна клетка на обект Range, a началото е клетка А1 или Cells(1,1). Обект Range се дефинира с две клетки: например, най-горната лява клетка Cells(1,1) и най-долната дясна клетка Cells(row_nu,col_nu). Използването на променливи прави по-гъвкав кода, т.е. става универсален и може да се прилага за диапазони с различен брой редове и колони. Но това показвам в следващите уроци.
Благодаря Ви. С Ваша помощ успях да си го обясня.
Продължавайте напред и ако имате въпроси, пишете!
Да, разбрах къде е грешката. Нямам интервал пред долното подчертаващо тире след & msg_row _
Точно така, това е причината. Успех!