excel vba - сумма и среднее по полю id - PullRequest
0 голосов
/ 10 марта 2019

Привет, я новичок в Excel , искал способ вычислить следующее:

Иметь поле id в column A в текстовом формате.Основываясь на каждом поле идентификатора и где текстовое поле не пустое, я хочу установить для поля Pos значение 1 (в начале каждого нового идентификатора), а затем увеличить его до 2 в следующей позиции текстового поля, которая не являетсяпустой.

Идентификатор должен сброситься до 1, когда идентификатор в столбце A изменяется, а затем увеличивается и так далее.

Также для каждого Pos следует рассчитывать Final Sc как простое среднее значение Sc между двумя позициями и печатать в начале каждого POS.

например.для идентификатора 12534, для поз. 1, конечное значение Sc должно быть (0,2 + 0,3) /2.

enter image description here

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Это возможно в VBA (конечно), но вот формульный подход, если вы хотите попробовать это.

Попробуйте поместить эту формулу в ячейку D2 (предполагая, что Pos находится в столбце D):

=IF($B2<>"",COUNTIFS($A$2:$A2,A2,$B$2:$B2,"<>"),"")

И эта формула в ячейке E2 (при условии, что Final Sc находится в столбце E):

=IF($D2=1,AVERAGEIFS(C:C,A:A,$A2),"")

А затем перетащите / заполните формулы до последней строки ваших данных.

1 голос
/ 10 марта 2019

вы можете использовать SpecialCells () метод и Области свойство Range объекта:

Sub main()
    Dim area As Range
    Dim iArea As Long

    With Range("A2", Cells(Rows.Count, 1).End(xlUp))
        For Each area In .SpecialCells(xlCellTypeConstants).Areas
            With area.Offset(, 1).SpecialCells(xlCellTypeBlanks)
                For iArea = 1 To .Areas.Count
                    .Areas(iArea).Offset(-1, 2).Resize(1).Value = iArea
                    .Areas(iArea).Offset(-1, 3).Resize(1).Value = WorksheetFunction.Average(.Areas(iArea).Offset(, 1))
                Next
            End With
        Next
    End With
End Sub
0 голосов
/ 10 марта 2019

Это будет работать, если ваша таблица начинается с ячейки A1

Private Sub fill_pos()

  Dim cell As Range
  Dim ws As Worksheet: Set ws = Sheets("Sheet1") 'replace Sheet1 with your Sheetname 
  Dim lr As Long: lr = ws.Cells(Rows.Count, 1).End(xlUp).Row ' last active row in column A
  Dim pos As Integer: pos = 0
  Dim avgcounter As Integer: avgcounter = 0 ' counter for average amount division
  Dim avgsum As Double: avgsum = 0 ' counter for sc
  Dim textrowpos As Long: textrowpos = 0 ' to keep track when to write finalsc
  Dim firstloop As Boolean: firstloop = True ' need to check for first loop, _
  because we cant get average withotu collecting data first

  For Each cell In ws.Range("A2:A" & lr) ' for each cell in userrange
      If IsEmpty(cell) Then
          pos = 0 ' new id, reset pos
      Else
          If Not IsEmpty(cell.Offset(, 1)) Then ' text found,
              pos = pos + 1
              cell.Offset(, 3) = pos ' update pos
              If Not firstloop Then
                  Cells(textrowpos, 5) = avgsum / avgcounter 
                  'got already data collected (since its not first loop), can write result
              End If
              firstloop = False ' toggle firstloop off
              avgsum = 0 ' reset all counters
              avgcounter = 0
              textrowpos = cell.Row ' save the row position to update future result
          Else
              If Not IsEmpty(cell.Offset(, 2)) Then
                  avgsum = avgsum + cell.Offset(, 2) ' add them to average
                  avgcounter = avgcounter + 1
              End If
          End If
      End If

      If (cell.Row = lr) Then
          Cells(textrowpos, 5) = avgsum / avgcounter 
          ' since list ends with empty cell, we need to update textrow pos one last time
      End If
  Next cell

End Sub

Дает желаемый результат:

enter image description here

Но я очень сомневаюсь, что вы поймете код, не занимаясь кодированием самостоятельно.
Честно говоря, я искренне размышлял, должен ли я даже публиковать ответ ..

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