Как скопировать значение 500 ячеек в цикле и запускать его до тех пор, пока оно не достигнет последней ячейки

#excel #vba #thomson-reuters-eikon #refinitiv-eikon

Вопрос:

я пытаюсь создать программу vba, в которой у меня есть 3 листа : лист 1, лист 2 и лист 3 , я введу данные на листе 2 (столбец A : столбец E), и я хочу скопировать первые 500 ric, которые будут скопированы с листа 2 (столбец B) на листе 1 (столбец A), и какой бы ни был результат, основанный на формуле refinitv на листе 1 (столбец D : столбец G), должен быть скопирован на лист 3, затем снова макрос должен перейти на лист 2, скопируйте следующие 500 ric, затем вставьте его в столбец 1 листа A и что бы ни было результат должен быть вставлен в лист 3, этот процесс должен выполняться до тех пор, пока все ric не будут покрыты листом 2. например, если лист 2 содержит в общей сложности 1200 ric, то цикл будет выполняться трижды (500 500 200 = 1200). единственная помощь, которая мне нужна, находится в разделе «Для цикла», я попробую самостоятельно.

переписывание последовательности для лучшего понимания: лист 2 : я введу данные, макрос должен выбрать первые 500 ric из столбца B и вставить их в лист 1 , столбец (A2), затем формула эйкона получит результат на основе столбца A, и макрос должен скопировать результат на лист 3, затем снова будут выбраны следующие 500 ric из листа 2, и следует следовать тому же процессу.

 Sub CAEvents()
Application.ScreenUpdating = False

    Dim wb As Workbook, ws As Worksheet, wsRic As Worksheet, ws1 As Worksheet
    Dim iLastRow As Long, r As Long, n As Long, i As Integer
    Dim ric As String

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")
    Set ws1 = wb.sheeets("Sheet2") ' as appropriate
    'n = ws.Range("B2").Value ' days
    
    ThisWorkbook.Sheets("Sheet1").Range("A2:E50000").ClearContents
    'ThisWorkbook.Sheets("Output").Cells.ClearContents
    'ThisWorkbook.Sheets("InsertSeveralSpots").Range("B6:F6").End(xlDown).clearcontent

    ' loop through rics in col I
    iLastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row
    If iLastRow >= 2 Then
        For r = 2 To iLastRow
            ric = ws.Cells(r, "I")
            ws.Range("A2").Value2 = ric
            
             ws.Range("C1").FormulaR1C1 = "=@RHistory(R2C1,"".Timestamp;.Close"",""NBROWS:""amp;R2C2amp;"" INTERVAL:1D"",,""SORT:ASC TSREPEAT:NO CH:In;fd"",R[5]C)"
            
            Application.Run "EikonRefreshWorksheet"
            
            Application.Wait (Now   TimeValue("0:00:02"))
 

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. может кто-нибудь посоветовать, пожалуйста ?

2. Я изо всех сил пытаюсь понять ваш вопрос, но он выглядит сложным… Вы говорите что-то словами, и фрагмент кода, который вы показываете, не пытается делать то, что вы говорите. Вы ничего не сказали о копировании значения из столбца I:I того же листа «Лист1» в «A2» и написании формулы в «C1» столько же раз, сколько iLastRow и в «Лист2″… Не могли бы вы лучше объяснить, чего вы хотите? Боюсь, никто не сможет помочь, просто прочитав вопрос так, как он сформулирован…

3. пожалуйста, проигнорируйте код на секунду

4. переписывание последовательности для лучшего понимания: лист 2 : я введу данные, макрос должен выбрать первые 500 ric из столбца B и вставить их в лист 1 , столбец (A2), затем формула эйкона получит результат на основе столбца A, и макрос должен скопировать результат на лист 3, затем снова будут выбраны следующие 500 ric из листа 2, и следует следовать тому же процессу.

