Означает ли это, что код VBA в норме или вылетит? - PullRequest
0 голосов
/ 30 октября 2019

Мне сказали, что мой код контрафакта - плохая практика, и я боялся, что он может вылететь. У меня есть более 200 строк кода, как это. Нужно ли добавлять переменные или циклы, чтобы сделать его лучше? У других линий есть другие критерии и больше критериев, так что это довольно сложно. Мои данные содержат до 100 000 строк, и все работает нормально ... для завершения требуется всего несколько секунд. У меня есть куча другого кода, делающего другие вещи, но это единственная часть, которую мне сказали, это плохая практика. Я новичок без переменного опыта. Любые предложения высоко ценится, спасибо Cobber.

'Counts the data on sheet 2 and populates on sheet 1
'counts total, pass and fail
Sheets(1).Range("D5").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "RDG1", Range("G7:G10000"), "Sewer Works")
'counts pass
Sheets(1).Range("E5").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "RDG1", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "PASS")
'counts fail
Sheets(1).Range("F5").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "RDG1", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "FAIL")
'seperate areas
Sheets(1).Range("D6").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "TYH2", Range("G7:G10000"), "Sewer Works")
Sheets(1).Range("E6").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "TYH2", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "PASS")
Sheets(1).Range("F6").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "TYH2", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "FAIL")

Sheets(1).Range("D7").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "UJM3", Range("G7:G10000"), "Sewer Works")
Sheets(1).Range("E7").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "UJM3", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "PASS")
Sheets(1).Range("F7").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "UJM3", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "FAIL")

Sheets(1).Range("D8").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "OPL4", Range("G7:G10000"), "Sewer Works")
Sheets(1).Range("E8").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "OPL4", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "PASS")
Sheets(1).Range("F8").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "OPL4", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "FAIL")

Sheets(1).Range("D9").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "HUJ5", Range("G7:G10000"), "Sewer Works")
Sheets(1).Range("E9").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "HUJ5", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "PASS")
Sheets(1).Range("F9").Value = Application.WorksheetFunction.CountIfs(Range("C7:C10000"), "HUJ5", Range("G7:G10000"), "Sewer Works", Range("I7:I10000"), "FAIL")

'calculates percent score after the columns are populated on sheet 1
Range("G5").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G6").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G7").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G8").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G9").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"

Range("G10").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G11").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G12").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G13").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"
Range("G14").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-3]"

Ответы [ 2 ]

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

Мои предложения для вас будут:

Если вы используете MS Excel 2010 и выше, вы можете создать сводные таблицы. Просматривая ваш код, я понимаю, что вы создаете меры, основанные на определенных значениях для данного диапазона. Сводные таблицы лучше справляются с этим сценарием.

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

Например, вы можете определить имя для диапазона столбцов C7: C10000 как nm_SomeDescription . Сочетание клавиш для определения имени: CTRL + F3 или вы можете перейти к формулам |Диспетчер имен Код VBA будет использовать имя, определенное вместо диапазона столбцов, как в

Sheets(1).Range("F9").Value = Application.WorksheetFunction.CountIfs(Range(nm_SomeDescription), nm_HUJCode, Range(nm_SewerDescription), nm_SEWERCODE, Range(nm_FailureDescription), nm_FAILCODE)

CountIF или CountIF использовать методы последовательного сканирования,Следовательно, вы можете увидеть снижение производительности для большого набора данных. Чтобы снизить производительность, вы можете отсортировать данные перед вызовом функции CountIFS .

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

Как прокомментировано выше - много повторений и диапазонов, не относящихся к конкретным рабочим листам.

Вот частичная очистка для первого раздела подсчетов: ваши показатели выделены в отдельную функцию, вызываемую из вашегоосновной код.

With ThisWorkbook.Sheets(1)
    .Range("D5").Value = Counts("RDG1", "Sewer Works")
    .Range("E5").Value = Counts("RDG1", "Sewer Works", "PASS")
    .Range("F5").Value = Counts("RDG1", "Sewer Works", "FAIL")

    'other counts here

End With



'Get row counts from sheet2
'  Optional 3rd parameter for PASS/FAIL
Function Counts(v1 As String, v2 As String, Optional v3 As String = "") As Long
    Dim rng1 As Range, rng2 As Range, rng3 As Range
    With ThisWorkbook.Sheets(2)
        Set rng1 = .Range("C7:C10000")
        Set rng2 = .Range("G7:G10000")
        Set rng3 = .Range("I7:I10000")
        If Len(v3) > 0 Then
            Counts = Application.CountIfs(rng1, v1, rng2, v2, rng3, v3)
        Else
            Counts = Application.CountIfs(rng3, v1, rng2, v2)
        End If
    End With
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...