Q:我想使用VBA代碼在單元格中輸入數(shù)組公式,如何實(shí)現(xiàn)?
A:Range對象提供了一個(gè)FormulaArray屬性,可以用來設(shè)置或者返回單元格區(qū)域中的數(shù)組公式,也就是說,在工作表單元格中輸入完后需要按Ctrl+Shift+Enter組合鍵才能最終完成的公式。
如下所示,要求工作表Sheet2中所列出的水果總的銷售金額,即分別使用各種水果的單價(jià)乘以各自的銷量后的和。

其原因可能是有以下幾種。
原因1:試圖修改數(shù)組單元格區(qū)域中的某些單元格
例如下面的代碼:
Sheet3.Range(“B1:B6”).FormulaArray= “=A1:A6=”” Excel”””
Sheet3.Range(“B1”).Value= “excelperfect”
會(huì)導(dǎo)致錯(cuò)誤??梢韵扰袛嘁薷牡膯卧袷欠裉幱跀?shù)組公式區(qū)域,例如:
With Sheet3
.Range(“B1:B6″).FormulaArray =”=A1:A6=”” Excel”””
With .Range(“B1”)
If .HasArray Then
MsgBox “單元格處于數(shù)組公式區(qū)域” & .CurrentArray.Address
End If
End With
End With
原因2:試圖在合并單元格中輸入數(shù)組公式
如果先在單元格中輸入數(shù)組公式然后再和其他單元格合并,這沒有問題。然而,不能夠在已經(jīng)合并的單元格中輸入數(shù)組公式。例如,下面的代碼將失?。?/p>
With Sheet3
.Range(“C1:C6”).Merge
.Range(“C2″).FormulaArray =”=A1:A6=”” Excel”””
End With
可以先對要輸入數(shù)組公式的單元格進(jìn)行檢查:
With Sheet3
.Range(“C1:C6”).Merge
With .Range(“C1”)
If .MergeArea.Address = .Address Then
MsgBox “沒有合并單元格”
Else
MsgBox “單元格已合并,地址為: ” & .MergeArea.Address
End If
End With
End With
原因3:數(shù)組公式存在語法錯(cuò)誤,例如參數(shù)缺失或無效參數(shù)
WithSheet3.Range(“F1”)
‘SUM函數(shù)參數(shù)缺失
.FormulaArray = “=SUM()”
‘SUMIF函數(shù)的第1個(gè)參數(shù)和第3個(gè)參數(shù)不能接受數(shù)組
.FormulaArray = “=SUMIF((A1:A2 =1)*(B1:B2 ),B1,C1:C2 )”
End With
原因4:數(shù)組公式超過了255個(gè)字符
VBA幫助中指出,F(xiàn)ormulaArray屬性的值不能超過255個(gè)字符。若公式的字符超過255個(gè)字符,可以使用DailyDoseOfExcel介紹的技巧,使用Replace方法:
Public SubLongArrayFormula()
Dim theFormulaPart1 As String
Dim theFormulaPart2 As String
theFormulaPart1 =”=IF(MONTH(DATE(YEAR(NOW()),MONTH(NOW()),1))-” & _
“MONTH(DATE(YEAR(NOW()),MONTH(NOW()),1)-” & _
“(WEEKDAY(DATE(YEAR(NOW()),MONTH(NOW()),1))-1)+” & _
“{ ;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1),””””,”& _
“X_X_X())”
theFormulaPart2 =”DATE(YEAR(NOW()),MONTH(NOW()),1)-” & _
“(WEEKDAY(DATE(YEAR(NOW()),MONTH(NOW()),1))-1)+” & _
“{ ;1;2;3;4;5}*7+{1,2,3,4,5,6,7}-1)”
With ActiveSheet.Range(“E2:K7”)
.FormulaArray = theFormulaPart1
.Replace “X_X_X())”,theFormulaPart2
.NumberFormat = “m””月””d””日”””
End With
End Sub
上述程序?qū)⒃趩卧駞^(qū)域E2:K7中生成當(dāng)月的日歷。
正如本文一開始所的,F(xiàn)ormulaArray屬性還可以返回單元格中的公式。
如果想要從單個(gè)單元格中返回公式,那么無論單元格中是否包含數(shù)組公式,F(xiàn)ormula屬性和FormulaArray屬性都會(huì)返回相同的結(jié)果。然而,F(xiàn)ormula屬性和FormulaArray屬性應(yīng)用于連續(xù)的、多單元格區(qū)域時(shí)返回不同的結(jié)果。
如果單元格區(qū)域中含有數(shù)組公式,即多個(gè)單元格中為一個(gè)數(shù)組公式,那么FormulaArray屬性返回該公式。
如果單元格區(qū)域不是數(shù)組區(qū)域但所有單元格都包含相同的公式,那么FormulaArray屬性也返回該通用公式。
如果單元格區(qū)域不是數(shù)組區(qū)域且包含的公式不相同,那么FormulaArray屬性返回Null。
在上述所有三種情形中,F(xiàn)ormula屬性返回Variant型數(shù)組,數(shù)組中的每個(gè)元素表示區(qū)域中每個(gè)單元格的公式。






