В чем проблема в последней строке кода «Выбор.Заполнено»?

#excel #vba

Вопрос:

Это код VBA Excel.

 Sub Sales_Macro()
'
' Sales_Macro Macro
'
'
    Rows("1:10").Select
    Selection.Delete Shift:=xlUp
        
    Range("E:E,H:H,K:K,N:N").Select
    Range("N1").Activate
    Selection.Delete Shift:=xlToLeft
    Selection.End(xlToLeft).Select
        
    Columns("A:A").Select
    Selection.AutoFilter
        
    ActiveSheet.Range("$A$1:$A$298").AutoFilter Field:=1, Criteria1:=Array( _
            "Accountant: ANNE", "Accountant: ANTHONY", "Accountant: BRADD", _
            "Accountant: BRIAND", "Accountant: BRIANP", "Accountant: CODY", _
            "Accountant: CYRUS", "Accountant: DAN", "Accountant: DEBBIE", "Accountant: DONNA", _
            "Accountant: EKATERINA", "Accountant: JEFF", "Accountant: JENN", _
            "Accountant: JEREMY", "Accountant: JOSEPH", "Accountant: SHEEJA123"), Operator _
            :=xlFilterValues
        
    Cells.Select
    Cells.EntireColumn.AutoFit
        
    Range("K1").Select
    ActiveCell.FormulaR1C1 = "=RC[-10]"
        
    Range("K1").Select
    Selection.FillDown
 

Я знаю, что для последней строки потребуется диапазон, чтобы не возникала ошибка «1004». Но проблема в том, что, когда я записывал макрос, чтобы получить код, не был определен диапазон. И заполненные ячейки не являются линейными. Клетки идут как K1, K22, K24 и т. Д. (потому что я использую фильтр).

Ответ №1:

Я предполагаю, что вы хотите, чтобы ваше заполнение влияло только на видимые строки после применения автофильтра. Вы не можете просто применить заполнение к набору несмежных строк, которые видны после применения автофильтра. Вы должны выполнить итерацию по каждой прямоугольной подобласти.

Во-первых, в верхней части вашей подпрограммы добавьте следующую инструкцию для объявления двух переменных, FilterRng и SubRng:

 Dim FilterRng as Range, SubRng as Range
 

Затем вместо последних четырех строк кода сделайте это, чтобы найти видимый диапазон и выполнить итерацию по областям:

  Set FilterRng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)  'Set a range of visible rows

 For Each SubRng In FilterRng.Areas    'Go through each set of contiguous rows
    SubRng(1, 11).FormulaR1C1 = "=RC[-10]"
    If SubRng.Rows.Count > 1 Then SubRng.FillDown
 Next SubRng