Суммирование на основе условия внутри VBA и значения вставки - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь придумать какой-нибудь код для суммирования всех значений из другого листа внутри vba и вставить их как значения. Я хотел бы запускать каждую строку за раз (все строки имеют одно и то же условие и просто получают данные из разных мест на основе номера столбца)

Как я могу выполнить сумму на основе условия таким образом?

Dim i as Integer 'Rows
Dim n as Integer 'Column

For i = 9 To 24
    For n = 3 To 21

    Next
Next

1 Ответ

0 голосов
/ 22 февраля 2020

Если честно, я не уверен, что это отвечает на ваш вопрос, но он вставляет значения, а не формулы. Макрос заполняет матрицу 19 x 16 на листе 1, используя либо формулы (как у вас сейчас), либо значения (используя ту же формулу). Выберите, какой метод, закомментировав соответствующую строку в конце l oop. Поместите код в пустую книгу и запустите тестовый макрос, это сгенерирует некоторые тестовые данные на листе 2 и сводку на листе 1. Насколько я могу судить, разница между двумя методами очень мала, что означает, что может быть что-то еще вызывая ваш медленный ответ.

Option Explicit
Sub test()

  Const MONTHS = 19

  testdata MONTHS, 1000 ' generate some data on sheet2

  Dim ws As Worksheet, wsData As Worksheet
  Dim r As Integer, c As Integer
  Dim f1 As String, f2 As String, f3 As String
  Dim col As String, a1 As String, a2 As String
  Dim src As String, mth As Integer

  Set ws = ThisWorkbook.Sheets("Sheet1")
  ws.Cells.Clear

  src = ws.Range("B5")
  If src = "" Then src = "Sheet2"
  Set wsData = ThisWorkbook.Sheets(src)

  For r = 1 To 16
    ws.Range("B" & r + 8) = "Category_" & r
    For mth = 1 To 19
      If r = 1 Then ws.Cells(8, mth + 2) = "Month " & mth

      c = mth + 4
      a1 = Chr(65 + (c - 1) Mod 26)
      a2 = ""

      ' generate column as letters (up to ZZ)
      If c > 26 Then a2 = Chr(64 + Int((c - 1) / 26))
      col = a2 & a1 & ":" & a2 & a1
      f1 = src & "!" & col
      f2 = src & "!AI:AI"
      f3 = "B" & r + 8

      ws.Cells(r + 8, mth + 2).Formula = "=SUMIFS(" & f1 & "," & f2 & "," & f3 & ")"
      'ws.Cells(r + 8, mth + 2) = WorksheetFunction.SumIfs(Range(f1), Range(f2), ws.Range(f3).Value)
    Next
  Next

  MsgBox "Finished"

End Sub

Sub testdata(mth As Integer, i As Long)
  ' sheet2 data
  Dim ws, r, c
  Set ws = ThisWorkbook.Sheets("Sheet2")
  ws.Cells.Clear
  For r = 2 To i
    ws.Range("AI" & r) = "Category_" & (1 + Int(Rnd() * 16))
    For c = 5 To 4 + mth
      ws.Cells(r, c) = Int(Rnd() * 100)
    Next
  Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...