Сравнение и выбор диапазонов основаны на самой последней дате чтения VBA

Я работаю над книгой Excel, в которой пользователь импортирует текстовые файлы в «Лист импорта данных», количество импортированных текстовых файлов является динамическим. См. Изображение. введите описание изображения здесь

Итак, вот что мне нужно сделать

1) Необходимо найти самую последнюю дату показаний (в этом примере 2016)

2) Необходимо скопировать и вставить диапазон значений глубины самой последней даты чтения на отдельный лист (в этом примере я хотел бы скопировать и вставить значения 1-17.5.

3) Необходимо проверить, содержат ли все другие наборы данных тот же самый диапазон значений глубины. В течение 2014 года вы можете видеть, что его глубина идет от 0,5 до 17,5. Я хочу, чтобы иметь возможность просто скопировать данные в диапазоне самой актуальной даты чтения, поэтому диапазон 1-17,5.

Вот мой код, чтобы найти самую последнюю дату чтения и скопировать эти глубины на другие листы.

Sub Copy_Depth() Dim dataws As Worksheet, hiddenws As Worksheet Dim tempDate As String, mostRecentDate As String Dim datesRng As Range, recentCol As Range, headerRng As Range, dateRow As Range, cel As Range Dim lRow As Long Dim x As Double Set dataws = Worksheets("Data Importation Sheet") Set hiddenws = Worksheets("Hidden2") Set calcws = Worksheets("Incre_Calc_A") Set headerRng = dataws.Range(dataws.Cells(1, 1), dataws.Cells(1, dataws.Cells(1, Columns.Count).End(xlToLeft).Column)) 'headerRng.Select For Each cel In headerRng If cel.Value = "Depth" Then Set dateRow = cel.EntireColumn.Find(What:="Reading Date:", LookIn:=xlValues, lookat:=xlPart) Set datesRng = dataws.Cells(dateRow.Row + 1, dateRow.Column) 'datesRng.Select ' Find the most recent date tempDate = Left(datesRng, 10) If tempDate > mostRecentDate Then mostRecentDate = tempDate Set recentCol = datesRng End If End If Next cel Dim copyRng As Range With dataws Set copyRng = .Range(.Cells(2, recentCol.Column), .Cells(.Cells(2, recentCol.Column).End(xlDown).Row, recentCol.Column)) End With hiddenws.Range(hiddenws.Cells(2, 1), hiddenws.Cells(copyRng.Rows(copyRng.Rows.Count).Row, 1)).Value = copyRng.Value calcws.Range(calcws.Cells(2, 1), calcws.Cells(copyRng.Rows(copyRng.Rows.Count).Row, 1)).Value = copyRng.Value Worksheets("Incre_Calc_A").Activate lRow = Cells(Rows.Count, 1).End(xlUp).Row x = Cells(lRow, 1).Value Cells(lRow + 1, 1) = x + 0.5 End Sub 

Любые советы / помощь будут очень признательны. Я довольно новичок в VBA и не знаю, как идти о сравнении диапазонов глубин! Заранее спасибо!

Предполагая, что ваши наборы данных так же регулярно организованы, как показывает ваш скриншот, в Excel может быть сделано довольно много обработки.

На приведенном ниже рисунке показан возможный подход, основанный на данных, приведенных в вашем примере.

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

Подход использует тот факт, что каждый набор данных занимает 7 столбцов на листе импорта. Функция =ADDRESS() используется для построения текстовых строк, которые выглядят как адреса ячеек, и они дополнительно обрабатываются для создания текстовых строк, которые выглядят как адреса диапазонов. Подход также предполагает, что дата чтения всегда находится в третьей строке после последней строки данных глубины.

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

Этот подход был взят, поскольку из вопроса не ясно, что произойдет, если, скажем, набор данных имеет значения глубины, начиная с 1,5 (так больше первого значения для последней даты чтения) или заканчивая на 17 (так меньше, чем последнее значение для последней даты чтения). Очевидно, что этот подход может быть адаптирован, если эти возможности никогда не произойдут.

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

Дополнительный бит ответа

Изображение выше может быть настроено как «вспомогательный» рабочий лист. Если на листе данных импортируется столько же наборов данных, то настройте этот вспомогательный лист так, чтобы количество строк в таблице 2 равно этому количеству наборов данных. Если количество наборов данных является переменным, то настройте вспомогательный лист так, чтобы количество строк в таблице 2 было равно максимальному количеству наборов данных, которые когда-либо будут встречаться. В этой ситуации, когда количество импортированных данных меньше этого максимума, некоторые строки таблицы 2 не будут использоваться, и эти неиспользуемые строки будут содержать бессмысленные значения в некоторых столбцах.

Ваша программа VBA должна быть организована для чтения значения в значении в cell D2 справочного листа, а затем использовать это, чтобы определить, сколько строк таблицы 2 нужно изучить вместе с остальной частью вашего кода VBA. Это будут неиспользуемые строки (если они есть), которые нужно игнорировать.

Если ваш код VBA идентифицирует значение, скажем 10, в cell D2 вспомогательного листа, тогда вы захотите, чтобы ваш код читал один раз 10 значений в диапазоне Q12:Q21 (так в цикле). Каждая из этих ячеек содержит в качестве строки диапазон, содержащий значения одного набора данных, и поэтому может быть присвоен объекту Range с использованием кода, такого как

 Set datasetRng = Range(datasetStr) 

где datasetStr – текстовая строка, считанная из ячейки в Q12:Q21 .

Все еще внутри цикла, datasetRng затем может быть скопирован и вставлен на ваш рабочий лист.

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

Принятый подход максимально использует Excel для определения соответствующей информации о импортированных наборах данных и суммирует эту информацию на вспомогательном листе. Это означает, что VBA можно ограничить автоматизацией операций копирования / вставки на наборах данных и считывать информацию со вспомогательного листа при определении того, что нужно копировать для каждого набора данных.

Конечно, можно делать все в VBA, но, как вы указали, что вы были довольно новы для VBA, казалось разумным склонить баланс к использованию меньше VBA и большего количества Excel.

Кстати, проблема сравнения диапазонов глубины на самом деле не одна из Excel или программирования, это один из анализов – то есть, глядя на ряд случаев, выясняя, что должно произойти для каждого случая, и перегоняя это в набор обработки правил (что некоторые вызовут алгоритм). Только тогда должны быть предприняты попытки реализовать эти правила обработки (либо с помощью формулы Excel, либо кода VBA). Я намекнул на мой анализ проблемы (поиск общего диапазона значений глубины во всех наборах данных), и вы должны иметь возможность отслеживать, как я это сделал в Excel, чтобы удовлетворить случаи, когда некоторые наборы данных могут содержать значения глубины, которые меньше чем минимум общего диапазона или превышающий его максимальный (или, возможно, оба).

Конец дополнительного бита

Используемая формула показана в таблице ниже.

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

Давайте будем гением компьютера.