5. Должен ли код писать формулу эйкона, или она уже есть на листе? Если нужно это написать, то куда писать ? Что будет делать подраздел «EikonRefreshWorksheet», кроме расчета листа?

Ответ №1:

Пожалуйста, протестируйте следующий код. Он не тестируется, у него нет тестового файла, но он должен работать. Пожалуйста, отправьте несколько отзывов после тестирования:

 Sub Copy500Rows()
   Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet, lastR2 As Long, lastRA As Long
   Dim lastR3 As Long, lastR As Long, arr2, arrDG, i As Long, noIt As Long, lastNr As Long
   
   Set sh1 = Worksheets("Sheet1") 'use here your necessary sheet
   Set sh2 = Worksheets("Sheet2") 'use here your necessary sheet
   Set sh3 = Worksheets("Sheet3") 'use here your necessary sheet
   lastR2 = sh2.Range("B" amp; sh2.rows.count).End(xlUp).row 'last row of B:B in sheet2
   
   lastR = 500              'the slices to be used
   noIt = Int(lastR2 / lastR)  'number of necesssary iterations
   'calculate the reall necessary number of iterations and the last iteration number of rows
   If lastR2 / lastR > noIt Then
      If noIt > 0 Then
          lastNr = lastR2 - noIt * lastR
          noIt = noIt   1
      Else
         lastR = lastR2: noIt = 1
      End If
   ElseIf lastR2 / lastR < noIt Then
      lastR = lastR2: noIt = 1
   End If
   sh1.Range("A2:A" amp; sh1.Range("A" amp; sh1.rows.count).End(xlUp).row).ClearContents
   sh3.Range("D2:G" amp; sh3.Range("D" amp; sh3.rows.count).End(xlUp).row).ClearContents
   'put the formula:
   sh1.Range("D2").FormulaR1C1 = "=@RHistory(R2C1,"".Timestamp;.Close"",""NBROWS:""amp;R2C2amp;"" INTERVAL:1D"",,""SORT:ASC TSREPEAT:NO CH:In;fd"",R[5]C)"
   For i = 1 To noIt
        arr2 = sh2.Range("B" amp; IIf(i = 1, 2, (lastR   1) * (i - 1)) amp; ":B" amp; (lastR   1) * i).value 'put the range in an array to make the code faster
        lastRA = sh1.Range("A" amp; sh1.rows.count).End(xlUp).row   1 'last empty row of A:A in sheet1
        sh1.Range("A" amp; lastRA).Resize(UBound(arr2), 1).value = arr2 'drop the array content in the last empty row of sheet1
        
        sh1.Calculate   'calculate

        arrDG = sh1.Range("D2:G" amp; sh1.Range("D" amp; sh1.rows.count).End(xlUp).row).value   'put the range in an array
        lastR3 = sh3.Range("D" amp; sh3.rows.count).End(xlUp).row   1                                         'last empty row of D:D in sheet3
        'drop the array content:
        sh3.Range("D" amp; lastR3).Resize(UBound(arrDG), UBound(arrDG, 2)).value = arrDG
        If i = noIt - 1 And lastNr > 0 Then lastR = lastNr
   Next i
   MsgBox "Ready..."
End Sub
 

Комментарии:

1. sh1.Диапазон(«A» и последняя строка).Изменение размера(1, UBound(arr2)).Значение = arr2 ‘удалите содержимое массива в последней пустой строке листа1, получив ошибку в этой строке

2. Ошибка, определенная приложением или объектом

3. @ Наина, ты правильно настроилась sh1 ? Если вы переместите курсор sh , когда остановитесь на ошибке, что вы увидите? Когда вы наводите курсор на lastRA то, что он показывает? Есть ли у вас Option Explicit в верхней части модуля, где выполняется этот код?

4. LastRA = 57 и да, у меня есть опция, явно указанная в верхней части модуля

5. lastR = 500, lastR2= 19314, noIt = 19314/500 = 39