Вставить (динамическую) формулу поиска в динамическое число столбцов - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть лист "2018" и "2019", который я создал ранее. 2019 отличается от 2018 только тем, что в него могут быть добавлены некоторые строки и / или некоторые удалены. Сформируйте ячейку "A3" и ниже, у меня есть перечисленные навыки и "X" в столбцах после того, если этот навык принадлежит человеку, которому принадлежит столбец.

Теперь мне нужно заполнить столбцы 2019 года известным X с формулой ниже, сначала немного кода контекста для части выбора диапазона:

Dim rng As Range
Dim rngbegin As Range
Dim rngend As Range
Dim newrng As Range

Sheets("2018").Activate

   Set rng = Application.InputBox '...and rest of the code

rng.Copy
Sheets("2019").Range("B:B").Insert Shift:=xlToRight

Sheets(2019).Activate
Set rngbegin = rng.Cells(3, 1)
Set rngend = rng.Cells(3000, rng.Columns.Count)
Set newrng = Range(rngbegin.Address & ":" & rngend.Address)
newrng.ClearContents 'To clear everything in the difined range but the headder rows

Вот формула, которую я мог бы использовать, если бы столбцы не менялись.

Range("B3").Select
ActiveCell.Formula = "=IFERROR(LOOKUP(2,1/($A3='2018'!$A$3:D$5000),'2018'!$B$3:$B$5000),"")"
    Range("B2").AutoFill Destination:=Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row)

Формула работает, но у меня есть следующие проблемы:

1 - Обязательно ) Я не могу жестко задать формулу для каждого столбца, поскольку количество столбцов может измениться. (Я сохраняю количество столбцов в качестве диапазона var, выбранного пользователем через application.inputbox - вот как я вставил столбцы в новый лист 2019 года)

2 - необязательно) Я жестко закодировал строки в намного большее число, чем используется, потому что я не счел нужным подсчитать столбец A, а затем использовал range.count.Address (?) В качестве конца вектора поиска. Просто пришла мне в голову LOL

1 Ответ

0 голосов
/ 12 ноября 2018

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

Sub Whatever()

With Sheets("2018")

    ' Get the address of the old range, not used later in the macro
    iRows = .Cells(Rows.Count, 1).End(xlUp).Row
    iCols = .Cells(3, Columns.Count).End(xlToLeft).Column
    Set rngOld = Range(.Cells(3, 2), .Cells(iRows, iCols))

End With

With Sheets("2019")

    ' Get the address of the new range
    iRows = .Cells(Rows.Count, 1).End(xlUp).Row
    iCols = .Cells(2, Columns.Count).End(xlToLeft).Column

    Set rngNew = Range(.Cells(3, 2), .Cells(iRows, iCols))

    'Clear the new range
    rngNew.Clear

    ' Populate the formula
    ' Not very elegant, VBA solution would probably look nicer
    .Range("B3").Formula = "=IFERROR(if(LOOKUP(2,1/('2018'!$A$3:$A$" & iRows & " =$A3),'2018'!B$3:B$" & iRows & ")=""X"",""X"",""""),"""")"

    'Fill the formula
    Set rngTemp = .Range(.Cells(3, 2), .Cells(3, iCols))
    rngTemp.FillRight
    Set rngTemp = .Range(.Cells(3, 2), .Cells(iRows, iCols))
    rngTemp.FillDown

End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...