Ускорение кода VBA для оператора If Then с формулой - PullRequest
0 голосов
/ 24 декабря 2018

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

Первая формула ищет диапазон ячеек в столбце J, которые имеют значение в столбце A, и если они пустые в J, то ввод в формулу, которая содержит определенную пользователем функцию.

Второй код проверяет, заканчиваются ли какие-либо значения в столбце J на ​​,, и если они есть, удалите эту запятую.Любая помощь будет принята с благодарностью!

Sub FillEmpty()
    Dim r As Range, LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).row
    For Each r In Range("J2:J" & LastRow)
        If r.Text = "" Then r.FormulaR1C1 = _
           "=IFERROR((IF(LEFT(RC[-9],6)=""master"", get_areas(RC[-7]), """")),"""")"
    Next r
End Sub

Sub NoComma()
    Dim c As Range
    For Each c In Range("J:J")
        With c
            If Right(.Value, 1) = "," Then .Value = Left(.Value, Len(.Value) - 1)
        End With
    Next c
End Sub

1 Ответ

0 голосов
/ 24 декабря 2018

Ускорение: массивы

1.Код

Невероятно, что вам не нужна формула R1C1, чтобы получить формулу в диапазон при вставке из массива в диапазон.Но это работает на моем компьютере.В заключение, тот же принцип из второго кода применяется к первому: Range to Array, Loop и Array to Range .Это не становится быстрее, чем это.Другая идея для первого кода состояла в том, чтобы создать объединение диапазонов, а затем вставить формулу за один раз.

Sub FillEmpty()

  Const cCol As Variant = "J"      ' Column Letter/Number
  Const cFirst As Long = 2         ' First Row

  Dim vntFE As Variant             ' Range Array
  Dim i As Long                    ' Range Array Rows Counter

  ' Paste range into array.
  vntFE = Cells(cFirst, cCol).Resize(Cells(Rows.Count, cCol) _
      .End(xlUp).Row - cFirst + 1)

  ' Loop through array and perform calculation.
  For i = 1 To UBound(vntFE)
    If vntFE(i, 1) = "" Then vntFE(i, 1) = "=IFERROR((IF(LEFT(RC[-9],6)" _
        & "=""master"", get_areas(RC[-7]), """")),"""")"
  Next

  ' Paste array into range.
  Cells(cFirst, cCol).Resize(Cells(Rows.Count, cCol) _
      .End(xlUp).Row - cFirst + 1) = vntFE

End Sub

Sub FillEmptyEasy()

  Const cCol As Variant = "J"      ' Column Letter/Number
  Const cFirst As Long = 2         ' First Row

  Dim rng As Range                 ' Range
  Dim vntFE As Variant             ' Range Array
  Dim LastRow As Long              ' Last Row
  Dim i As Long                    ' Range Array Rows Counter

  ' Calculate Last Row.
  LastRow = Cells(Rows.Count, cCol).End(xlUp).Row
  ' Calculate Range.
  Set rng = Cells(cFirst, cCol).Resize(LastRow - cFirst + 1)
  ' Paste range into array.
  vntFE = rng

  ' Loop through array and perform calculation.
  For i = 1 To UBound(vntFE)
    If vntFE(i, 1) = "" Then vntFE(i, 1) = "=IFERROR((IF(LEFT(RC[-9],6)" _
        & "=""master"", get_areas(RC[-7]), """")),"""")"
  Next

  ' Paste array into range.
  rng = vntFE

End Sub

2.Код

Sub NoComma()

  Const cCol As Variant = "J"      ' Column Letter/Number
  Const cFirst As Long = 2         ' First Row

  Dim vntNoC As Variant            ' Range Array
  Dim i As Long                    ' Range Array Rows Counter

  ' Paste range into array.
  vntNoC = Cells(cFirst, cCol).Resize(Cells(Rows.Count, cCol) _
      .End(xlUp).Row - cFirst + 1)

  ' Loop through array and perform calculation.
  For i = 1 To UBound(vntNoC)
    If Right(vntNoC(i, 1), 1) = "," Then _
        vntNoC(i, 1) = Left(vntNoC(i, 1), Len(vntNoC(i, 1)) - 1)
  Next

  ' Paste array into range.
  Cells(cFirst, cCol).Resize(Cells(Rows.Count, cCol) _
      .End(xlUp).Row - cFirst + 1) = vntNoC

End Sub


Sub NoCommaEasy()

  Const cCol As Variant = "J"      ' Column Letter/Number
  Const cFirst As Long = 2         ' First Row

  Dim rng As Range                 ' Range
  Dim vntNoC As Variant            ' Range Array
  Dim lastrow As Long              ' Last Row
  Dim i As Long                    ' Range Array Rows Counter

  ' Calculate Last Row.
  lastrow = Cells(Rows.Count, cCol).End(xlUp).Row
  ' Calculate Range.
  Set rng = Cells(cFirst, cCol).Resize(lastrow - cFirst + 1)
  ' Paste range into array.
  vntNoC = rng

  ' Loop through array and perform calculation.
  For i = 1 To UBound(vntNoC)
    If Right(vntNoC(i, 1), 1) = "," Then _
        vntNoC(i, 1) = Left(vntNoC(i, 1), Len(vntNoC(i, 1)) - 1)
  Next

  ' Paste array into range.
  rng = vntNoC

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