Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сосчитать проценты в колонке.  (Прочитано 16767 раз)
0 Пользователей и 1 Гость смотрят эту тему.
klaus
Участник

ua
Offline Offline

« : 23-07-2008 10:09 » new

 :confused:Собственно задачка такова: есть несколько колонок с иногда, в произвольном порядке повторяющимися в них текстовыми данными. Нужно подсчитать % каждого уникального значения от общего количества значений внутри каждой колонки.
... и все это нужно средствами ВБА, поскольку это будет только маленькая часть кода. Здесь была моя ладья...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 23-07-2008 11:26 » 

Создать массив счётчиков.
Цикл по всем элементам колонки.
Если счётчик для данного значения уже существует, увеличиваем его значение, если нет - добавляем новый счётчик в массив и увеличиваем его значение.

По окончании цикла делим значение каждого счётчика на общее число элементов в колонке.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
klaus
Участник

ua
Offline Offline

« Ответ #2 : 23-07-2008 12:12 » 

Создать массив счётчиков.
Цикл по всем элементам колонки.
я в этом месте туплю.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 23-07-2008 12:30 » 

Ну счётчик это просто объект состоящий из двух полей - текста (для опознания) и целого (для собственно счёта).
Ты сказал, что тебе надо сделать это для каждой колонки.

Например у тебя такая колонка:

аа
аа
бб
фф
фф
бб
аа

Цикл перебирает их все по порядку. Сначала получаем "аа", смотрим, если и у нас счётчик для этого значения? Как ты это сделаешь без разницы, можешь просто цикл сделать. Я бы сделал тоже объект, которому бы скармливал значения одно за другим. Но это на вкус и цвет. Итак, ищем счётчик с "аа", такого нет. Создаем счётчик с данными "аа" и 1.
След. значение - "аа" - такой счётчик найден, значит увеличиваем его на 1 - теперь он у нас выглядит так "аа" 2.
След значение - "бб", такого счётчика у нас нет, создаём "бб" 1 и тд

в итоге у тебя получается список объектов-счётчиков

"аа" 3
"бб" 2
"фф" 2

Общая сумма элементов - 7

значит

"аа" - 3/7 = 0,42857142857142857142857142857143  ~ 42,86%
"бб" - 2/7 = 0,28571428571428571428571428571429 ~ 28,57%
"фф" - 3/7 = 0,28571428571428571428571428571429 ~ 28,57%
« Последнее редактирование: 23-07-2008 12:32 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
klaus
Участник

ua
Offline Offline

« Ответ #4 : 23-07-2008 12:34 » 

логику понял, спасибо.
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #5 : 24-07-2008 04:40 » 

для диапозона A1:A6
Код:
=СЧЁТЕСЛИ(A1:A6;A1)/ЧСТРОК(A1:A6)

правда уникальные выбрать не знаю как  Здесь была моя ладья...

но еще подумаем


хотя в принципе можно сделать запрос к книге, но это не лучший вариант
Записан

I Have Nine Lives You Have One Only
THINK!
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #6 : 24-07-2008 04:56 » 

вот тута есть обсуждение выбора уникальных значений
В последнем посте есть ссылка на файл, в котором вы можете найти то, что Вам надо
Записан

I Have Nine Lives You Have One Only
THINK!
klaus
Участник

ua
Offline Offline

« Ответ #7 : 24-07-2008 09:56 » 

Тут один добрый человек такой код подбросил:
Код:
Public Sub ProcOfUniq()
' оригинальная идея: (c) AndVGri
' (с) Serge Bliznykov
'В редакторе VBA в меню Tools, пункт Reference
' в диалоге поставте галочку для Microsoft Scripting Runtime.
   
    Dim pAll As New Scripting.Dictionary
    Dim rowLast As Long, Column_A As Long
    Dim w1 As Worksheet
    Dim iRow As Long, i As Long, vEntry As String
    Dim iCountAll As Long
           
    Set w1 = ActiveWorkbook.ActiveSheet
       
    Column_A = 1&
    rowLast = Cells(w1.UsedRange.Rows.Count + 1, Column_A).End(xlUp).Row
           
    iCountAll = 0
    For iRow = 1& To rowLast
      If Not IsEmpty(w1.Cells(iRow, Column_A)) Then
        vEntry = CStr(w1.Cells(iRow, Column_A).Value)
        If Not pAll.Exists(vEntry) Then
           pAll.Add vEntry, 1
        Else
           pAll.Item(vEntry) = pAll.Item(vEntry) + 1
        End If
        iCountAll = iCountAll + 1
      End If
    Next iRow
     
    For i = 0 To pAll.Count - 1
      Cells(i + 1, "E") = pAll.Keys(i)
      Cells(i + 1, "F") = pAll.Items(i)
      With Cells(i + 1, "G")
        .Formula = "= " & Cells(i + 1, "F").Address & "/" & _
                        Str(iCountAll)
        .NumberFormat = "0.00%"
      End With
    Next i
     
    ' подсчитаем сумму всех процентов - должно быть 100% всегда!
    With Cells(pAll.Count + 1, "G")
      .Formula = "=SUM(G1:G" & Trim(Str(pAll.Count)) & ")"
        .NumberFormat = "0.00%"
    End With
     
     
End Sub
Процитировал полностью.
Так вот, этот код делает то что нужно, но только для подсчёта уникальных значений в колонке A, а результаты будут в колонках E F G. Вот теперь пробую как-то переделать под свою задачу, и не клеится. У меня вообще-то планируется до 70 колонок, а максимальное количество уникальных записей 35 штук в одной колонке. Может конечные данные не в колонки E F G (не важно какие), а как-то в память запихивать, пройтись циклом по всем колонкам, а потом создав лист или книгу все скопом туда сбросить? Чет не осилю я такой код, да и не сильно этот процес память пригрузит? Хотя сам пример предложеный выше оч понравился.
Записан
klaus
Участник

ua
Offline Offline

« Ответ #8 : 24-07-2008 10:03 » 

вот тута есть обсуждение выбора уникальных значений
В последнем посте есть ссылка на файл, в котором вы можете найти то, что Вам надо
В принципе да, спасибо, но формулами я уже когда-то делал, слишком громоздко как-то выходит...
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #9 : 24-07-2008 11:37 » 

ну тогда сделайте select на лист

правда не лучший вариант
Записан

I Have Nine Lives You Have One Only
THINK!
klaus
Участник

ua
Offline Offline

« Ответ #10 : 24-07-2008 11:45 » 

На сколько я понимаю, select удобен, если нужно одно (несколько ) значений поискать (сравнить) в пределах диапазона, а у меня, ели взять все столбцы - уникальных может быть 300-400 значений. - неуместный подход, я думаю.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 24-07-2008 11:47 » 

да какая разница где бегать циклом по колонке или по нескольким колонкам?
а тем более если известны колонки
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines