#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. Пожалуйста, потратьте время на исследование, так как все объяснения кода можно найти в Интернете… Что касается вашего последнего матча, я понятия не имею о том, что вы можете вручную изменить его или внести коррективы, и я думаю, что сейчас закрою дело, спасибо.