2015-11-06 3 views
2

У меня есть файл Excel с несколькими формулами в первой строке. Формулы выглядеть следующим образом:Получить формулы из закрытой книги

=TR(Sheet1!B1;"Tr.TPESTValue;TR.TPEstValue.brokername; TR.TPEstValue.date; TR.TPEstValue.analystname;TR.TPEstValue.analystcode";"Curn=EUR SDate=20101106 EDate=20150701 CH=Fd";$B$1) 

Эти формулы позволяют подключить через Add-In (xlam) к внешней базе данных в Интернете и используются для извлечения данных из этой базы данных. Если у меня есть все в одном файле, они выполняются сразу и сбой файлов.

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

Мой код, который делает работу с формулами (когда Add-In отключен), выглядит следующим образом:

Sub get_formula() 

Dim Sheet_i As Worksheet 
Dim o As Excel.Workbook 
Dim raw_i As Long 

For raw_i = 1 To 524 


Set o = GetObject("d:\formulas.xlsx") 
Set Sheet_i = Worksheets.Add(after:=Worksheets(Worksheets.Count)) 
Sheet_i.Cells(1, 1).Formula = o.Worksheets("Sheet1").Cells(raw_i, 1).Formula 
Set o = Nothing ' this ensures that the workbook is closed immediately 


