Ускорьте файл Excel, содержащий код VBA - PullRequest
0 голосов
/ 17 октября 2019

Я использую эту функцию в моем vba:

Function mergedText(rngMergedCell As Range)

    If rngMergedCell.MergeCells = True Then
        mergedText = rngMergedCell.MergeArea(1, 1)
    Else
        mergedText = rngMergedCell
    End If 

End Function

Функция позволяет моей формуле читать значение объединенных ячеек. Это работает очень хорошо. Тем не менее, Excel становятся такими медленными.

Как я могу ускорить мой Excel? Пожалуйста, предоставьте мне пошаговые ответы. Я не хорошо с VBA.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

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

Option Explicit
Sub Test()

    With ThisWorkbook.Sheets("YourSheet") 'change YourSheet for your actual sheet name
        Dim LastRow As Long
        LastRow = .Cells(.Rows.Count, "I").End(xlUp).Row 'I suppose your last row with actual data will be on column I

        Dim arr As Variant
        arr = .Range("H2:K" & LastRow).Value 'I'm assuming you have headers.

        Dim ValueA As String
        Dim i As Long
        For i = 2 To UBound(arr)
            If arr(i, 1) <> vbNullString Then ValueA = arr(i, 1) 'this will always get the last value from column A not empty cell
            If arr(i, 2) <> 0 Then arr(i, 3) = ValueA & "-" & arr(i, 2) 'if cell I <> 0 then concatenate the values
        Next i

        .Range("H2:K" & LastRow).Value = arr
    End With

End Sub
0 голосов
/ 17 октября 2019

Вот метод для получения значения из вертикально слитых ячеек (т.е. только 1 столбец), который не использует VBA

Во-первых, предостережение - это пропускает все пустые ячейкив столбце, чтобы найти первую ячейку с данными в той же строке, что и ваша целевая ячейка. Таким образом, он не будет извлекать «пустые» данные и не заботится о том, действительно ли ячейки действительно объединены.

=INDEX($A$1:$A1, SUMPRODUCT(MAX(ROW($A$1:$A1)*--(LEN($A$1:$A1)>0))) ,1)

$A1 - ваша целевая ячейка. $A$1:$A1 будет ячейками в или выше текущей строки из столбца А. Она будет расширяться при перетаскивании формулы вниз (т. Е. В строке 9 это будет $A$1:$A9)

SUMPRODUCTнайдет строку MAX, где есть данные (LEN($A1)>0). Затем INDEX использует это значение для возврата значения

This в формулу массива, поэтому вам нужно будет использовать Ctrl + Shift + Введите после ввода формулы.

Если в данных или выше нет данных, то формула будет ссылаться на верхнюю ячейку,и вернуть 0 (см. эту статью от Microsoft ). Мы можем вернуть пробел (""), используя CountA, чтобы увидеть, есть ли какие-либо данные:

=IF(COUNTA($A$1:$A1)<1, "", INDEX($A$1:$A1, SUMPRODUCT(MAX(ROW($A$1:$A1)*--(LEN($A$1:$A1)>0))),1))
0 голосов
/ 17 октября 2019
Option Explicit   

Public Sub MainMethod()

 Application.Calculation = xlCalculationManual
 Application.ScreenUpdating = False
 Application.DisplayStatusBar = False

    MySubMethod() ' your func

  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
  Application.DisplayStatusBar = True

End Sub 
...