Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подсчёт количества матчей по ходу сезона - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчёт количества матчей по ходу сезона (Макросы/Sub)
Подсчёт количества матчей по ходу сезона
olegori1993 Дата: Суббота, 30.07.2022, 08:50 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Здравствуйте. Для ведения статистики хочу подсчитать количество игр у теннисистов. В столбце" A" игрок победитель, в столбце "B", проигравший. В столбце "C" дата матча. В столбце "E" нужно получить количество матчей по текущую дату для первого игрока, с учётом того что периодически он может быть как победителем, так и проигравшим, т.е нужно учитывать ещё и столбец "B". Аналогично для второго игрока, результат занести в столбец "F." На перспективу ещё можно сделать такой же расчет с учётом текущего покрытия (хард, грунт, трава) - значения столбца "D". С помощью формулы счетеслимн посчитать легко, но из-за потенциально большого набора данных хотелось бы делать расчет с помощью макроса. После выполнения макроса нужно получить такие же значения как в E:H. Нашел что это как-то можно сделать с помощью Application.WorksheetFunction.CountIf, но не понял как именно. Может кто подскажет. В примере есть какие-то попытки кода
К сообщению приложен файл: 9293068.xlsm(125.6 Kb)
 
Ответить
СообщениеЗдравствуйте. Для ведения статистики хочу подсчитать количество игр у теннисистов. В столбце" A" игрок победитель, в столбце "B", проигравший. В столбце "C" дата матча. В столбце "E" нужно получить количество матчей по текущую дату для первого игрока, с учётом того что периодически он может быть как победителем, так и проигравшим, т.е нужно учитывать ещё и столбец "B". Аналогично для второго игрока, результат занести в столбец "F." На перспективу ещё можно сделать такой же расчет с учётом текущего покрытия (хард, грунт, трава) - значения столбца "D". С помощью формулы счетеслимн посчитать легко, но из-за потенциально большого набора данных хотелось бы делать расчет с помощью макроса. После выполнения макроса нужно получить такие же значения как в E:H. Нашел что это как-то можно сделать с помощью Application.WorksheetFunction.CountIf, но не понял как именно. Может кто подскажет. В примере есть какие-то попытки кода