Application.Wait (Now + #00:03:00 AM#) 

Next raw_i 

End Sub 

Однако, если я войти в базу данных макрос не работает. Я не уверен, это потому, что оригинальная книга открывается превосходным на каком-то уровне за небольшой промежуток времени (так что извлечение данных начинается с двух книг), или проблема связана с Application.Wait. Я предполагаю, что Application.Wait не только приостанавливает макрос, но также предотвращает получение формулы для данных. Можно ли приостановить макрос, но не лист excel?

+0

Возможно, вы можете рассчитать Calculate как строку над application.wait, чтобы обеспечить полное обновление данных Excel до ожидания? –

+0

Спасибо за ваше предложение, я попробую его и сообщите, погода его работает. – In777

+0

Являются ли эти формулы фиксированными или формулы продолжают меняться. Если они исправлены, я предлагаю иметь формулы в процедуре (то есть макрос) и применять их по мере необходимости (нет необходимости сохранять их из файла шаблона, в чем смысл получения чего-то, что он будет всегда одинаковым Даже если формулы меняются, вы можете иметь процедуру для чтения формул из файла «шаблон», как переписать их в процедуру по мере их обновления ... – EEM

ответ

2

Валидируйте \ исправить мое понимание вопроса:

  1. Все начинается с книги с одного листа Sheet1, который содержит в колонке B список кодов ISIN

  2. Процедура get_formula используется для :

    a. Добавить новый лист для каждого ISN в Sheet1

    b. Введите в A1 формулу, указывающую на резидент UDF в AddIn. Формула извлекается из отдельной рабочей книги шаблонов.

  3. Перед запуском процедуры get_formula надстройка деактивируется

Что касается этого заявления:

Однако, если я войти в базу данных макрос не работает. Я не уверен, это потому, что оригинальная книга открывается превосходным на каком-то уровне за небольшой промежуток времени (так что извлечение данных начинается с двух книг), или проблема связана с Application.Wait. Я предполагаю, что Application.Wait не только приостанавливает макрос, но также предотвращает получение формулы для данных. Можно ли приостановить макрос, но не лист excel?

В этом отношении Application.Wait Method (Excel) говорит:

Метод Wait приостанавливает все операции Microsoft Excel и может предотвратить вас от выполнения других операций на вашем компьютере, в то время как Wait в эффект. Однако фоновые процессы, такие как печать и , пересчитываются.

Поскольку эта формула фактически UDF, вполне возможно, что она не работает из-за ожидания, однако я не могу проверить, что причиной этого является не только UDF с расчетом, но и запустить S подключение к базе данных.

Кроме того, существует несоответствие между формулой в пост:

=TR('Sheet 1'!C1;'Sheet 1'!$F$1:$F$5;"Frq=D SDate=#1 EDate=#2 Curn=EUR CH=Fd";$B$1;'Sheet 1'!$D$1;'Sheet 1'!$E$1) 

И формулы в матричной книге:

=TR(Sheet1!B1,"Tr.TPESTValue;TR.TPEstValue.brokername; TR.TPEstValue.date; TR.TPEstValue.analystname;TR.TPEstValue.analystcode","Curn=EUR SDate=20101106 EDate=20150701 CH=Fd",$B$1) 

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

Это решение содержит формулу, которая будет применяться как постоянная, поэтому нет необходимости открывать книгу шаблонов, поэтому нет необходимости ждать.

Это предполагает, что лист держит список кодов ISIN называется ISINs(изменено, если требуется)

Он называет новые листы с соответствующим ISIN для легкого identitfication и навигации.

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

Sub ISINs_Set_Published() 
'All lines starting with ":" have the purpose of measuring tasks time and printing it in the immediate window 
'They should be commented or deleted after the time assessment is completed 
: Dim dTmeIni As Date 
: Dim dTmeLap As Date 
: Dim dTmeEnd As Date 

Const kISINs As String = "ISINs" 
Const kFml As String = "=TR(kCll," & _ 
    "'Tr.TPESTValue;TR.TPEstValue.brokername; TR.TPEstValue.date; TR.TPEstValue.analystname;TR.TPEstValue.analystcode'," & _ 
    "'Curn=EUR SDate=20101106 EDate=20150701 CH=Fd',$B$1)" 

Dim WshSrc As Worksheet, WshTrg As Worksheet 
Dim rSrc As Range, rCll As Range 
Dim sFml As String 
Dim tCalculation As XlCalculation 

: SendKeys "^g^a{DEL}": Stop 
: dTmeIni = Now: dTmeLap = dTmeIni: dTmeEnd = dTmeIni 
: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), "Process starts" 

    Rem Application Settings 
    'Change Excel settings to improve speed 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Application.DisplayAlerts = False 
    tCalculation = Application.Calculation   'To save user setting 
    Application.Calculation = xlCalculationManual 'Set calculation to manual so formulas will not get calculated till end of process 

    Rem Set Range with ISINs 
    With ThisWorkbook.Worksheets(kISINs).Columns(2) 
     Set rSrc = .Cells(2).Resize(-1 + .Cells(.Cells.Count).End(xlUp).Row) 
    End With 

: dTmeEnd = Now 
: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , "Loop starts" 
: dTmeLap = dTmeEnd 

    Rem Add ISINs Worksheets 
    For Each rCll In rSrc.Cells 

: dTmeEnd = Now 
: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , , "ISIN: "; rCll.Value2 
: dTmeLap = dTmeEnd 

     Rem Refresh Formula 
     With WorksheetFunction 
      sFml = .Substitute(kFml, Chr(39), Chr(34)) 
      sFml = .Substitute(sFml, "kCll", Chr(39) & rCll.Worksheet.Name & Chr(39) & Chr(33) & rCll.Address) 
     End With 

     Rem Add Worksheet 
     With ThisWorkbook 
      On Error Resume Next 
      .Sheets(rCll.Value2).Delete  'Deletes ISIN sheet if present 
      On Error GoTo 0 
      Set WshTrg = .Sheets.Add(After:=.Sheets(.Sheets.Count)) 
     End With 

     Rem Name Worksheet & Set Formula 
     With WshTrg 
      .Name = rCll.Value2 

: dTmeEnd = Now 
: Debug.Print dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , , "Set Formula starts" 
: dTmeLap = dTmeEnd 

      .Cells(1).Formula = sFml 

: dTmeEnd = Now 
: Debug.Print dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , , "Set Formula ends" 
: dTmeLap = dTmeEnd 

    End With: Next 

: dTmeEnd = Now 
: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , "Loop ends" 
: dTmeLap = dTmeEnd 

    Rem Application Settings 
    Application.Goto rSrc.Worksheet.Cells(1), 1 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Application.DisplayAlerts = True 
    Application.Calculation = tCalculation 

: dTmeEnd = Now 
: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , "Application Calculate starts" 
: dTmeLap = dTmeEnd 

    Application.Calculate 

: dTmeEnd = Now 
: Debug.Print dTmeEnd, Format(dTmeEnd - dTmeLap, "hh:mm:ss"), , "Application Calculate ends" 

: Debug.Print vbLf; dTmeEnd, Format(dTmeEnd - dTmeIni, "hh:mm:ss"), "Procedure ends" 

End Sub 

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

+0

Благодарим вас за помощь. Ваше описание задачи верное. Код работает красиво. Он генерирует формулу в макросе и вставляет ее в новый рабочий лист. Однако 'Application.Calculation = xlCalculationManual' не препятствует выполнению всех формул сразу. Может быть, у вас есть другие идеи, как решить эту проблему, следовательно, решить проблему с макросом? – In777

+0

Рад помочь с этой проблемой, оцените, если вы подтвердите ответ, выбрав его, что также поможет сохранить сайт обновленным. Вы измеряли время между обоими режимами вручную и автоматически. Я вставлю несколько строк, чтобы помочь вам в этом. Нам нужно понять, является ли задержка приемлемой или слишком большой, ведь помните, что расчет зависит как от аддина, так и от соединения с базой данных. Можно ли измерить время вычисления после завершения макроса? поэтому можно определить дополнительное время, которое требуется при запуске макроса. – EEM

+0

Я разместил ссылки на результаты измерения времени для обоих режимов вручную и автоматически для частного чата. – In777