Excel Range.replace方法不替换任何内容

Excel Range.replace方法不替换任何内容,excel,vba,array-formulas,Excel,Vba,Array Formulas,我已经用更简单的公式尝试并测试了这个方法,它工作得非常好,但是当我用新的更长的公式尝试它时,它将FormulaPart1输入范围(“J2”),但不会将文本替换为FormulaPart2和FormulaPart3。代码也没有给出任何错误 基本上,该公式计算可用性%,即 ((Available Hours - Engineering Downtime)/ Available Hours) * 100 请看下面我的代码 Sub ArrayFormCalc() Dim FormulaPart1 As

我已经用更简单的公式尝试并测试了这个方法,它工作得非常好,但是当我用新的更长的公式尝试它时,它将
FormulaPart1
输入
范围(“J2”)
,但不会将文本替换为
FormulaPart2
FormulaPart3
。代码也没有给出任何错误

基本上,该公式计算可用性%,即

((Available Hours - Engineering Downtime)/ Available Hours) * 100
请看下面我的代码

Sub ArrayFormCalc()

Dim FormulaPart1 As String
Dim FormulaPart2 As String
Dim FormulaPart3 As String
Dim S1 As Worksheet

Set S1 = Sheets("Sheet1")

FormulaPart1 = "=IFERROR(((INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0)" & _
               ",MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0))))-xxxxx,"""")"

FormulaPart2 = "SUMIFS(DT_Cur_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_Strt_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime"")" & _
               "+SUMIFS(DT_Nxt_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_End_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime""))/yyyy"

FormulaPart3 = "(INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0)," & _
               "MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0))*100)"

Application.ReferenceStyle = xlR1C1

With S1.Range("J2")
    .FormulaArray = FormulaPart1
    .Replace "xxxxx", FormulaPart2, xlPart
    .Replace "yyyy", FormulaPart3, xlPart
End With

Application.ReferenceStyle = xlA1

End Sub

我无法确定确切的问题,但有一种可能性是,在尝试替换内容之前,您正在向数组中写入一个无效的公式。 我建议在字符串前面使用replace公式,只将最终结果粘贴到FormulaArray中。

我无法确定确切的问题,但有一种可能是您在尝试替换内容之前在数组中写入了无效的公式。 我建议在字符串前面使用replace公式,只将最终结果粘贴到FormulaArray中。

除非您的应用程序设置为使用R1C1引用,否则您试图将R1C1引用放入现有A1样式的公式中,但该公式不起作用。要么将应用程序更改为R1C1样式,添加公式,然后将其放回原处,要么将两个替换零件更改为使用A1样式引用。

除非应用程序设置为使用R1C1引用,否则您将尝试将R1C1引用放进现有A1样式公式中,但该公式不起作用。要么将应用程序更改为R1C1样式,添加公式,然后将其放回原处,要么将两个替换部件更改为使用A1样式引用。

将其拆分以替换时,问题似乎确实出在公式的语法上

下面的代码包含公式的正确拆分

Sub ArrayFormCalc()

Dim FormulaPart1 As String
Dim FormulaPart2 As String
Dim FormulaPart3 As String
Dim S1 As Worksheet

Application.ReferenceStyle = xlR1C1

Set S1 = Sheets("Sheet1")

FormulaPart1 = "=IFERROR(INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0),MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0))-xxxxx*100,"""")"

FormulaPart2 = "(SUMIFS(DT_Cur_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_Strt_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime"")" & _
               "+SUMIFS(DT_Nxt_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_End_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime""))/yyyy"

FormulaPart3 = "(INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0),MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0)))"

With S1.Range("J2")
    .FormulaArray = FormulaPart1
    .Application.ReferenceStyle = xlR1C1
    .Replace "xxxxx", FormulaPart2, xlPart
    .Replace "yyyy", FormulaPart3, xlPart
    .Application.ReferenceStyle = xlA1
End With



End Sub

似乎问题确实出在公式的语法上,当将其拆分以替换时

下面的代码包含公式的正确拆分

Sub ArrayFormCalc()

Dim FormulaPart1 As String
Dim FormulaPart2 As String
Dim FormulaPart3 As String
Dim S1 As Worksheet

Application.ReferenceStyle = xlR1C1

Set S1 = Sheets("Sheet1")

