Использовать значения массива в формуле - vba - PullRequest
0 голосов
/ 01 марта 2020

Действительно оценил бы дружеский толчок в правильном направлении.

Я пытаюсь использовать массив в качестве переменной для заполнения столбца значениями, основанными на формуле COUNTIFS, например «ячейка - формула с новым элементом массива в качестве переменной». Итак, AF2 - Показатели для Brand2 AF3 - Показатели для Brand3 .. Теперь я получаю значение ТОЛЬКО для конечного элемента массива (и я вижу, как Excel перебирает все остальные) для всего диапазона. Пробовал более или менее все, что мне известно, и просматривал предыдущие вопросы - безрезультатно. Буду признателен за небольшую помощь.

How it would look graphically

Option Explicit
Sub Summa_po()

Dim Mesyaz1 As Date
Dim Mesyaz2 As Date
Dim Mesyaz3 As Date
Dim Brand()
Dim i As Long

Worksheets(1).Activate

Mesyaz1 = DateAdd("m", -1, Now)
Mesyaz2 = DateAdd("m", -2, Now)
Mesyaz3 = DateAdd("m", -3, Now)
Brand = Array("Brand1", "Brand2", "Brand3", "Brand4")
For i = LBound(Brand) To UBound(Brand) 'Here I tried also For i=0 to UBound(Brand)
With ActiveSheet.Range("AF:AF")
.Formula = "=COUNTIFS(C:C," & RTrim(Month(Mesyaz3)) & ",H:H,""Head"",F:F," & Chr(34) & Brand(i) & Chr(34) & ")"
.AutoFill Destination:=ActiveSheet.Range("AF2:AF55") 'I used to draw it to the last cell but it is not a problem appararently
  End With
  Next i

[AF1] = "Head"
End Sub 

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Пожалуйста, замените ваш следующий код:

    For i = LBound(Brand) To UBound(Brand) 'Here I tried also For i=0 to UBound(Brand)
        With ActiveSheet.Range("AF:AF")
            .Formula = "=COUNTIFS(C:C," & RTrim(Month(Mesyaz3)) & ",H:H,""Head"",F:F," & Chr(34) & Brand(i) & Chr(34) & ")"
            .AutoFill Destination:=ActiveSheet.Range("AF2:AF55") 'I used to draw it to the last cell but it is not a problem appararently
       End With
   Next i

на следующий:

  For i = LBound(Brand) To UBound(Brand) 
        Range("AF" & i + 2).Formula = "=COUNTIFS(C:C," & RTrim(Month(Mesyaz3)) & _
                   ",H:H,""Head"",F:F," & Chr(34) & Brand(i) & Chr(34) & ")"
  Next i

AutoFill здесь не имеет никакого смысла. Там нет никаких ссылок, которые будут повторяться для ваших брендов. Их нужно добавлять только по коду ...

0 голосов
/ 01 марта 2020

Ваше объяснение не соответствует вашему коду, но перечитывание их и ваше последнее изображение подтвердили то, что я подозревал.

Прочитайте комментарии и настройте их в соответствии с вашими потребностями

РЕДАКТИРОВАТЬ: Настроил счетчик для массива бренда

Код:

Sub Summa_po()

    Dim targetSheet As Worksheet
    Dim targetRange As Range
    Dim cell As Range

    Dim Mesyaz1 As Date
    Dim Mesyaz2 As Date
    Dim Mesyaz3 As Date
    Dim Brand() As Variant

    Dim firstRow As Long
    Dim lastRow As Long

    Dim counter As Long

    ' If you need to work with a specific sheet change the next line to ThisWorkbook.Worksheets("NAME OF THE SHEET")
    Set targetSheet = ThisWorkbook.ActiveSheet

    ' Define brands array
    Brand = Array("Brand1", "Brand2", "Brand3", "Brand4")

    ' Define start row
    firstRow = 2

    ' Find last row in column AF uncomment next line
    ' lastRow = targetSheet.Cells(targetSheet.Rows.Count, "AF").End(xlUp).Row
    ' Or set directly the last row
    lastRow = 55

    ' Calc previous months
    Mesyaz1 = DateAdd("m", -1, Date)
    Mesyaz2 = DateAdd("m", -2, Date)
    Mesyaz3 = DateAdd("m", -3, Date)

    ' Define the target range in column AF
    Set targetRange = targetSheet.Range("AF" & firstRow & ":AF" & lastRow)

    ' Loop through each cell in range
    For Each cell In targetRange.Cells

        If counter = UBound(Brand) + 1 Then
            counter = 1
        Else
            counter = counter + 1
        End If

        cell.Formula = "=COUNTIFS(C:C," & Month(Mesyaz3) & ",H:H,""Head"",F:F," & Chr(34) & Brand(counter - 1) & Chr(34) & ")"

    Next cell

    ' Are you assigning this to a name? better use Thisworkbook.Names("")
    [AF1] = "Head"

End Sub

Дайте мне знать, если это работает

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