2017-08-09 143 views
0

我是住宅業主協會的辦公室負責人。我用Excel表格記錄費用和收據,並生成包含欠款人名單和已付款人員詳細信息的摘要。我創建了一個列A到J的支付分類帳。彙總狀態列表以列M到V.我使用數組公式計算「rct no。」。或通過分類賬表掃描「未支付」狀態。FormulArray在VBA中沒有給出正確的結果

由於數組計算非常慢,我想用宏替換個別計算。我創建了一個簡單的示例宏來使用簡單的公式陣列,因爲完整的公式會返回錯誤。

該宏被稱爲「測試」。然而,當我運行它並沒有給出N5值的變量「final」的正確值。代碼可能效率不高,但只是嘗試並使其工作。歡迎任何幫助完成最後一行工作的幫助。請參閱示例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

回答

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"通常會在您的輸出中看起來更好。)

+0

感謝年幫助。我認爲問題在於單引號和雙引號。當在「公式」或「Formularrarray」中使用雙引號時,我需要修改代碼而不更改引號.final = Application.concatenate(rct&「」/「」&dday&「」 - 「」&dmonth &「」 - 「」&dyear)仍然返回類型不匹配錯誤,雖然我沒有看到不匹配錯誤。這條線是正確的(僅僅爲了學術上的利益) – rameshjey

+0

@rameshjey但是,當你可以在原生VBA中使用concatenate('&')時,不要使用'Application.Concatenate'(並且**正在做這件事)運算符 – YowE3K

+0

@ YowE3K不錯,它是mornng/night嗎?其實並不重要;) –

0

感謝大家的幫助。現在我已經能夠使代碼在適當的錯誤處理下工作。其中一些錯誤是由於以下事實造成的:一個給定的月份或給定的公寓中沒有記錄導致「N/A」值轉換爲類型不匹配錯誤。現在我已經處理了。

問題是我希望將固定值N $ 2,$ M3和Range(「n3」)替換爲合適的迭代過程,以便我可以逐步通過矩陣M10:v10逐個計算每個單元格的值。我嘗試在(Month_Adjusted = N $ i)和(Flat_No = $ Mj)和Range(「ni」)中使用變量。Value = 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