Application.Goto с активной ошибкой файла - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь запустить код, который был запущен кем-то другим, и я получаю ошибку во время выполнения. В последних двух строках

Sub calculateCompositions()

    Set prodProfilesSheet = Workbooks("Production Profiles (revised).xlsb").Sheets("Ref Compr - Wells")

    Set fluidCompSheet = Workbooks("Production Profiles (revised).xlsb").Sheets("Well Base Compositions")

    Set flashCalcSheet = Workbooks("Production Profiles (revised).xlsb").Sheets("Well Base Compositions")

    total_columns = prodProfilesSheet.Range("C1").CurrentRegion.Columns.Count

    c = ActiveCell.CurrentRegion.Column

    numberOfRowsInRegion = ActiveCell.CurrentRegion.Rows.Count
    numberOfheaderRows = 6
    numberOfDataRows = numberOfRowsInRegion
    firstDataRow = ActiveCell.Row

    Do While c < total_columns
    fluidCompSheet.Range("L2").Value = current_well_name
    compositionName = fluidCompSheet.Range("O1").Value
    fluidCompSheet.Range("O3:O32").Copy
    flashCalcSheet.Range("I8").PasteSpecial Paste:=xlPasteValues, 
    Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False   
    If current_well_name = "Existing wells" Then 
    Exit Do
    For r = firstDataRow To firstDataRow + numberOfDataRows

  prodProfilesSheet.Cells(r - 5, c).Activate
  Application.Goto Reference:=Active, Scroll:=True

  '...
end sub

Если я не активирую файл и не помещу ячейки внутри приложения, перейдите к следующему:

Application.Goto Ссылка: = prodProfilesSheet.Cells (r - 5, c), Scroll: = True

Код выполняется, но не выполняет то, что предполагалось (то есть копирует данные из основного файла во вторичный, запускает подпрограмму вычисления композиции и вставляет полученные данные обратно в основной файл). Поскольку я не писал код, я не совсем уверен, что происходит в этих двух строках.

Есть идеи, как из этого выбраться?

Спасибо

1 Ответ

0 голосов
/ 06 июля 2018

tldr: Избавьтесь от операции .Activate и просто используйте Application.GoTo.

Работает с

Application.Goto Reference:=prodProfilesSheet.Cells(r - 5, c), Scroll:=True

... потому что вы можете передать аргумент Reference методу Application.Goto в качестве фактического объекта диапазона или строки xlR1C1, а prodProfilesSheet.Cells(r - 5, c) - объект диапазона. Чтобы передать ссылку на ячейку в виде строки, используйте

dim addr as string
addr = prodProfilesSheet.Cells(r - 5, c).Address(0, 0, ReferenceStyle:=xlR1C1, external:=true)
Application.Goto Reference:=addr, Scroll:=True

Вы не указали, что представляет Active , но я сильно подозреваю, что раньше это был ActiveCell, а Application.GoTo используется просто для помещения ячейки в верхний левый угол рабочего листа. окно после использования Range. Активируйте метод , чтобы сфокусировать Selection на этой ячейке. Поскольку Application.GoTo выполняет оба действия самостоятельно, операция .Activate является избыточной и может вызвать проблемы, если prodProfilesSheet не был активным рабочим листом.

Другими словами, Application.GoTo может перемещаться и активировать ячейку на текущем листе или другом листе, но .Activate может только фокусироваться на ячейке на текущем листе. Кроме того, для .Activate требуется Application.GoTo, чтобы перенести ячейку в верхний левый угол окна рабочего листа, а Application.GoTo по своей природе больше ничего не нужно, когда применяется аргумент Scroll: = True.

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