Выполнять расчеты процентилей в VBA индивидуально для строк с изменяющимся диапазоном - PullRequest
0 голосов
/ 10 января 2020

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

Во-вторых, я хочу, чтобы два разных процентиля выполнялись в строках 16-79, каждый из которых уникален друг для друга. Столбцы не могут быть установлены при изменении диапазона от листа к листу. У меня есть код ниже, который находит последний столбец с данными и создает 2 столбца: «20-й процентиль» и «80-й процентиль» после него. Поэтому я думаю, что это можно использовать для настройки диапазона. Это должно быть запущено на нескольких листах.

Sub create_columns_test2()

    Dim WS As Worksheet
    Dim x As Integer

    Dim array(???) As Variant?
    'What do I set my array as? why variant?
    Dim myVar as Double?
    'What does double mean

    For Each WS In ActiveWorkbook.Worksheets

        With WS

            If .Cells.Find("20th Percentile") Is Nothing And _
               .Cells.Find("80th Percentile") Is Nothing Then

                x = .UsedRange.Columns.Count
                .Cells(16, x + 2).Value = "20th Percentile"
                myVar = Application.WorksheetFunction.Percentile(Array(16, x - 1), 0.2)
                .Cells(16, x + 3).Value = "80th Percentile"
                myVar = Application.WorksheetFunction.Percentile(Array(16, x - 2), 0.8)
                'I want the percentile to run from rows 16 to 79 individually
                    'from column C to the column before the matching column I've just created

            End If

        End With

    Next WS

  For Each WS In ActiveWorkbook.Worksheets
    WS.Range("N:Q").EntireColumn.AutoFit
  Next WS

End Sub

1 Ответ

0 голосов
/ 13 января 2020

Проверьте это решение. Прочитайте комментарии в коде, если что-то не понятно - спросите в комментариях.
Первое замечание - я не совсем понял, как бы вы хотели использовать процентиль таким образом:

Я хочу процентиль для запуска из строк от 16 до 79 в отдельности

, но я думаю, что вы сможете исправить аргументы функции.

Sub create_columns_test2()

    Dim WS As Worksheet

    ' give variables proper names - I've used colNo instead of x for column number (see Note 1 in post)
    Dim colNo As Long
    Dim rowNo As Long

    ' Don't need this at all
'    Dim array(???) As Variant?
'    'What do I set my array as? why variant?
'    Dim myVar as Double?
'    'What does double mean


    ' be careful with using ActiveWorkbook / Sheet (see Note 2 in post)
    For Each WS In ActiveWorkbook.Worksheets

        With WS

            If .Cells.Find("20th Percentile") Is Nothing And _
               .Cells.Find("80th Percentile") Is Nothing Then


                ' using .UsedRange.Columns.Count is very tricky and may
                ' return incorrect data
                colNo = .Cells(1, Columns.Count).End(xlToLeft).Column

                ' Set column headers - Ok
                .Cells(16, colNo + 2).Value = "20th Percentile"
                .Cells(16, colNo + 3).Value = "80th Percentile"

                'I want the percentile to run from rows 16 to 79 individually
                    For rowNo = 17 To 79
                         'from column C to the column before the matching column I've just created

                         ' this part takes data from column C:
                         .Cells(rowNo, colNo + 2).Value = Application.WorksheetFunction.Percentile(Range(.Cells(rowNo, 3), .Cells(rowNo, colNo)), 0.2)
                         .Cells(rowNo, colNo + 3).Value = Application.WorksheetFunction.Percentile(Range(.Cells(rowNo, 3), .Cells(rowNo, colNo)), 0.8)
                    Next
            End If

        End With

    ' Don't need separate loop - can do it after each iteration
    WS.Range("N:Q").EntireColumn.AutoFit
    Next WS


End Sub

Примечание 1
См. Соглашения об именах . Есть также некоторые другие соглашения об именах в сети, которые похожи на «для vba» и предлагают использовать префикс, основанный на имени типа, но лично я против этого. Но в целом это также означает одну простую вещь - когда вы вернетесь к своему коду через месяц - вы не сразу вспомните, что означает эта переменная x или y, но вы точно будете знать, что colNo или rowNo используются для.

Примечание 2
Проверьте этот пост и решите, действительно ли вы хотите использовать ActiveWorkbook здесь, потому что рабочая книга, где размещен код, не всегда активный.

...