У меня есть эта VBA превосходят Costum формулу:Excel VBA Costum формула слишком медленно
'=ConcatenateRangeIfs(A1;Sheet2!C:C;B1;Sheet2!D:D;Sheet2!G:G;". ")
Function ConcatenateRangeIfs(_
ByVal match_val1 As String, _
ByVal match_range1 As Range, _
ByVal match_val2 As String, _
ByVal match_range2 As Range, _
ByVal concatenate_range As Range, _
Optional ByVal separator As String _
) As String
'disable uncessary processing to improve performance
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim concatedString As String
Dim toConcatenateCellValue As String
Dim toConcatenateCellRow As Long
For Each toConcatenateCell In concatenate_range.SpecialCells(xlConstants, 23)
toConcatenateCellValue = toConcatenateCell.Value
If Not IsEmpty(toConcatenateCellValue) Then
toConcatenateCellRow = toConcatenateCell.Row
If match_val1 = match_range1.Cells(toConcatenateCellRow, 1).Value Then
If match_val2 = match_range2.Cells(toConcatenateCellRow, 1).Value Then
concatedString = concatedString & (separator & toConcatenateCellValue)
End If
End If
End If
Next toConcatenateCell
If Len(concatedString) <> 0 Then
concatedString = Right$(concatedString, (Len(concatedString) - Len(separator)))
End If
'enable disabled processing
ConcatenateRangeIfs = concatedString
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Function
лист1 пример, в котором формула в столбце D: D клетки:
Не понимаю, почему, но он занимает слишком много времени и зависает при каждом изменении значений, используемых в формуле. Я попытался отключить ненужные вещи excel и использовать локальные верификации для доступа к свойствам объектов, но не сильно изменил ...
Любое решение для повышения производительности?
Первое, что я мог определить: 'toConcatenateCellValue = toConcatenateCell.Value' не делают это назначение, когда вы не имеете спичку. Фактически вам не нужна эта временная переменная, это бесполезная копия, которая выполняется во всех ячейках, включая те, которые не совпадают! –
'String' никогда не может быть' Empty', поэтому 'Not IsEmpty (toConcatenateCellValue)' всегда будет 'True'. – YowE3K