Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Работа с MS Office > перебор данных в таблице Excel


Автор: Mick Winder 13.2.2006, 18:35
Какую формулу можно использовать для того, чтобы оставить в определенном списке неповторяющиеся элементы, т.е. свернуть список, оставив только все в единичном экземпляре.

Автор: Staruha 13.2.2006, 21:49
http://forum.vingrad.ru/index.php?showtopic=80266

Автор: AsIs 14.2.2006, 13:33
Ну и еще этот топик укажу http://forum.vingrad.ru/index.php?showtopic=82323
smile

Есть еще вариант - использование расширенного фильтра - здесь вообще ни формулы ни макросы не нужны - наслаждаемся жизнью. smile

Автор: Mick Winder 15.2.2006, 12:49
Вообще-то я думал, что есть какая-то формула, предоставленная Excel. Но видимо нет... Я так и предполагал, что нужно писать на VBA и использовать тот алгоритм, какой предложила Staruha.
Делюсь своим кодом. Перед запуском макроса следует выделить область одного столбца, в котором и находятся "проблемные" данные.
Код

Sub Delserdat()

  Dim B As String
  Dim i As Integer
  Dim j As Integer
  Dim Kz As Integer
  Dim D As String
  Dim Col As String
  Dim Ter As String
  Dim Ker As String
  Dim Der As String
  Dim ARow As Variant
  Dim BRow As Variant
  Dim jf As Boolean
    
    Set A = Selection
    B = A.Address
    For i = 1 To Len(B)
     If Mid(B, i, 1) <> "$" Then D = D + Mid(B, i, 1)
    Next i
        
    Col = Mid(D, 1, 1)
   
   jf = False
    j = 0
    For i = 1 To Len(D)
     If Mid(D, i, 1) = ":" Then
      j = i
      jf = True
     End If
    Next i
    
   If jf = True Then
   For i = 2 To j - 1
    ARow = ARow + Mid(D, i, 1)
   Next i
   Else: For i = 2 To Len(D)
          ARow = ARow + Mid(D, i, 1)
    Next i
   End If
      
   If jf = True Then
   For i = j + 2 To Len(D)
    BRow = BRow + Mid(D, i, 1)
   Next i
   Else: BRow = ARow
   End If
   
' **************************************************************
    i = ARow
    Kz = BRow
  While i <> (Kz - 1)
    j = i + 1
    While j <> Kz
     Ter = Col & Trim(Str(i))
     Ker = Col & Trim(Str(j))
     If Range(Ter) = Range(Ker) Then
      Der = Trim(Str(j)) & ":" & Trim(Str(j))
      Rows(Der).Delete Shift:=xlUp
      Kz = Kz - 1
      j = j - 1
     End If
     j = j + 1
    Wend
    i = i + 1
   Wend

End Sub

Автор: Twwi 15.2.2006, 13:51
Есть формула, но она не очень красива, т.к. она "выдирает" повторяющиеся значения, т.е. диапазон получается с "дырками". Прикрпеляю. Если есть вопросы, расскажу.
Но этот некрасивый набор уникальных значений мне потом все равно приходилось загонять в массив который уже с легкостью вставлялся в любое место
Код

ReDim AA(nbv - 1) 'nbv - количество уникальных значений, nbv беру с ячеки листа, там оно считается 
                                  'по формуле   {=SUM(IF((c3:c37)>0;1;0))} колонка с - колонка                           
                                  'уже отсортированных  значений

For i = 0 To Range("row").Value  ' row - это ячейка содержащая количество рядов в некрасивом 
                                                    'диапозоне
 If Range("c" & Trim(Str(i))).Value > 0 Then
   AA(i) = Range("c" & Trim(Str(i))).Value
 End If

Автор: AsIs 15.2.2006, 18:40
smile
Практически все пользователи Excel условно делятся на две категории, первые ни при каких обстоятельствах не используют макросы (потому как не знают), вторые почти все решают через макросы, даже сумму. smile
Меньшинство тех, кто использует адекватные инструменты в зависимости от задачи.
Здесь, к счастью достаточно много людей адекватно оценивают задачу.
Сложности возникают правда, когда те кто спрашивает, не четко формулируют вопрос - а зря, в зависимости от контекста, лучше исопльзовать подход тот или иной. (Эк меня потянуло на философию smile )

Вот пример с отбором уникальных записей. Уточнить бы, что потом мы хотим с этими данными делать? Скопировать в другое место, или _сразу_ получить на новом месте. Это нужно делать многократно или единовременно?

Давайте посмотрим такой вариант.
Щелкаем в списке, выполняем Данные \ Фильтр \ Расширенный фильтр\ вводим адреса ячеек, ставим галочку Только уникальные записи и Скопировать результат в другое место.
Все.
Зайти в меню по трудозатратам сопоставимо с запуском макроса, только сам макрос писать не надо.

Что касается формулы.
Готовой конечно формулы нет. Но если рассмотреть вариант: ввести формулу в дополнительный столбец и далее сделать фильтрацию - тогда все ок. После фильтрации можно данные копировать куда угодно.
Опять же, по трудозатратам примерно то, что предлагает Twwi. 1) Ввести формулу 2) Что-то сделать с ячейками (отфимльтровать и скопировать).
Только формула проще намного (имхо). - см. приложение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)