Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Скинуть только уникальные записи и проссумировать


Автор: Staruha 1.3.2005, 14:51
Код

Dim i As Integer
Dim d As Integer
Dim dd As Integer
dd = UsedRange.Rows.Count
Range("A3", "L" & dd).Value = "" 'очистка листа
d = Лист2.UsedRange.Rows.Count

A = InputBox("Введите название месяца", "Отчет за месяц", "")
 For q = 2 To d
        If Лист2.Range("A" & q).Value = A Then

     i = i + 1 'кол.записей в месяце

     Range("A" & i + 1).Value = Лист2.Range("B" & q).Value 'данные за месяц
    Range("B" & i + 1).Value = Лист2.Range("C" & q).Value

End If
Next
Range("A1:B21").AdvancedFilter Action:=xlFilterInPlace, Unique:=True 'вывод уникальных записей.
End Sub
'На Лист2 заносятся записи по столбцам: Месяц! Бригада! Объект! Часы!
Данный код выводит все записи за месяц на лист,а потом фильтрует.
Это все ,что получилось.А хотелось бы ,что бы на лист сразу сбрасывались только уникальные записи,
т.к. нужно по ним проссумировать столбец Часы. smile

Автор: Akina 1.3.2005, 15:08
Погоди... ты слизываешь данные с листа Лист2... а НА НЕМ предварительно отфильтровать уникальные записи нельзя?

Автор: Staruha 1.3.2005, 16:24
Ну там таблица отличается от той куда скидываются донные.В конечной таблице еще столбцы будут для обработки полученных данных

Автор: Jureth 2.3.2005, 08:59
Если время не критично и база небольшая, то можно так:
Код
A = InputBox("Введите название месяца", "Отчет за месяц", "")
For q = 2 To d
   If Лист2.Range("A" & q).Value = A Then
       F = False
       For j = 2 To q - 1
           If Лист2.Range("A" & j).Value = Лист2.Range("A" & q).Value Then 'Здесь идёт сравнение по столбцу "А", можно ещё что-нить добавить
               F = True
               Exit For
           End If
       Next j
       If Not F Then
           i = i + 1 'кол.записей в месяце
           Range("A" & i + 1).Value = Лист2.Range("B" & q).Value 'данные за месяц
           Range("B" & i + 1).Value = Лист2.Range("C" & q).Value
       End If
   End If
Next

Автор: Staruha 2.3.2005, 10:47
Кое что подправила.Получилось то что надо!

Я у тебя уже не первый раз встречаю это F- обьясни как это работает,надо ли на него переменную обьявлять.
Огромное спасибо!Сейчас займусь суммой,думаю управлюсь

Код

Private Sub CommandButton1_Click()

Dim d As Integer
Dim i As Integer
Dim j As Integer


d = Лист2.UsedRange.Rows.Count
A = InputBox("Введите название месяца", "Отчет за месяц", "")
For q = 2 To d
  If Лист2.Range("A" & q).Value = A Then
      F = False
      For j = 2 To q - 1
          If Range("A" & j).Value = Лист2.Range("B" & q).Value And Range("B" & j).Value = Лист2.Range("C" & q).Value Then 'Здесь идёт сравнение по столбцу "А", можно ещё что-нить добавить
              F = True
              Exit For
          End If
      Next j
      If Not F Then
          i = i + 1 'кол.записей в месяце
          Range("A" & i + 1).Value = Лист2.Range("B" & q).Value 'данные за месяц
          Range("B" & i + 1).Value = Лист2.Range("C" & q).Value
      End If
  End If
Next

End Sub

Автор: Akina 2.3.2005, 11:02
Цитата
уже не первый раз встречаю это F- обьясни как это работает,надо ли на него переменную обьявлять

ОБычный флаг. Dim F as Boolean

Автор: Staruha 2.3.2005, 11:59
Цитата
ОБычный флаг

Akina ,расскажи еще что нибудь о флаге.

Автор: Akina 2.3.2005, 12:15
Флаг (в данном случае и аналогичных) есть переменная (булева или иного типа), которой присваивается значение в зависимости от неких условий для передачи информации в другое место программы, где на основе запомненного значения принимается решение о выполнении одной из веток кода.

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

Флаг может быть Boolean (для передачи сведений "было событие"/"не было события") или, например, Integer (чтобы передать еще и, скажем, какое именно событие из списка возможных).


Автор: Staruha 2.3.2005, 16:29
Akina большое спасибо.И Jureth еще раз спасибо. Самая трудная часть сделана.Остается на к-ты это умножить.С суммой долго возилось .Наконец получилось.Может полегче можно сделать.Хотя работает быстро.А на какой объем хватит этого F?
Код


Private Sub CommandButton1_Click()
Dim F As Boolean
Dim d As Integer
Dim dd As Integer
Dim i As Integer
Dim j As Integer
Dim A As String
dd = UsedRange.Rows.Count
Range("A2", "L" & dd).Value = "" 'очистка листа


d = Лист2.UsedRange.Rows.Count
A = InputBox("Введите название месяца", "Отчет за месяц", "")
For q = 2 To d
  If Лист2.Range("A" & q).Value = A Then
      F = False
      For j = 2 To q
          If Range("A" & j).Value = Лист2.Range("B" & q).Value And Range("B" & j).Value = Лист2.Range("C" & q).Value Then 'Здесь идёт сравнение по столбцу "А", можно ещё что-нить добавить
         F = True
       Range("D" & j).Value = Range("D" & j).Value + Лист2.Range("E" & q).Value
       Range("E" & j).Value = Range("E" & j).Value + Лист2.Range("F" & q).Value
       Range("F" & j).Value = Range("F" & j).Value + Лист2.Range("G" & q).Value
       Range("G" & j).Value = Range("G" & j).Value + Лист2.Range("H" & q).Value
              Exit For
             
          End If
      Next j
     
      If Not F Then
          i = i + 1 'кол.записей в месяце
          Range("A" & i + 1).Value = Лист2.Range("B" & q).Value 'данные за месяц
          Range("B" & i + 1).Value = Лист2.Range("C" & q).Value
          Range("D" & i + 1).Value = Range("D" & i + 1).Value + Лист2.Range("E" & q).Value
          Range("E" & i + 1).Value = Range("E" & i + 1).Value + Лист2.Range("F" & q).Value
          Range("F" & i + 1).Value = Range("F" & i + 1).Value + Лист2.Range("G" & q).Value
          Range("G" & i + 1).Value = Range("G" & i + 1).Value + Лист2.Range("H" & q).Value
            End If
         
  End If
 
Next
End Sub

Автор: Akina 2.3.2005, 17:00
Цитата
на какой объем хватит этого F?

издеваешься?

Автор: Staruha 2.3.2005, 21:02
Цитата
база небольшая, то можно так
- для чего-то это писали.
А f для меня на тот момент было белым пятном.Не знаю как другим ,но мне надо время ,чтоб понять ноывое.Пока с работы ехала все по полочкам разложилось.И как это работает дошло.Вот такой канфуз. smile

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