Разница в производительности между проверкой внутреннего цвета ячейки и ее значения - PullRequest
0 голосов
/ 27 марта 2019

Я управляю проектом по управлению активами в Excel.Используя соединение с базой данных SQL, я могу импортировать большое количество планов обслуживания.

Исходя из того, что я импортирую, я заполняю несколько ячеек конкретными короткими строками и дополнительно рисую внутреннюю часть соответствующегоячейки с одним из двух цветов.Ячейки, которые позже заполняются пользователем, остаются неокрашенными.

Ячейки, заполненные с использованием данных базы данных, всегда будут окрашены

Когда я позже выполню команду, которая заполняет большое числоячеек, некоторые из этих ячеек могут быть уже заполнены пользователем или базой данных.Эти конкретные ячейки должны быть пропущены, и на данный момент мне известны три возможных метода определения, следует ли пропускать ячейку:

  1. Проверка с помощью базы данных (медленно): плохое решение, так как ячейки имеютуже заполнена базой данных, другой прогон будет переборщен
  2. Проверка, заполнена ли ячейка: If not cell.Value = vbNullstring Then
  3. Проверка, окрашена ли ячейка: If not cell.Interior.Color = vbRed Then

Теперь, поскольку теоретически количество заполненных ячеек может составлять до полумиллиона или даже больше, меня интересует разница в производительности между секундами и третьим вариантом

Есть ли заметная разница между проверкой значения ячейки в зависимости от ее внутреннего цвета?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Просто расширил код отсюда: Разница в производительности между диапазоном цикла и массивом цикла

Диапазон испытаний: A1: A100000

Read/Write Cell        = 15,765625 seconds
Read/Write Array       = 0,203125 seconds

Read Cell              = 0,37109375 seconds
Read Array             = 0,0234375 seconds
Read Interior Color    = 1,421875 seconds

Итак, у вас есть прямое сравнение между цветом чтения и значением массива чтения.


Option Explicit

Const strRANGE_ADDRESS As String = "A1:A100000"

Sub LoopRangeReadWrite()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)
        r.Value = r.Value + 1
    Next r

    lEnd = Timer

    Debug.Print "Read/Write Cell = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopArrayAddOne()

    Dim varArray As Variant
    Dim var As Variant
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    varArray = Range(strRANGE_ADDRESS).Value
    For Each var In varArray
        var = var + 1
    Next var
    Range(strRANGE_ADDRESS).Value = varArray

    lEnd = Timer

    Debug.Print "Read/Write Array = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopRangeReadColor()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double
    Dim a As Long

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)

        a = r.Interior.Color
    Next r

    lEnd = Timer

    Debug.Print "Read Interior Color = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopRangeReadValue()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double
    Dim a As Variant

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)
        a = r.Value
    Next r

    lEnd = Timer

    Debug.Print "Read Cell = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopArrayValue()

    Dim varArray As Variant
    Dim var As Variant
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    varArray = Range(strRANGE_ADDRESS).Value
    For Each var In varArray
        var = var + 1
    Next var

    lEnd = Timer

    Debug.Print "Read Array = " & (lEnd - lStart) & " seconds"

End Sub
2 голосов
/ 27 марта 2019

Кажется, действительно есть разница в производительности. Я только что проверил значение ячейки и ее внутренний цвет сто миллионов раз, и есть четкие различия:

Checking the value :  456 seconds
Checking the colour: 1281 seconds

Другими словами: проверка значений происходит в ± 2,8 раза быстрее (после этого простого эксперимента).

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