Автор - olegori1993
Дата добавления - 30.07.2022 в 08:50
Gustav Дата: Воскресенье, 31.07.2022, 05:08 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2136
Репутация: 840 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Как-то так:
[vba]
Код
Sub Кнопка1_Щелчок()
    Dim i           As Long
    
    Dim wf          As WorksheetFunction
    Dim wks         As Worksheet
    Dim lob         As ListObject
    Dim lcs         As ListColumns
    
    Dim cPlayer1    As Range
    Dim cPlayer2    As Range
    Dim cDatum      As Range
    Dim cCort       As Range
    Dim cGP1        As Range
    Dim cGP2        As Range
    Dim cGP1_C      As Range
    Dim cGP2_C      As Range
    Dim player      As String
    Dim dtcond      As String
        
    Set wf = Application.WorksheetFunction
    
    Set wks = Worksheets("Лист1")
    Set lob = wks.ListObjects(1)
    Set lcs = lob.ListColumns
    
    Set cPlayer1 = lcs("Player1").DataBodyRange
    Set cPlayer2 = lcs("Player2").DataBodyRange
    Set cDatum = lcs("Date").DataBodyRange
    Set cCort = lcs("Cort").DataBodyRange
    
    Set cGP1 = lcs("GP1").DataBodyRange
    Set cGP2 = lcs("GP2").DataBodyRange
    Set cGP1_C = lcs("GP1_C").DataBodyRange
    Set cGP2_C = lcs("GP2_C").DataBodyRange
    
    For i = 1 To lob.ListRows.count
        dtcond = "<" & CLng(cDatum(i))
        
        player = cPlayer1(i)
        cGP1(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        cGP1_C(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, cCort(i)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, cCort(i))
                        
        player = cPlayer2(i)
        cGP2(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        cGP2_C(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, cCort(i)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, cCort(i))
    Next i
End Sub
[/vba]


Мой tip box - яд 41001663842605
 
Ответить
СообщениеКак-то так:
[vba]
Код
Sub Кнопка1_Щелчок()
    Dim i           As Long
    
    Dim wf          As WorksheetFunction
    Dim wks         As Worksheet
    Dim lob         As ListObject
    Dim lcs         As ListColumns
    
    Dim cPlayer1    As Range
    Dim cPlayer2    As Range
    Dim cDatum      As Range
    Dim cCort       As Range
    Dim cGP1        As Range
    Dim cGP2        As Range
    Dim cGP1_C      As Range
    Dim cGP2_C      As Range
    Dim player      As String
    Dim dtcond      As String
        
    Set wf = Application.WorksheetFunction
    
    Set wks = Worksheets("Лист1")
    Set lob = wks.ListObjects(1)
    Set lcs = lob.ListColumns
    
    Set cPlayer1 = lcs("Player1").DataBodyRange
    Set cPlayer2 = lcs("Player2").DataBodyRange
    Set cDatum = lcs("Date").DataBodyRange
    Set cCort = lcs("Cort").DataBodyRange
    
    Set cGP1 = lcs("GP1").DataBodyRange
    Set cGP2 = lcs("GP2").DataBodyRange
    Set cGP1_C = lcs("GP1_C").DataBodyRange
    Set cGP2_C = lcs("GP2_C").DataBodyRange
    
    For i = 1 To lob.ListRows.count
        dtcond = "<" & CLng(cDatum(i))
        
        player = cPlayer1(i)
        cGP1(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        cGP1_C(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, cCort(i)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, cCort(i))
                        
        player = cPlayer2(i)
        cGP2(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        cGP2_C(i) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, cCort(i)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, cCort(i))
    Next i
End Sub
[/vba]

Автор - Gustav
Дата добавления - 31.07.2022 в 05:08
olegori1993 Дата: Воскресенье, 31.07.2022, 10:11 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Спасибо. При 30к строках почему-то уходит в бесконечный цикл
 
Ответить
СообщениеСпасибо. При 30к строках почему-то уходит в бесконечный цикл

Автор - olegori1993
Дата добавления - 31.07.2022 в 10:11
noelnoel93 Дата: Воскресенье, 31.07.2022, 11:00 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 20% ±

В итоге сам нашел довольно простое решение на основе другого когда. Но появилась еще задача посчитать количество скажем за определенный промежуток времени, например за прошлые 60 дней от текущей даты. Как я понял нужно менять диапазон для цикла, но не придумал как это сделать. Что нужно добавить в код (или как-то его изменить) чтобы выполнялся необходимый расчет? Можно добавить туда же, а можно отдельным макросом. В данном случае пример упростил.
К сообщению приложен файл: 123.xlsm(266.6 Kb)


Сообщение отредактировал noelnoel93 - Воскресенье, 31.07.2022, 11:30
 
Ответить
СообщениеВ итоге сам нашел довольно простое решение на основе другого когда. Но появилась еще задача посчитать количество скажем за определенный промежуток времени, например за прошлые 60 дней от текущей даты. Как я понял нужно менять диапазон для цикла, но не придумал как это сделать. Что нужно добавить в код (или как-то его изменить) чтобы выполнялся необходимый расчет? Можно добавить туда же, а можно отдельным макросом. В данном случае пример упростил.

Автор - noelnoel93
Дата добавления - 31.07.2022 в 11:00
Gustav Дата: Воскресенье, 31.07.2022, 16:46 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2136
Репутация: 840 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
В данном случае пример упростил.

Ну, Вы прямо Олимпиаду по программированию тут устраиваете. В первом задании речь шла о том, чтобы "запустить" внутри макроса расчет табличной функции CountIfs. Об оптимизации и о перевариваемых объёмах (типа 30K) вопрос пока не ставился.

Второй же пример отличается от первого как день и ночь. Если бы Вы его в таком виде сразу представили, то уже и получили бы решение на основе словаря. Но у Вас же там еще зависимость от даты была ("< даты текущей строки"), а Вы в курсе, что там есть дни, когда один игрок проводит несколько встреч (например, Marinko Matosevic - 2 игры за 09.01.2010) ? Поэтому по первоначальному алгоритму все строки одного дня для одного игрока были одинаковыми, поскольку считали кол-ва по предыдущий день, не учитывая текущий. А в словарном решении, например, результат напротив "утренней" встречи этого игрока внутри одной даты будет меньше результата напротив "вечерней", потому что вечерняя будет учитывать уже и утреннюю (просто как некую предыдущую строку в общем списке с этим игроком).

А вот теперь я запасаюсь попкорном и колой, устраиваюсь поудобнее в кресле и понаблюдаю, как в словарное решение можно добавить элегантный учет условия "текДата - 60 дней", не задействуя функцию СЧЁТЕСЛИМН (в любой ипостаси - в формуле в ячейке или в коде VBA).

[p.s.]Эх, добрый я человек... См. в коде врезку "подсчет текДата - 60"[/p.s.]
[vba]
Код
Sub Кнопка1_Щелчок()
    Dim aGame, i As Long, j As Long
    Dim rGame As Range
    Dim dict As Object, count, count60d As Double
    
    Set rGame = ActiveSheet.ListObjects(1).DataBodyRange
    aGame = rGame.Value
    Set dict = CreateObject("Scripting.Dictionary")
    
    For i = 1 To UBound(aGame, 1)       ' обсчет
        If dict.exists(aGame(i, 1)) Then
            aGame(i, 3) = dict(aGame(i, 1))
        Else                    ' игрока нет в списке
            aGame(i, 3) = 0
        End If
    
        count = 1 'счетчик игр
    
        dict(aGame(i, 1)) = aGame(i, 3) + count   ' число игр
        
        '*** подсчет текДата - 60 ***
        count = 0
        For j = 1 To i - 1
            If aGame(j, 1) = aGame(i, 1) And _
                aGame(j, 2) >= aGame(i, 2) - 60 And _
                aGame(j, 2) < aGame(i, 2) Then
                count = count + 1
            End If
        Next j
        aGame(i, 4) = count
        '****************************
    Next i

    rGame.Value = aGame
    Set dict = Nothing

End Sub
[/vba]Но общее время выполнения, конечно, заметно увеличивается.


Мой tip box - яд 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 31.07.2022, 18:01
 
Ответить
Сообщение
В данном случае пример упростил.

Ну, Вы прямо Олимпиаду по программированию тут устраиваете. В первом задании речь шла о том, чтобы "запустить" внутри макроса расчет табличной функции CountIfs. Об оптимизации и о перевариваемых объёмах (типа 30K) вопрос пока не ставился.

Второй же пример отличается от первого как день и ночь. Если бы Вы его в таком виде сразу представили, то уже и получили бы решение на основе словаря. Но у Вас же там еще зависимость от даты была ("< даты текущей строки"), а Вы в курсе, что там есть дни, когда один игрок проводит несколько встреч (например, Marinko Matosevic - 2 игры за 09.01.2010) ? Поэтому по первоначальному алгоритму все строки одного дня для одного игрока были одинаковыми, поскольку считали кол-ва по предыдущий день, не учитывая текущий. А в словарном решении, например, результат напротив "утренней" встречи этого игрока внутри одной даты будет меньше результата напротив "вечерней", потому что вечерняя будет учитывать уже и утреннюю (просто как некую предыдущую строку в общем списке с этим игроком).

А вот теперь я запасаюсь попкорном и колой, устраиваюсь поудобнее в кресле и понаблюдаю, как в словарное решение можно добавить элегантный учет условия "текДата - 60 дней", не задействуя функцию СЧЁТЕСЛИМН (в любой ипостаси - в формуле в ячейке или в коде VBA).

[p.s.]Эх, добрый я человек... См. в коде врезку "подсчет текДата - 60"[/p.s.]
[vba]
Код
Sub Кнопка1_Щелчок()
    Dim aGame, i As Long, j As Long
    Dim rGame As Range
    Dim dict As Object, count, count60d As Double
    
    Set rGame = ActiveSheet.ListObjects(1).DataBodyRange
    aGame = rGame.Value
    Set dict = CreateObject("Scripting.Dictionary")
    
    For i = 1 To UBound(aGame, 1)       ' обсчет
        If dict.exists(aGame(i, 1)) Then
            aGame(i, 3) = dict(aGame(i, 1))
        Else                    ' игрока нет в списке
            aGame(i, 3) = 0
        End If
    
        count = 1 'счетчик игр
    
        dict(aGame(i, 1)) = aGame(i, 3) + count   ' число игр
        
        '*** подсчет текДата - 60 ***
        count = 0
        For j = 1 To i - 1
            If aGame(j, 1) = aGame(i, 1) And _
                aGame(j, 2) >= aGame(i, 2) - 60 And _
                aGame(j, 2) < aGame(i, 2) Then
                count = count + 1
            End If
        Next j
        aGame(i, 4) = count
        '****************************
    Next i

    rGame.Value = aGame
    Set dict = Nothing

End Sub
[/vba]Но общее время выполнения, конечно, заметно увеличивается.

Автор - Gustav
Дата добавления - 31.07.2022 в 16:46
noelnoel93 Дата: Воскресенье, 31.07.2022, 18:49 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 20% ±

Извините, я сюда пишу потому что мало что понимаю в кодах, не хотел никого обидеть. Очень хорошо что есть такие люди как вы, которые могут помочь в решениях разных вопросов, за что огромное спасибо. А какое вы бы могли предложить решение с учетом оптимизации на большой объем данных? Если такой вообще есть. Лучше использовать файл из первого сообщения


Сообщение отредактировал noelnoel93 - Воскресенье, 31.07.2022, 19:22
 
Ответить
СообщениеИзвините, я сюда пишу потому что мало что понимаю в кодах, не хотел никого обидеть. Очень хорошо что есть такие люди как вы, которые могут помочь в решениях разных вопросов, за что огромное спасибо. А какое вы бы могли предложить решение с учетом оптимизации на большой объем данных? Если такой вообще есть. Лучше использовать файл из первого сообщения

Автор - noelnoel93
Дата добавления - 31.07.2022 в 18:49
Gustav Дата: Воскресенье, 31.07.2022, 19:40 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 2136
Репутация: 840 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
А какое вы бы могли предложить решение с учетом оптимизации на большой объем данных? Если такой вообще есть. Лучше использовать файл из первого сообщения

Вот такой у меня получился "слегка оптимизированный" код, отрабатывает за 7 минут на 29 тыс. записей:
[vba]
Код
Sub test3()
    Dim i           As Long
    
    Dim wf          As WorksheetFunction
    Dim wks         As Worksheet
    Dim lob         As ListObject
    Dim lcs         As ListColumns
    
    Dim cPlayer1    As Range
    Dim cPlayer2    As Range
    Dim cDatum      As Range
    Dim cCort       As Range
    Dim cGP1        As Range
    Dim cGP2        As Range
    Dim cGP1_C      As Range
    Dim cGP2_C      As Range
    Dim player      As String
    Dim dtcond      As String
    Dim time1       As Date
    
    Dim aPlayer1    As Variant
    Dim aPlayer2    As Variant
    Dim aDatum      As Variant
    Dim aCort       As Variant
    Dim aGP1        As Variant
    Dim aGP2        As Variant
    Dim aGP1_C      As Variant
    Dim aGP2_C      As Variant
            
    time1 = Now
            
    Application.ScreenUpdating = False
            
    Set wf = Application.WorksheetFunction
    
    Set wks = Worksheets("Лист1")
    Set lob = wks.ListObjects(1)
    Set lcs = lob.ListColumns
    
    Set cPlayer1 = lcs("Player1").DataBodyRange
    Set cPlayer2 = lcs("Player2").DataBodyRange
    Set cDatum = lcs("Date").DataBodyRange
    Set cCort = lcs("Cort").DataBodyRange
    
    Set cGP1 = lcs("GP1").DataBodyRange
    Set cGP2 = lcs("GP2").DataBodyRange
    Set cGP1_C = lcs("GP1_C").DataBodyRange
    Set cGP2_C = lcs("GP2_C").DataBodyRange
    
    cGP1.ClearContents
    cGP2.ClearContents
    cGP1_C.ClearContents
    cGP2_C.ClearContents
    
    aPlayer1 = cPlayer1.Value
    aPlayer2 = cPlayer2.Value
    aDatum = cDatum.Value
    aCort = cCort.Value
    aGP1 = cGP1.Value
    aGP2 = cGP2.Value
    aGP1_C = cGP1_C.Value
    aGP2_C = cGP2_C.Value
    
    For i = 1 To lob.ListRows.count
        dtcond = "<" & CLng(aDatum(i, 1))
        
        player = aPlayer1(i, 1)
        aGP1(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        aGP1_C(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, aCort(i, 1)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, aCort(i, 1))
                        
        player = aPlayer2(i, 1)
        aGP2(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        aGP2_C(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, aCort(i, 1)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, aCort(i, 1))
    Next i
    
    cGP1.Value = aGP1
    cGP2.Value = aGP2
    cGP1_C.Value = aGP1_C
    cGP2_C.Value = aGP2_C
    
    Application.ScreenUpdating = True
    Debug.Print (Now - time1) * 86400 'отработало за 418 секунд на 29 000 записей
End Sub
[/vba]
А какое вообще предполагается максимальное число записей в этой таблице?


Мой tip box - яд 41001663842605
 
Ответить
Сообщение
А какое вы бы могли предложить решение с учетом оптимизации на большой объем данных? Если такой вообще есть. Лучше использовать файл из первого сообщения

Вот такой у меня получился "слегка оптимизированный" код, отрабатывает за 7 минут на 29 тыс. записей:
[vba]
Код
Sub test3()
    Dim i           As Long
    
    Dim wf          As WorksheetFunction
    Dim wks         As Worksheet
    Dim lob         As ListObject
    Dim lcs         As ListColumns
    
    Dim cPlayer1    As Range
    Dim cPlayer2    As Range
    Dim cDatum      As Range
    Dim cCort       As Range
    Dim cGP1        As Range
    Dim cGP2        As Range
    Dim cGP1_C      As Range
    Dim cGP2_C      As Range
    Dim player      As String
    Dim dtcond      As String
    Dim time1       As Date
    
    Dim aPlayer1    As Variant
    Dim aPlayer2    As Variant
    Dim aDatum      As Variant
    Dim aCort       As Variant
    Dim aGP1        As Variant
    Dim aGP2        As Variant
    Dim aGP1_C      As Variant
    Dim aGP2_C      As Variant
            
    time1 = Now
            
    Application.ScreenUpdating = False
            
    Set wf = Application.WorksheetFunction
    
    Set wks = Worksheets("Лист1")
    Set lob = wks.ListObjects(1)
    Set lcs = lob.ListColumns
    
    Set cPlayer1 = lcs("Player1").DataBodyRange
    Set cPlayer2 = lcs("Player2").DataBodyRange
    Set cDatum = lcs("Date").DataBodyRange
    Set cCort = lcs("Cort").DataBodyRange
    
    Set cGP1 = lcs("GP1").DataBodyRange
    Set cGP2 = lcs("GP2").DataBodyRange
    Set cGP1_C = lcs("GP1_C").DataBodyRange
    Set cGP2_C = lcs("GP2_C").DataBodyRange
    
    cGP1.ClearContents
    cGP2.ClearContents
    cGP1_C.ClearContents
    cGP2_C.ClearContents
    
    aPlayer1 = cPlayer1.Value
    aPlayer2 = cPlayer2.Value
    aDatum = cDatum.Value
    aCort = cCort.Value
    aGP1 = cGP1.Value
    aGP2 = cGP2.Value
    aGP1_C = cGP1_C.Value
    aGP2_C = cGP2_C.Value
    
    For i = 1 To lob.ListRows.count
        dtcond = "<" & CLng(aDatum(i, 1))
        
        player = aPlayer1(i, 1)
        aGP1(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        aGP1_C(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, aCort(i, 1)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, aCort(i, 1))
                        
        player = aPlayer2(i, 1)
        aGP2(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond)
        aGP2_C(i, 1) = wf.CountIfs(cPlayer1, player, cDatum, dtcond, cCort, aCort(i, 1)) _
                    + wf.CountIfs(cPlayer2, player, cDatum, dtcond, cCort, aCort(i, 1))
    Next i
    
    cGP1.Value = aGP1
    cGP2.Value = aGP2
    cGP1_C.Value = aGP1_C
    cGP2_C.Value = aGP2_C
    
    Application.ScreenUpdating = True
    Debug.Print (Now - time1) * 86400 'отработало за 418 секунд на 29 000 записей
End Sub
[/vba]
А какое вообще предполагается максимальное число записей в этой таблице?

Автор - Gustav
Дата добавления - 31.07.2022 в 19:40
olegori1993 Дата: Воскресенье, 31.07.2022, 19:49 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Много... 350к. Мб проще это посчитать в power pivot. Я там и считал, но просто это всего лишь часть расчетов, которые будут использовать для рейтинга ЭЛО. Эта часть у меня на макросе есть, а вот в power pivot не нашел как его можно рассчитать. Поэтому решил на vba попробовать.
 
Ответить
СообщениеМного... 350к. Мб проще это посчитать в power pivot. Я там и считал, но просто это всего лишь часть расчетов, которые будут использовать для рейтинга ЭЛО. Эта часть у меня на макросе есть, а вот в power pivot не нашел как его можно рассчитать. Поэтому решил на vba попробовать.

Автор - olegori1993
Дата добавления - 31.07.2022 в 19:49
Gustav Дата: Воскресенье, 31.07.2022, 20:10 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 2136
Репутация: 840 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Мб проще это посчитать в power pivot
Скорее, не Pivot, а Query - в этой задаче полно вертикальных вычислений. Но тут я не помощник - не владею ни тем, ни другим. Я бы, скорее, всё это хозяйство в какую-нибудь доступную СУБД отправил, в тот же Access...

Хотя, если не требуются ежеминутные глобальные пересчеты, то можно и в Excel по частям за пару-тройку часов и 350к обсчитать.


Мой tip box - яд 41001663842605
 
Ответить
Сообщение
Мб проще это посчитать в power pivot
Скорее, не Pivot, а Query - в этой задаче полно вертикальных вычислений. Но тут я не помощник - не владею ни тем, ни другим. Я бы, скорее, всё это хозяйство в какую-нибудь доступную СУБД отправил, в тот же Access...

Хотя, если не требуются ежеминутные глобальные пересчеты, то можно и в Excel по частям за пару-тройку часов и 350к обсчитать.

Автор - Gustav
Дата добавления - 31.07.2022 в 20:10
olegori1993 Дата: Воскресенье, 31.07.2022, 20:21 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Спасибо в любом случае. Буду думать как лучше. А можете показать как будет выглядеть ваш второй вариант для расчета за 60 дней, но для первой таблицы. Там где две колонки с игроками
 
Ответить
СообщениеСпасибо в любом случае. Буду думать как лучше. А можете показать как будет выглядеть ваш второй вариант для расчета за 60 дней, но для первой таблицы. Там где две колонки с игроками

Автор - olegori1993
Дата добавления - 31.07.2022 в 20:21
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчёт количества матчей по ходу сезона (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2022 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!