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

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

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

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

 
Кое от изброените съдържа само характеристики (properties) за обект Range
rows, row, columns, column, cells
row_nu, row, col_nu, columns, cells
row_nu, col_nu, cell_nu, row, cells
 
Изберете коректната инструкция, която преброява всички колони
col_nu = Range("A1").CurrentRegion.Columns.Count
col_nu = Range("A1").CurrentRegion.Column.Count

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

  • Как да оправим проблем с VBA Run time error?

    Валентина Слабакова:

    Получавам грешка при изпълнение на макроса по стъпки: run tume error 1004 Method Range of object Global failed, може ли някой да ми помогне? Благодаря предварително

    Силвия Данаилова:

    Здравейте,

    Кода, който се вижда не е причина за тази грешка. Вероятно има по-надолу команда, която я предизвиква. Като натиснете Debug ще видите реда с причината маркиран в жълт цвят. Ако искате направете снимка на другата част от кода и ще се опитам да помогна по-конкретно.

    Забелязвам обаче нещо друго:

    1. Определила сте променливи mgs_row и mgs_col, които да съдържат броят редове и колони за таблицата и съответно думите реда и колони.

      1. Обаче при определяне на съобщението в командата MsgBox сте ги записала като msg_row и msg_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

    Gergana Miteva:

    А каква е разликата в това да се активира полето за деклариране и не, ако работят и в двата случая?

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

    Когато е активна опцията Require Variable Declaration, всички променливи, които използвате в процедурата трябва да се декларират с оператор Dim. В този случай преди да се изпълни процедурата компилаторът проверява всички променливи и ако има грешка в синтаксиса (например грешно изписано име на променливата), издава съобщение за грешка. Тази проверка е много полезна както за изчистване на подобни грешки, които представляват някъде около 40% от грешките, а така също и за по-бързото изпълнение на процедурата. Ако опцията не е активна, тогава не е необходимо да декларирате променливите. Но понякога ще ви отнеме време, за да намерите грешката и процедурата да се изпълнява коректно.

  • Каква информация дава row_nu и col_nu при дефиниране на Range за изчистване на форматиране

    Емилия Димитрова:

    Здравейте, бих искала да попитам дали разбирам правилно идеята. Последната процедура, която се изпълнява изисква от нас да зададем начална и крайна клетка. Клетката с координати (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). Използването на променливи прави по-гъвкав кода, т.е. става универсален и може да се прилага за диапазони с различен брой редове и колони. Но това показвам в следващите уроци.

    Емилия Димитрова:

    Благодаря Ви. С Ваша помощ успях да си го обясня.

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

    Продължавайте напред и ако имате въпроси, пишете!