Нахождение максимальной даты из диапазона «Поиск» - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть множество калибровочных тестов. Я храню все разные типы и их даты на одном листе "wsCAL"

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

Теоретически, я хочу, чтобы VBA перешел к wsCAL, посмотрел по столбцу C и нашел все экземпляры одного типа теста, нашел самую последнюю дату (или MAX) в столбце B этих экземпляров, а затем заполнил мою пользовательскую форму этой датой. ,

Я пытался использовать функцию rangeCAL = .Find (), чтобы найти все экземпляры тестового типа в столбце C. Эта часть прекрасно работает. Однако application.worksheetfunction.Max (rangeCAL), который я пытаюсь использовать, не удается. Я предполагаю, что это потому, что эта функция приложения работает только с диапазонами листа, а не с Find (). Я пытаюсь взять мои ячейки rangeCAL, создать массив, а затем найти самую последнюю дату (МАКС) из них.

Private Sub UserForm_Initialize() 'Upon opening the userform

    Set wb = ThisWorkbook
    Set wsHOME = wb.Worksheets("Home")
    Set wsCAL = wb.Worksheets("Bottle Calibrations")
    Set wsC1T1 = wb.Worksheets("C1T1")

    'Last Calibration Date      
        Label27.Caption = vbNullString
        With wsCAL
        Dim Cell As Range
        Dim myArray As Date
        Dim i As Integer
        Dim rangeCAL As Range
        Dim rangeDateCAL As Date

        i = 0
        Set rangeCAL = Range("C:C").Find(What:=tank, LookAt:=xlWhole)
            If Not rangeCAL Is Nothing Then
                For Each Cell In rangeCAL
                    myArray(i) = .Range(rangeCAL.Row, "A").Value
                    i = i + 1
                Next
            Else
                MsgBox "Error: no previous Calibration dates loaded."
            End If
            rangeDateCAL = Application.WorksheetFunction.Max(myArray)
            rangeDateCAL = Format(rangeDateCAL, "yymmdd")

    End With
    Label27.Caption = rangeDateCAL

Я получаю сообщение об ошибке

«Ожидаемый массив»

, как только я доберусь до строки:

myArray(i) = .Range(rangeCAL.Row, "B").Value

ОБНОВЛЕНИЕ:

Label27.Caption = vbNullString
With wsCAL
    Dim Cell As Range
    Dim myArray(1 To 5) As Date
    Dim i As Long
    Dim temp As Date
    Dim rangeCAL As Range
    Dim rangeDateCAL As Date

    i = 1
    Set rangeCAL = wsCAL.Range("C1", Range("C1").End(xlDown).Address)
        For Each Cell In rangeCAL
            If Cell <> "" Then
                If Cell.Value = tank Then
                    temp = wsCAL.Cells(Cell.Row, "B").Value
                    myArray(i) = temp
                    i = i + 1

                End If
            End If
        Next

    rangeDateCAL = Application.WorksheetFunction.Max(myArray)
    rangeDateCAL = Format(rangeDateCAL, "yymmdd")

End With

    Label27.Caption = rangeDateCAL

Я внес это изменение после прочтения ваших комментариев,Этот код выполняется, но он заполняет Label27.Caption с помощью 11/22/4613 вместо предполагаемого 11/7 / 2019.

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

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019
For Each Cell In rangeCAL
    If Cell.Text <> vbNullString Then
        If Cell.Text = tank Then 'assuming tank is declared a string
            If tempDate < wsCAL.Cells(Cell.Row, "B").Value Then
                tempDate = wsCAL.Cells(Cell.Row, "B").Value
            End If
        End If
    End If
Next

Label27.Caption = Format(tempDate, "yymmdd")
0 голосов
/ 08 ноября 2019

Это то, что я реализовал, согласно предложению SmileyFTW. Гораздо проще, чем ожидалось. Работает, как задумано, хотя. Спасибо SmileyFTW и другим, кто прокомментировал с помощью.

Label27.Caption = vbNullString
With wsCAL
    Dim Cell As Range
    Dim i As Date
    Dim temp As Date
    Dim rangeCAL As Range

    temp = 0
    Set rangeCAL = wsCAL.Range("C1", Range("C1").End(xlDown).Address)
        For Each Cell In rangeCAL
            If Cell <> vbNullString Then
                If Cell.Value = tank Then
                    i = wsCAL.Cells(Cell.Row, "B").Text
                    If i > temp Then
                        temp = i
                    End If

                End If
            End If
        Next
End With
Label27.Caption = temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...