2016-05-25 8 views
0

В Excel У меня есть таблица, которая работает следующим образом. С этими людьми связано несколько человек и несколько тысяч рабочих заказов.Excel VBA - Отображение различных значений для объекта

Это демонстрационная таблица ниже:

enter image description here

То, что я хочу в VBA представляет собой структуру данных, которая отображает каждый человек с количеством рабочих мест и сделали общую сумму заработанных денег. Итак, мы знаем, что Джонатан сделал 3 работы и заработал 400 долларов.

e.x.

(Key) -> (Value, Value)

(Person) -> (количество рабочих мест, Total Money)

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

enter image description here

Так что мои вопросы: один - как я могу написать словарь или коллекцию, которая делает это в VBA и два - это словарь наиболее эффективный подход. т.е. есть ли лучший подход?

+0

Используйте словарь, и .Exists для проверки простофиль и составить список из колонки F затем использовать этот список и worksheetfunction.sumif и .countif сделать это –

+0

Если поворотный стол уже дает вам необходимые результаты, зачем вам это нужно делать в VBA? – tigeravatar

+0

@tigeravatar Моя конечная цель - не создавать сводные таблицы для результатов, так как я делаю что-то еще с данными. Я просто создал сводные таблицы, чтобы показать, какие данные мне нужны. – BDillan

ответ

1

Предполагая, что вам разрешено сортировать данные, это будет отлично работать для вас. Протестировано более чем на 30 000 строк данных и успешно завершено менее чем за 0,1 секунды. Комментарии Код для ясности:

Sub ParseJobData() 

    Dim ws As Worksheet 
    Dim rData As Range 
    Dim aData As Variant 
    Dim aResults() As Variant 
    Dim sTemp As String 
    Dim ResultIndex As Long 
    Dim i As Long 

    Set ws = ActiveWorkbook.ActiveSheet   'Make sure this is the correct sheet 
    Set rData = ws.Range("F1").CurrentRegion  'Make sure this is the correct range 

    rData.Sort rData.Columns(1), xlAscending, Header:=xlYes 'Sort data 
    aData = rData.Value          'Load data into array 
    ReDim aResults(1 To 65000, 1 To 3)       'Save data in Results array 

    'Starting at 2 in order to skip header row 
    For i = 2 To UBound(aData, 1) 

     'Check if this is a new name 
     'Data is sorted, so new name only happens when previous name is completed 
     If aData(i, 1) <> sTemp Then 
      'New name, increase ResultIndex, store the name 
      ResultIndex = ResultIndex + 1 
      sTemp = aData(i, 1) 
      aResults(ResultIndex, 1) = sTemp 
     End If 

     'Column 2 is a count of jobs, increase it by 1 
     aResults(ResultIndex, 2) = aResults(ResultIndex, 2) + 1 

     'Column 3 is a sum of payment, increase by the amount 
     aResults(ResultIndex, 3) = aResults(ResultIndex, 3) + aData(i, 3) 
    Next i 

    'You have now built your array of unique values with a count and sum 
    'Do what you want with the array here 
    'This simply outputs it 
    ws.Range("J1").Resize(ResultIndex, UBound(aResults, 2)).Value = aResults 

End Sub 
+0

Thankyou. Просто быстрый вопрос, когда вы написали «rData.Sort rData.Columns (1), xlAscending, Header: = xlYes», ​​почему нет скобок/присваивания? Когда я пишу 'rData = rData.Sort (rData.Columns (1), xlAscending, Header: = xlYes)' его неправильно. Я не понимаю синтаксис в игре здесь – BDillan

+0

Вам нужны только скобки, когда вы присваиваете значение выражению или методу. К сожалению, вы не можете назначить метод sort для значения, поэтому он находится в отдельной строке и затем загружается в массив в следующей строке. Поскольку он сортируется по своей собственной линии и не происходит никакого назначения или сравнения (нет символа '=' в строке), для строки сортировки не требуются круглые скобки. – tigeravatar

Смежные вопросы