Thomson Reuters EIKON не обновляет / не вычисляет мой макрос VBA. Какая строка кода могла бы помочь моей ниже? - PullRequest
0 голосов
/ 21 июня 2020
• 1000 . Предполагается, что эта программа вводит значения из A270: A371 на главную страницу J2, которая будет давать разные рейтинги для акций, которые находятся в разделе Investing A249: B260, затем код переходит к копированию Investing a249: B260 и начинает вставлять значения в ежедневные стратегии E5 (G5, I5, K5 и др. c.). Вы можете видеть, как макрос работает и изменяется с помощью значений, которые находятся в A270: A371, но он не позволяет EIKON производить расчет для внесения всех цен для каждой акции. Когда вы делаете это по одному, он будет работать, но не будет обновляться через макрос. Мне нужна строка кода, чтобы сообщить EIKON обновлять / вычислять каждый раз, когда новое значение вставляется на домашнюю страницу J2. Сообщите мне, что еще вам может понадобиться, и я отвечу на ваши вопросы.

Sub insertVarious()

    'Application.CalculateFullRebuild

    Const hpgName As String = "Homepage"
    Const hpgCell As String = "J2"

    Const invName As String = "Investing"
    Const invAddr As String = "A249:B260"
    Const invAddr2 As String = "A270:A371"

    Const dstName As String = "Daily Strategies"
    Const dstFirst As String = "E5"

    Dim wb As Workbook: Set wb = ThisWorkbook

    Dim hpg As Range: Set hpg = wb.Worksheets(hpgName).Range(hpgCell)
    Dim inv As Range: Set inv = wb.Worksheets(invName).Range(invAddr)
    Dim inv2 As Range: Set inv2 = wb.Worksheets(invName).Range(invAddr2)
    Dim UB1 As Long: UB1 = inv.Rows.Count
    Dim UB2 As Long: UB2 = inv.Columns.Count
    Dim NoA As Long: NoA = inv2.Rows.Count

    Dim Daily As Variant: ReDim Daily(1 To UB1, 1 To NoA * UB2)
    Dim Curr As Variant, j As Long, k As Long, l As Long
    For j = 1 To NoA
        hpg.Value = inv2.Cells(j).Value
        'hpg.Parent.Calculate
        'inv.Parent.Calculate
        Curr = inv.Value
        GoSub writeDaily
    Next j

    wb.Worksheets(dstName).Range(dstFirst).Resize(UB1, NoA * UB2) = Daily

    MsgBox "Data transferred.", vbInformation, "Success"

    Exit Sub

writeDaily:
    For k = 1 To UB1
        For l = 1 To UB2
            Daily(k, (j - 1) * 2 + l) = Curr(k, l)
        Next l
    Next k
    Return

End Sub

1 Ответ

0 голосов
/ 22 июня 2020

Работа с асинхронными c материалами в VBA всегда является проблемой.

  1. Вы пробовали Application.Calculate
  2. Вы пробовали DoEvents
  3. Вы пробовали Application.OnTime

Если время непредсказуемо, вы также можете попробовать:

oldValue = someRange.value
While someRange.value = oldValue
  DoEvents
Wend

Подождать, пока появятся данные.

...