Условное извлечение данных с использованием динамического диапазона

#excel #vba

Вопрос:

Я должен скопировать диапазон данных из нескольких столбцов на основе совпадения имени ячейки с именем листа. Однако диапазон данных для каждого идентификатора в столбце «A» не одинаков, в случае некоторого совпадающего имени листа у нас есть 30 данных, а в некоторых случаях у нас может быть 20 данных или любое другое значение. Мой текущий код позволяет мне извлекать данные из листа «объединение» в листы шаблонов, имеющие совпадающее имя листа. Вместо извлечения 30 данных с использованием смещения из диапазона соответствия как я могу сделать код динамичным и извлечь данные на основе измененного имени листа в столбце A (после каждого имени скважины есть несколько пустых ячеек до следующего имени в столбце «A», которое необходимо учитывать при разработке кода VBA), скопировать данные, соответствующие этому имени, из столбцов M и S и вставить в листы шаблонов в столбцы E и G на основе совпадающего имени листа. В настоящее время я могу извлекать данные только из одного столбца, код необходимо динамически обновлять:

 Sub SPT()
Dim wkSht As Worksheet
Dim cell As Range

For Each cell In Sheets("Combine").Range("A5:A116").Cells

    For Each wkSht In ThisWorkbook.Worksheets
    
        If cell.Value = wkSht.Name Then
       
            Sheets("Combine").Range(cell.Offset(0, 12), cell.Offset(29, 12)).Copy wkSht.Range("G22")
        End If
    
    Next wkSht

Next cell
End Sub
 

Извлечение Данных

Комментарии:

1. Итак , если всегда копировать 12 строк из main sheet , в чем проблема для copy paste ? Потому что не будет никаких проблем скопировать одну и ту же строку, даже содержащую пустое значение.

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

Ответ №1:

Процесс копирования и вставки будет смещен в зависимости от значения ячейки Col H , пожалуйста, протестируйте и запустите его, спасибо:

 Sub SPT()
Dim wkSht As Worksheet
Dim cell As Range
Dim lastrow As Long, blankRow As Long, offsetRow As Long

lastrow = Sheets("Combine").UsedRange.Rows.Count

For Each cell In Sheets("Combine").Range("A2", "A" amp; lastrow).Cells

    For Each wkSht In ThisWorkbook.Worksheets
    
        If cell.Value = wkSht.Name Then
        
            If cell.End(xlDown).Row > lastrow Then
                blankRow = lastrow
            Else
                blankRow = cell.End(xlDown).Row - 1
            End If
            
            offsetRow = Application.WorksheetFunction.RoundDown(Sheet1.Cells(blankRow, 8).Value, 0)
            Sheets("Combine").Range(cell.Offset(0, 12), cell.Offset(offsetRow, 12)).Copy wkSht.Range("G22")
            Sheets("Combine").Range(cell.Offset(0, 18), cell.Offset(offsetRow, 18)).Copy wkSht.Range("E22")
        End If
    
    Next wkSht

Next cell
End Sub
 

Предположим, что ваше последнее имя листа в Col A строке 14, а ниже пустые данные

введите описание изображения здесь

Когда вы используете сочетание клавиш ctrl down arrow key , оно перейдет в строку 1mil, так как я знаю , что такая ситуация произойдет, но я не хочу ее получать row 1mil , поэтому я установлю blankRow = lastrow(i.e. 20)

введите описание изображения здесь

Комментарии:

1. Вместо того, чтобы фиксировать строки смещения от 0 до 29, мы должны сделать его динамичным и зависящим от значения ячейки «A». например, 1-е имя совпадения начинается с A2, второе-с A15, а третье-с A26. в этом случае строки смещения, соответствующие названиям листов BH1, BH2 и BH3, будут от 0 до 14, от 0 до 11 и от 0 до 10 (последнее значение диапазона). Как это может быть материализовано: ссылка

2. хорошо, я понимаю вашу точку зрения, позвольте мне попробовать разобраться в этом, не так уж много проблем.

3. Вы можете проверить мой отредактированный ответ, он должен работать должным образом в соответствии с вашими ожиданиями

4. Он не работает для последнего совпадения, так как после ввода данных под ним есть пустые ячейки. Однако, к чему относится используемый диапазон? Также я не понимаю следующую часть кода: If cell.End(xlDown). Строка > последняя строка, Затем Пустая строка = последняя строка, Еще пустая строка = ячейка.Конец(xlDown). Строка — 1 Заканчивается, Если Смещение = Применение. Функция рабочего листа. Округление(Лист1. Ячейки(пробел, 8).Значение, 0)

5. Пожалуйста, потратьте время на исследование, так как все объяснения кода можно найти в Интернете… Что касается вашего последнего матча, я понятия не имею о том, что вы можете вручную изменить его или внести коррективы, и я думаю, что сейчас закрою дело, спасибо.