ВЫБЕРИТЕ (РАЗЛИЧНЫЙ СЧЕТ) в Excel - PullRequest
0 голосов
/ 26 марта 2012

Я сделал это без особых усилий на T-SQL, но я хочу реализовать то же самое в Excel VBA.Как этого добиться?На моем листе есть поле «Остановки», которое относится к остановкам, которые делает грузовик при доставке своего заказа.Я хочу посчитать общее количество остановок.1 стоп может иметь несколько заказов для доставки.Данные в столбце остановок выглядят примерно так:

Order#  Stops
1527305 1
1527305 1
1529418 2
1529418 2
1527299 3
1527299 3
1528894 5
1528894 5
1529529 6
1529529 6
1529518 7
1529518 7
1527522 8
1527522 8

Таким образом, окончательный счет должен составлять всего 7 уникальных остановок.Текущий код просматривает последнюю строку и воспринимает ее как общее количество остановок (что неверно).Код, который у меня есть сейчас, выглядит следующим образом:

    ActiveCell.Offset(0, 7).Select  ' H = stop number
    Selection.Value = curStop 'sets stop number
        If Selection.Value = 0 Then
            ActiveCell.Offset(-1, 0).Select
            curStop = ActiveCell.Value
            ActiveCell.Offset(1, 0).Select
            Selection.Value = curStop
        End If

Я сделал что-то на T-SQL с одной строкой кода, но не знаю, как это сделать в Excel.Любая помощь будет оценена.Спасибо !!

Ответы [ 2 ]

1 голос
/ 26 марта 2012

У вас уже есть решение на основе формул, и это может быть то, что вы хотите использовать в этом случае.
Если вам интересно, как решить проблему с помощью VBA, читайте дальше.

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

(Обратите внимание: необходимо включить (установить флажок) Инструменты> Ссылки> «Microsoft Scripting Runtime».)

Option Explicit

Function uniq_dict(ByRef row As Long, ByRef col As Long)
    Dim dict As New Scripting.Dictionary
    Dim ws As Worksheet
    Set ws = ActiveWorkbook.Sheets("Sheet1")

    For row = 1 To ws.Cells(Rows.Count, col).End(xlUp).row
        If Not dict.Exists(ws.Cells(row, col).Value) Then
            dict.Add ws.Cells(row, col).Value, Null '# can insert something here 
        End If
    Next row

    Set uniq_dict = dict
End Function

Sub call_uniq_dict()
    Dim i As Integer
    Dim k() As Variant
    Dim dict As New Scripting.Dictionary
    Set dict = uniq_dict(1, 1)

    Debug.Print "total items in dict:", dict.Count
    k = dict.Keys
    For i = 0 To dict.Count - 1
        Debug.Print "  dict key:", k(i)
    Next
End Sub

Результат:

total items in dict:         5 
  dict key:    1 
  dict key:    2 
  dict key:    3 
  dict key:    7 
  dict key:    8 
1 голос
/ 26 марта 2012

Вы также можете попробовать

=SUM(IF($B$2:$B$15,1/COUNTIF($B$2:$B$15,$B$2:$B$15)))

как решение формулы массива, предполагая, что ваши данные находятся в B2: B15. Разумеется, формулы массива вводятся с помощью Ctrl + Shift + Enter, а не ввода, поэтому, возможно, ваше решение немного лучше :)

Также не должен ли ваш вопрос сказать, что ответ 7 остановок, а не 5 ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...