VBA中的FormulArray没有给出正确的结果

时间:2017-08-09 02:31:53

标签: vba

我是住宅业主协会的办公室负责人。我以excel表格跟踪费用和收据,并生成包含违约者名单和已付款人员的rct详细信息的摘要。我创建了一个带有col到A到J的支付分类帐。摘要状态列表在col M到V.我使用数组公式计算" rct no。"或者"没有付款"状态扫描通过Ledger表。

由于数组计算速度很慢,我想用宏替换单个计算。我创建了一个简单的示例宏来使用简单的formulaArray,因为完整的公式会返回错误。

此宏被称为" test"。但是,当我运行它时,它没有为变量" final"提供正确的值。这是N5的价值。代码可能效率不高,但它只是尝试并使其首先工作。欢迎使用最后一行的任何帮助。请参阅示例excel文件的链接。

Sub test()
    Dim rct As String
    Dim dday As String
    Dim ddate As String
    Dim dmonth As String
    Dim dyear As String
    Dim final As Variant

    Range("z3").FormulaArray = "=INDEX($A$1:$I$200,MATCH(1, (Month_Adjusted=N$2)*(Flat_No=$M5),0),6)"
    Range("aa3").FormulaArray = "=INDEX($A$1:$I$200,MATCH(1, (Month_Adjusted=N$2)*(Flat_No=$M5),0),1)"
    rct = Range("z3").Value
    Range("ab3").Formula = "=day(aa3)"
    dday = Range("ab3").Value
    Range("ac3").Formula = "=MONTH(aa3)"
    dmonth = Range("ac3").Value
    Range("ad3").Formula = "=YEAR(aa3)"
    dyear = Range("ad3").Value
    final = Application.concatenate(rct & "" / "" & dday & "" - "" & dmonth & "" - "" & dyear)
    Range("n5").Value = final
End Sub

在非VBA表格中的单元格N5处使用的实际公式是

=IF(ISERROR(CONCATENATE((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$M5),0),6)),"    /    ",DAY((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1))),"-",MONTH((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1))),"-",YEAR((INDEX($A$1:$K$j58,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1))))),"Not Paid",CONCATENATE((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),6)),"    /    ",DAY((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1))),"-",MONTH((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1))),"-",YEAR((INDEX($A$1:$j$958,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m5),0),1)))))

check non sample sheet here

2 个答案:

答案 0 :(得分:1)

你的话说

final = Application.concatenate(rct & "" / "" & dday & "" - "" & dmonth & "" - "" & dyear)

有两个双引号,我怀疑你只想要一个,即

final = Application.concatenate(rct & "  /  " & dday & "-" & dmonth & "-" & dyear)

但是使用Concatenate来连接什么只是单个字符串值没有意义,你可以使用:

final = rct & "  /  " & dday & "-" & dmonth & "-" & dyear

并且,由于您的ddaydmonthdyear值都只是由一个日期确定,因此可以替换为:

final = rct & "  /  " & Format(Range("AA3").Value, "dd-mm-yyyy")

(严格来说,您目前使用"d-m-yyyy"格式生成日期,但IMO "dd-mm-yyyy"通常会在您的输出中看起来更好。)

答案 1 :(得分:0)

感谢各位的帮助。现在我已经能够使用适当的错误处理来使代码工作。由于没有给定月份或给定公寓的记录导致“N / A”值转换为类型不匹配错误,因此我认为存在一些错误。现在我已经处理好了。

问题是我希望将固定值N $ 2,$ M3和Range(“n3”)替换为合适的迭代过程,以便我可以逐步通过矩阵M10:v10逐个计算每个单元格的值。我尝试使用变量里面像(Month_Adjusted = N $ i)和(Flat_No = $ Mj)和Range(“ni”)。值= final但它在“formulaarray”计算中给出了问题。抛出的错误是“无法设置范围类的formulaArray属性”任何帮助表示赞赏

Sub test_working()

'用于计算N3处的一个单元的最终工作代码

Dim rct As String
Dim dday As String
Dim ddate As String
Dim dmonth As String
Dim dyear As String
Dim final As Variant

Worksheets("Ledger").Select
Range("z3").FormulaArray = "=INDEX($A$1:$I$200,MATCH(1,(Month_Adjusted=N$2)*(Flat_No=$M3),0),6)"
Range("aa3").FormulaArray = "=INDEX($A$1:$I$200,MATCH(1,(Month_Adjusted=n$2)*(Flat_No=$m3),0),1)"
Range("z4").Formula = "=if(iserror(z3),""Not Paid"",z3)"
Range("aa4").Formula = "=if(iserror(aa3),""**"",aa3)"
rct = Range("z4").Value
final = rct & "  /  " & Format(Range("AA4").Value, "dd-mm-yyyy")
Range("n3").Value = final
end Sub