EXCEL-VBA Возвращает наибольшее значение из функции поиска из текстового файла VBA. - PullRequest
0 голосов
/ 08 мая 2018

Вот проблема:

-У меня есть текстовый файл, который содержит много данных, но мне нужно извлечь строку, содержащую строку "давление: (значения)" .В файле много этой строки, и я хотел извлечь самые высокие значения после нажатия слова.Вот некоторые примеры содержимого файла: - давление: 10.1101 - давление: 20.1102 - давление: 20.1020

Число появлений «давление:» не фиксировано.

У меня уже есть рисунокнекоторые необходимые функции, чтобы сделать это (просто скопировал и отредактировал некоторый скрипт, найденный в сети).Но я не знаю, как сохранить совпадающие значения (возможно, сохранить в массиве?), А затем применить функцию max, чтобы вернуть наибольшее значение.Буду признателен за любой вклад.

Другой подход для достижения желаемой задачи также приветствуется.

Вот мой сценарий:

Sub search()
Const ForReading = 1
Dim FSO, FileIn, strTmp

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileIn = FSO.OpenTextFile("D:\data.txt", ForReading)

Do Until FileIn.AtEndOfStream
    strTmp = FileIn.ReadLine
    If Len(strTmp) > 0 Then 'read if not blank
        If InStr(1, strTmp, "pressure:", vbTextCompare) > 0 Then 'find function
            x = Mid(strTmp, 10, 7) 'to extract the numeric values only
            MsgBox x 'just for checking if value of x is correct

            'add function that will return the highest value
            'WorksheetFunction.Max (x)

        End If

    End If
Loop

FileIn.Close

End Sub

1 Ответ

0 голосов
/ 08 мая 2018

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

Вот ваш код, подвергнутый рефакторингу с исправлением нескольких других незначительных проблем (изменения помечены <---)

Sub search()
    Const ForReading = 1
    '<--- Use specific data types rather than variant
    Dim FSO As Object
    Dim FileIn As Object
    Dim strTmp As String
    Dim KeyWord As String
    Dim i As Long, j As Long
    Dim x As Double
    Dim MaxX As Double

    MaxX = -4.94065645841247E-324 '<-- initialise to lowest possible value
    KeyWord = "pressure:" ' <--- generalise the function
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FileIn = FSO.OpenTextFile("D:\data.txt", ForReading)

    Do Until FileIn.AtEndOfStream
        strTmp = FileIn.ReadLine
        If Len(strTmp) > 0 Then 'read if not blank
            i = InStr(1, strTmp, KeyWord, vbTextCompare)
            If i Then  'find function
                ' <-- cope with possibility Pressure is not at start of string 
                '     and may have trailing data
                strTmp = Trim$(Mid$(strTmp, i + Len(KeyWord)))
                i = InStr(strTmp, " ")
                If i Then
                    strTmp = Trim$(Left$(strTmp, i - 1))
                End If
                x = Val(strTmp) 'to extract the numeric values only
                MsgBox x 'just for checking if value of x is correct

                'add function that will return the highest value
                If x > MaxX Then MaxX = x
            End If

        End If
    Loop

    FileIn.Close
    MsgBox "Max presseure is " & MaxX
End Sub
...