Excel 计算相对位置的计数公式1c1
背景 我有一个脚本,在表中的每个现有列之后插入一个列,需要在其中插入COUNTIF公式,其中范围和条件基于两个不同的循环变量 我可以让R1C1公式很好地工作,对于第一个公式,但是由于范围和标准与它们的位置不成正比,所以R-1和C-1在我的公式中不起作用 脚本目的Excel 计算相对位置的计数公式1c1,excel,vba,Excel,Vba,背景 我有一个脚本,在表中的每个现有列之后插入一个列,需要在其中插入COUNTIF公式,其中范围和条件基于两个不同的循环变量 我可以让R1C1公式很好地工作,对于第一个公式,但是由于范围和标准与它们的位置不成正比,所以R-1和C-1在我的公式中不起作用 脚本目的 'For each column, copy distinct values and paste into origin_analysis sheet Dim s1 As Worksheet, s2 As Worksheet, x
'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
这是一个脚本,其中COUNTIF作为公式1c1,我需要更改
脚本的第一部分循环从表单“origin_data”的每一列获取数据,并将其放入表单“origin_analytics”的同一列中,并在过程中删除重复值
流程的第二部分有一个循环,用于设置要插入工作表“origin_analytics”中每列之后的COUNTIF列。它将值x设置为原点数据列编号(每次递增1),并将y设置为原点分析表(每次递增2以将先前插入的列考虑在内)
当我创建公式时,我在第6行第y+1列中输入。公式是COUNTIF(x:x,y)
。完成后,它将格式化并自动填充到最后一行(由子行中前面的origin_data RowCount设置)
我尝试失败的COUNTIF的最后一个版本是:
s2.单元格(6,y+1)=工作表函数.CountIf(工作表(“原始数据”)。范围(工作表(“原始数据”)单元格s(1,x),表格(“原始数据”)。单元格(行数,x)),表格(“原始分析”)。单元格(6,y))
问题
'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
我得到的错误消息是运行时错误“9”下标超出范围,我认为这是因为VBA中的COUNTIF不喜欢工作,除非在公式1c1中。是否可能有一个包含变量的使用
感知解决方案
如果我可以将范围从R-1(相对于我当前的位置)设置为(x-y)-1
循环通过时公式R和C组合的示例:
B中的公式,R(原点分析!)=-1(A),C(原点分析!)=-1(A)
D中的公式,R(原点分析!)=-2(B),C(原点分析!)=-1(C)
F中的公式,R(原点分析!)=-3(C),C(原点分析!)=-1(E)
H中的公式,R(原点分析!)=-4(D),C(原点分析!)=-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
我想我会把我偶然发现的答案贴出来,以防其他人对此感兴趣
ActiveCell.FormulaR1C1=“=COUNTIF(origin\u data!C[”&x-y-1&“],origin\u analysis!RC[-1])”
现在它的工作待遇!感谢斯科特·克兰纳早些时候的帮助,非常感谢