Защо макросът не работи?

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

Каква грешка правя?

Здравейте Валентина, Нека най-напред да уточня дали съм разбрала правилно логиката на програмата. Програмата трябва да изтрие съдържанието на даден диапазон (обект Range). За тази цел с променливата last_row определяте последния ред. След това за всяка клетка (rng) изтривате съдържанието. Според мен е излишно да се избира клетката (Select), а след това да се изтрива. Достатъчно е обектът да се дефинира правилно и след това да се зададе команда (method). Блок-операторът With ... End With също не е необходимо да се повтаря.

Ето моето предложение:

Sub Delete_Content_New()

Dim sht As Worksheet Dim rng As Range Dim last_row As Long Dim i, j

For Each sht In ActiveWorkbook.Worksheets sht.Activate

i = 2 j = 4

last_row = Range("A1048576").End(xlUp).Row

For Each rng In Range(Cells(i, j), Cells(last_row, j)).Cells rng.ClearContents rng.Offset(0, 2).ClearContents

Next rng

End Sub

Надявам се, да свърши работа. Ако имате още въпроси, пишете ми.

Здравейте и благодаря за отговора, имам два въпроса, защо обявяваме втори път sht тук: For Each sht In ActiveWorkbook.Worksheets SHT.Activate И защо използваме два пъти Clear Content тук: For Each rng In Range(Cells(i, j), Cells(last_row, j)).Cells rng.CLEARCONTENTS rng.Offset(0, 2).ClearContents? Благодаря предварително!

При копиране инструкциите се разместват, а аз не съм обърнала внимание. Ето каква е последователността:

Sub Delete_Content_New()

Dim sht As Worksheet

Dim rng As Range

Dim last_row As Long

Dim i, j

For Each sht In ActiveWorkbook.Worksheets

sht.Activate '==> всеки лист от колекцията Worksheets трябва да се активира

i = 2

j = 4

last_row = Range("A1048576").End(xlUp).Row

For Each rng In Range(Cells(i, j), Cells(last_row, j)).Cells

rng.ClearContents

rng.Offset(0, 2).ClearContents '==> изтрива съдържанието за още една клетка !!!

Next rng

End Sub

Надявам се сега вече да е по-ясно! Но ако имате въпроси пишете!

Здравейте и благодаря, имам още един въпрос, защо отново използваме командата CELLS с главни букви? For Each rng In Range(Cells(i, j), Cells(last_row, j)).CELLS Благодаря предварително!

Имам още един въпрос, как мога да направя макро да тествам vlookup от друг файл с ежедневно променящо се име?

Обект Range дефинира диапазон, а диапазонът се дефинира с 2 две клетки. Например: Range("A1:B10"). Във VBA може да дефинирате диапазон като се включи и обект CELLS, например: Range(Cells(1,1), Cells(10,2). Във макроса Range(Cells(i,j), Cells(last_row,j)). След точката CELLS определя колекцията (Collection), която се съдържа в дефинирания вече обект Range, защото обект Range има и други колекции ROWS, COLUMNS и т.н. Прегледайте още веднъж урок 7 от модул 3.

Благодаря!

Прав е Цукев, че от Въпроси и отговори също се научава, даже повече.

Благодаря за интересния урок! А защо намираме последната клетка с Range("A1048576").End(xlUp).Row вместо с: Range("a1").End(xlDown).Select last_row = ActiveCell.Row

Здравей Деница Григорова, няма значение с коя от двете команди ще търсим последния ред, според мен. Поздрави


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

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