FormulaPart1 = "=IFERROR(INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0),MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0))-xxxxx*100,"""")"

FormulaPart2 = "(SUMIFS(DT_Cur_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_Strt_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime"")" & _
               "+SUMIFS(DT_Nxt_Day_Hrs,DT_Equip,RC7,DT_Site,RC5,DT_End_Date,R5C,DT_Shift,RC6,DT_Cat,""Engineering Downtime""))/yyyy"

FormulaPart3 = "(INDEX(INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")),MATCH(RC6,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Shift""),0),MATCH(R5C,INDIRECT(RC5&""_""&TEXT(R5C,""mmm"")&""_Date""),0)))"

With S1.Range("J2")
    .FormulaArray = FormulaPart1
    .Application.ReferenceStyle = xlR1C1
    .Replace "xxxxx", FormulaPart2, xlPart
    .Replace "yyyy", FormulaPart3, xlPart
    .Application.ReferenceStyle = xlA1
End With



End Sub


可能您的替换函数是对单元格J2的值而不是对公式执行的。@SNicolaou-可能,但我不是100%确定“对单元格J2的值而不是对公式”是什么意思?我的意思是,执行如下操作:对S1.Range(“J2”).FormulaArray=FormulaPart1.FormulaArray.replace“xxxxx”,FormulaPart2,xlPart.FormulaArray.Replace“yyyy”,FormulaPart3,xlPart End with可能您的替换函数是对单元格J2的值而不是对公式执行的。@SNicolaou-可能,但我不是100%确定“对单元格J2的值而不是对公式执行”是什么意思?我的意思是,执行类似以下操作:使用S1.Range(“J2”).FormulaArray=FormulaPart1.FormulaArray.Replace“xxxxx”,FormulaPart2,xlPart.FormulaArray.Replace“yyyy”,FormulaPart3,xlPart End With当我预先使用替换公式时,它会使我返回到我的原始错误“无法设置范围类的FormulaArray属性”好,对于我来说,不清楚错误是在这个超级复杂公式的语法中,还是写入FormulaArray通常会给您带来麻烦。也许可以先尝试编写一个简单得多的数组公式,比如
=SUM(如果(R1C1:R5C1=4,1,0))
,也可以尝试将公式分成3列,然后根据第一个公式进行计算。您可能会发现语法错误出现在3列中的一列中。编辑:看起来您只需要两列(可用小时数和停机时间);-)我想你是对的。我需要将这个问题分解为基本问题才能找到问题所在。当我预先使用替换公式时,它会让我回到我最初的错误“无法设置range类的formulaArray属性”好吧,对我来说,不清楚错误是否在这个超复杂公式的语法中,或者如果写入FormulaArray通常会给您带来麻烦。也许可以先尝试编写一个简单得多的数组公式,比如
=SUM(如果(R1C1:R5C1=4,1,0))
,也可以尝试将公式分成3列,然后根据第一个公式进行计算。您可能会发现语法错误出现在3列中的一列中。编辑:看起来您只需要两列(可用小时数和停机时间);-)我想你是对的。我需要将此问题分解为基本问题才能找到问题所在。我刚刚尝试了你的两个建议,但仍然无法替换。Range.FormulaArray始终在R1C1中工作,不依赖于程序设置。@Rob
FormulaArray
会,但一旦公式在单元格中,
Replace
无法将
R1C1
引用放入具有A1样式公式的单元格中。啊,好的一点,但我认为程序连第一部分都写不出来,因为公式包含无效语法,即
-xxxxx
@1Charlie我怀疑你的公式不正确,由于这两种方法都不起作用:
.FormulaR1C1=Replace(Replace(FormulaPart1,“xxxxx”,FormulaPart2),“yyyy”,FormulaPart3)
我刚刚尝试了你的两种建议,但仍然无法替换。Range.FormulaArray始终在R1C1中工作,对程序设置没有依赖性。@Rob
FormulaArray
,但是,一旦公式在单元格中,
Replace
将无法将
R1C1
引用放入具有A1样式公式的单元格中。啊,这是一个很好的观点,但我认为程序连第一部分都写不出来,因为公式包含无效语法,即
-xxxxx
@1Charlie我怀疑你的公式不正确,因为这也不起作用:
.FormulaR1C1=Replace(Replace(FormulaPart1,“xxxxx”,FormulaPart2),“yyy”,FormulaPart3)