【发布时间】:2020-03-03 23:08:00
【问题描述】:
背景
我有一个脚本,它在表中每个现有列之后插入一列,需要在其中插入一个 COUNTIF 公式,其中范围和条件基于两个不同的循环变量。
对于第一个公式,我可以使 R1C1 公式正常工作,但由于范围和标准与其位置不成比例,因此 R -1 和 C -1 在我的公式中不起作用。
脚本目的
这是我需要更改的 COUNTIF 作为 FormulaR1C1 的脚本。
脚本的第一部分循环从工作表“origin_data”的每一列中获取数据,并将其放入工作表“origin_analytics”的同一列中,并在此过程中删除重复值。
该过程的第二部分有一个循环来设置要在工作表“origin_analytics”中的每一列之后插入的 COUNTIF 列。它将值 x 设置为 origin_data 列号(每次递增 1),并将 y 作为 origin_analytics 表(每次递增 2 以将先前插入的列考虑在内)。
当我创建公式时,我输入第 6 行第 y + 1 列。公式是COUNTIF(x:x, y)。完成后,它会格式化并自动填充到最后一行(由 sub 前面的 origin_data RowCount 设置)。
我尝试失败的最后一个版本的 COUNTIF 是:
s2.Cells(6, y + 1) = WorksheetFunction.CountIf(Sheets("origin_data").Range(Sheets("origin_data").Cells(1, x), Sheets("origin_data").Cells(Rows.Count, x)), Sheets("origin_analytics").Cells(6, y))
问题
我收到的错误消息是 run-time error '9' Subscript out of range,我认为这是因为 VBA 中的 COUNTIF 不喜欢工作,除非在 FormulaR1C1 中。是否有可能拥有其中之一,包括使用变量?
感知解决方案
如果我可以将范围从 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
【问题讨论】: