Использование цикла for для создания промежуточной суммы в Excel - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь написать код для подсчета количества случаев, когда определенная дата И конкретная строка встречаются вместе в базе данных.Я написал следующее для цикла.Однако выходные данные для «JanHousekeeping» возвращают значение 15.

Набор используемых мной образцов данных выглядит следующим образом.

enter image description here

У меня есть 3 экземпляра «Уборка и другие опасности», но цикл возвращает значение 15. Почему это и как я могу это исправить?Заранее спасибо за помощь!

Sub SummarySync()


  JanHousekeeping = 0
  FebHousekeeping = 0
  MarHousekeeping = 0
  AprHousekeeping = 0
  MayHousekeeping = 0
  JunHousekeeping = 0
  JulHousekeeping = 0
  AugHousekeeping = 0
  SepHousekeeping = 0
  OctHousekeeping = 0
  NovHousekeeping = 0
  DecHousekeeping = 0

  For i = 5 To 20
    For j = 5 To 20
      DateCheckLoop = Worksheets("Jan").Cells(i, 4)
      ObsCheck = Worksheets("Jan").Cells(j, 9).Value

       If Month(DateCheckLoop) = 1 And ObsCheck = "Housekeeping and Other Hazards" Then
          JanHousekeeping = JanHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 2 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          FebHousekeeping = FebHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 3 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          MarHousekeeping = MarHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 4 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          AprHousekeeping = AprHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 5 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          MayHousekeeping = MayHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 6 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          JunHousekeeping = JunHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 7 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          JulHousekeeping = JulHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 8 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          AugHousekeeping = AugHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 9 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          SepHousekeeping = SepHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 10 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          OctHousekeeping = OctHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 11 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          NovHousekeeping = NovHousekeeping + 1
       ElseIf Month(Worksheets("Jan").Cells(i, 4)) = 12 And Worksheets("Jan").Cells(j, 9).Value = "Housekeeping and Other Hazards" Then
          DecHousekeeping = DecHousekeeping + 1
       Else
       End If
     Next j
   Next i

   Sheets("Site Visit Summary").Range("DateJan").Offset(1, 0) = JanHousekeeping       
End Sub

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы просматриваете j , но используете i для извлечения даты в DateCheckLoop .

Вы не указали, что i может быть таким, что определение значения на Worksheets("Jan").Cells(i, 4) невозможно.Я могу предложить, чтобы МЕСЯЦ от 1 до 31 равнялся 1.

Это повторяется каждый цикл, так как i никогда не изменяется.

0 голосов
/ 20 февраля 2019

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


  1. Ваш вопрос подразумевает, что критерии должны быть выполнены для одной строки, но ваш цикл сравнивает вашу первую дату со всеми другими строками для типа.Я считаю, что вы просто хотите увеличить строки в унисон.Самый простой способ сделать это - использовать один счетчик (i) для циклического перемещения по строкам.
  2. Если Housekeeping and Other Hazards - это тест, который должен быть выполнен для всех ваших входов, просто сначала протестируйте его вне цикла.
  3. Если вы правильно объявите свои переменные, они по умолчанию будут иметь значение 0, и, что более важно, у вас будет более явный код
  4. Select Case работает здесь хорошо, хотя решение с массивами было бы лучшеи это может быть сокращено до более короткого кода с циклом

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Jan")
Dim i As Long

Dim Jan As Long, Feb As Long, Mar As Long, Apr As Long, May As Long, Jun As Long, _
    Jul As Long, Aug As Long, Sep As Long, Oct As Long, Nov As Long, Dec As Long

For i = 5 To 20
    If ws.Range("I" & i) = "Housekeeping and Other Hazards" Then
        Select Case Month(ws.Range("D" & i))
            Case 1
                Jan = Jan + 1
            Case 2
                Feb = Feb + 1
            Case 3
                Mar = Mar + 1
            Case 4
                Apr = Apr + 1
            Case 5
                May = May + 1
            Case 6
                Jun = Jun + 1
            Case 7
                Jul = Jul + 1
            Case 8
                Aug = Aug + 1
            Case 9
                Sep = Sep + 1
            Case 10
                Oct = Oct + 1
            Case 11
                Nov = Nov + 1
            Case 12
                Dec = Dec + 1
        End Select
    End If
Next i

End Sub

Решение сводной таблицы будет выглядеть примерно так, как показано на фотографии ниже.Если вы поменяете местами поля строк, вы можете даже фильтровать по типу (текущий вид позволяет фильтровать по дате).Вы можете использовать GETPIVOTDATA, чтобы установить ячейки равными определенным условиям сводной таблицы так же, как ваш макрос планирует сделать в конце

enter image description here

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