Получение нескольких ошибок с использованием ИЛИ с Cells.Find - Требуется объект RTE424, Несоответствие типов RTE13, Не установлена ​​переменная блока E91 - PullRequest
0 голосов
/ 08 октября 2019

Это мой первый ТАК вопрос, поэтому извиняюсь, если я перейду за борт со Стеной текста / Отсутствие актуальной информации.

Я поддерживаю Macro Excels, созданный бывшим сотрудником для P & L от Market and Sales Rep. Они извлекают данные из других пакетов, которые теперь различаются по формату из-за разных используемых версий. Существует также франкоязычный рынок. Все работает только на английском языке (только), но теперь они хотят, чтобы был включен рынок на французском языке.

Я извлекаю значение из ячейки в нескольких внешних файлах, которые не исправлены, кроме как сопровождающим текстом надписи. Используя Cells.Find, я ищу английскую фразу и активирую соседнюю ячейку, чтобы скопировать это значение в основной Excel. Это работает.

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

Что не так с этим кодом?

Sub FindMonthlyValues(ByVal varFile As String, ByRef MonthlyProfitLine As String, ByRef MonthlyTonnageLine As String, ByRef MonthlyTripNumberRange As String)

    Dim CurrentPnL, CurrentPath As String
    Dim k, FirstRow, LastRow As Integer
    Dim ProfitEn, ProfitFr As Range    

    'loop through excel files only
    Application.ScreenUpdating = False

    CurrentPnL = varFile

    k = InStr(CurrentPnL, "[") 'find the end position of the default link
    CurrentPath = Left(CurrentPnL, k - 1)
    CurrentPnL = Replace(CurrentPnL, "[", "")
    CurrentPnL = Replace(CurrentPnL, "]", "")

    ChDir _
        CurrentPath
    Workbooks.Open FileName:= _
        CurrentPnL

    ' Find Monthly Profit Line in Initial sheet
    Sheets("Initial").Select
    Range("A1:AK1").Select
    Set ProfitFr = Cells.Find(What:="PROFIT MENSUEL:", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Value

    If ProfitFr Is Nothing Then
        Set ProfitEn = Cells.Find(What:="Monthly Profit:", After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False).Value
    End If

    Cells.FindNext(After:=ActiveCell).Activate
    ActiveCell.Offset(, 1).Select
    MonthlyProfitLine = ActiveCell.Address

Я пробовал три разных решения StackOverflow, но они приводят к кругу разных ошибоккак определено в заголовке.

Я не вижу Option Explicit в секции кода, которую я изменяю.

Я попытался установить Dim для новых переменных, чтобы держать фразунайдено.

Я попробовал Set [DimName] = Cells.Find(BLAH).Value из оригинального (и функционального) Cells.Find(BLAH).Activate.

Я попробовал If [DimName] Is Nothing Then, но это не имеет значения для ошибок, которыепроизошло в первый Cells.Find.

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

Я пытался сповесив Dim от Range до String, но получим только:

"Объект не определен."

1 Ответ

1 голос
/ 08 октября 2019

Ваш код выиграл бы от того, что его части были бы преобразованы в автономные подфункции / функции, которые включают в себя некоторые специфические функции.

Нахождение текста в диапазоне является одним из очевидных кандидатов для этого:

Sub Tester()

    Dim f As Range

    Set f = FindFirst(ActiveSheet.Columns(1), Array("PROFIT MENSUEL:", "Monthly Profit:"))

    If Not f Is Nothing Then
        Debug.Print "Found:" & f.Offset(0, 1).Value
    Else
        Debug.Print "No match"
    End If

End Sub


'Find the first value in What in the range rngSearch
'   Returns Nothing if not matches found
Function FindFirst(SearchWhere As Range, FindWhat) As Range
    Dim f As Range, s
    For Each s In FindWhat
        Set f = SearchWhere.Find(What:=s, lookat:=xlPart, _
                     SearchDirection:=xlNext, MatchCase:=False)
        If Not f Is Nothing Then
            Set FindFirst = f
            Exit For
        End If
    Next s
End Function

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

Кроме того, посмотрите, можете ли вы включить приведенные здесь рекомендации в свой код: Как избежать использования Select в Excel VBA

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