COUNTIF FormulaR1C1 с рассчитанным относительным положением - PullRequest
0 голосов
/ 04 марта 2020

BACKGROUND

У меня есть скрипт, который вставляет столбец после каждого существующего столбца в таблице, который должен вставить формулу COUNTIF, где диапазон и критерии основаны на двух разных l oop переменных.

Я могу заставить формулу R1C1 работать нормально, для первой, но так как диапазон и критерии не пропорциональны их положению, R -1 и C -1 не работают в моей формуле.

НАЗНАЧЕНИЕ СКРИПТА

Вот скрипт с COUNTIF в качестве FormulaR1C1, который мне нужно изменить.

Первая часть сценария зацикливается на получении данных из каждого столбца из листа origin_data и помещает их в тот же столбец в origin_analytics, а в процессе удаляет повторяющиеся значения.

Во второй части процесса есть al oop для настройки столбца COUNTIF, который будет вставляться после каждого столбца в листе origin_analytics. Он устанавливает значение x в качестве номера столбца origin_data (каждый раз увеличивается на 1) и имеет y в качестве листа origin_analytics (увеличивается на 2 каждый раз, чтобы учитывать ранее вставленный столбец).

Когда я создаю формулу Я ввожу в строку 6 столбец y + 1. Формула COUNTIF(x:x, y). Когда он завершается, он форматирует и автозаполнения до последней строки (установленной origin_data RowCount ранее в подпрограмме).

Последняя версия COUNTIF, которую я безуспешно пытался:

s2.Cells(6, y + 1) = WorksheetFunction.CountIf(Sheets("origin_data").Range(Sheets‌​("origin_data").Cell‌​s(1, x), Sheets("origin_data").Cells(Rows.Count, x)), Sheets("origin_analytics").Cells(6, y))

ПРОБЛЕМА

Я получаю сообщение об ошибке: ошибка времени выполнения '9' Подстрочный индекс вне диапазона , который, как я считаю, происходит из-за COUNTIF в VBA не любит работать, если не в FormulaR1C1. Возможно ли иметь один из тех, который включает использование переменных?

PERCEIVED SOLUTION

Если бы я мог установить диапазон от R -1 (относительно моей текущей позиции) до результата ( x - y) - 1 .

Примеры сочетания формулы R и C при циклическом прохождении:

формулы в B, R (origin_analytics! ) = -1 (A), C (origin_analytics!) = -1 (A)

Формула в D, R (origin_analytics!) = - 2 (B), C (origin_analytics!) = -1 (C)

Формула в F, R (origin_analytics!) = -3 (C), C (origin_analytics!) = -1 (E)

Формула в H, R (origin_analytics!) = -4 ( D), C (origin_analytics!) = -1 (G)

КОД

'For each column, copy distinct values and paste into origin_analysis sheet
  Dim s1 As Worksheet, s2 As Worksheet, x As Long, y As Long
  x = 1
  Do Until x = columnCount
    Set s1 = Sheets("origin_data")
    Set s2 = Sheets("origin_analysis")
    s1.Columns(x).Copy s2.Columns(x)
    s2.Columns(x).RemoveDuplicates Columns:=1, Header:=xlNo

    x = x + 1
 Loop

'Insert column after every column and add a COUNTIF calculation for every distinct value from origin_raw
    x = 1
    y = 1
 Do Until x = columnCount
    s2.Columns(y + 1).Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.ColumnWidth = 3.29
    Cells(6, y + 1).Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(origin_data!C[-1],origin_analysis!RC[-1])"
    Cells(6, y + 1).Select
    Selection.FormatConditions.AddDatabar
    Selection.FormatConditions(Selection.FormatConditions.Count).ShowValue = True
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1)
        .MinPoint.Modify newtype:=xlConditionValueAutomaticMin
        .MaxPoint.Modify newtype:=xlConditionValueAutomaticMax
    End With
    With Selection.FormatConditions(1).BarColor
        .Color = 2668287
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).BarFillType = xlDataBarFillSolid
    Selection.FormatConditions(1).Direction = xlContext
    Selection.FormatConditions(1).NegativeBarFormat.ColorType = xlDataBarColor
    Selection.FormatConditions(1).BarBorder.Type = xlDataBarBorderNone
    Selection.FormatConditions(1).AxisPosition = xlDataBarAxisAutomatic
    With Selection.FormatConditions(1).AxisColor
        .Color = 0
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).NegativeBarFormat.Color
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
        Formula1:="=0"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.AutoFill Destination:=Range(Cells(6, y + 1), Cells(RowCount, y + 1))

    x = x + 1
    y = y + 2
 Loop

1 Ответ

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

Я думал, что выложу ответ, на который случайно наткнулся, который работает, на случай, если он будет интересен кому-либо еще.

ActiveCell.FormulaR1C1 = "=COUNTIF(origin_data!C[" & x - y - 1 & "],origin_analysis!RC[-1])"

Теперь это работает удовольствие! Спасибо Скотту Крейнеру за помощь, высоко ценимую

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