将 Excel 数组公式转换为 VBA 代码
converting Excel array formula to VBA code
大家好
我在 excel 中得到了这个数组公式,我想将它合并到 VBA 代码中,但它给我一个无法设置 FormulaArray
属性 的错误范围 class(错误 1004)
这是我在代码中修改后的公式
"=IF(SUMPRODUCT(--(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E='الجمعة'))))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"
这是完整的代码
Option Explicit
Option Base 1
Dim wrk As Workbook, DataSH As Worksheet, CurrentSH As Worksheet
Dim FirstCol As Integer, EmpRow As Integer, EmpID As String
Dim GetEmpRowLoop As Integer, StartingEmpCol As Integer
Dim StartColLoop As Integer, EndingEmpCol As Integer
Dim EndColLoop As Integer
Public Sub Macro1()
Set wrk = ThisWorkbook
Set DataSH = wrk.Worksheets("الاجازات ")
Set CurrentSH = wrk.ActiveSheet
If CurrentSH.Name = DataSH.Name Then
MsgBox "Please Navigate to an Active Sheet", vbCritical
Exit Sub
End If
EmpID = CurrentSH.Range("d2").Value
For GetEmpRowLoop = 9 To CurrentSH.Cells(Cells.Rows.Count, 2).End(xlUp).Row
If CurrentSH.Cells(GetEmpRowLoop, 2).Value = EmpID Then
EmpRow = GetEmpRowLoop
Exit For
End If
Next GetEmpRowLoop
For StartColLoop = 4 To CurrentSH.Cells(EmpRow, Cells.Columns.Count).End(xlToRight).Column
If CurrentSH.Cells(7, StartColLoop).Value = CurrentSH.Range("D3").Value Then
StartingEmpCol = StartColLoop
Exit For
End If
Next StartColLoop
For EndColLoop = 4 To CurrentSH.Cells(EmpRow, Cells.Columns.Count).End(xlToRight).Column
If CurrentSH.Cells(7, EndColLoop).Value = CurrentSH.Range("D4").Value Then
EndingEmpCol = EndColLoop
Exit For
End If
Next EndColLoop
CurrentSH.Range(Cells(EmpRow, StartingEmpCol), Cells(EmpRow, StartingEmpCol)).FormulaArray = _
"=IF(SUMPRODUCT(--(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E='الجمعة'))))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"
End Sub
我正在尝试确定公式本身或结果是否无关紧要。
您需要将单引号 (') 替换为双引号 ("")。但是,您需要加倍引用...
(NOT(E=""الجمعة""))
顺便说一下,SUMPRODUCT
没必要。以下应该足够了...
.Formula = "=IF(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E=""الجمعة""))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"
大家好
我在 excel 中得到了这个数组公式,我想将它合并到 VBA 代码中,但它给我一个无法设置 FormulaArray
属性 的错误范围 class(错误 1004)
这是我在代码中修改后的公式
"=IF(SUMPRODUCT(--(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E='الجمعة'))))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"
这是完整的代码
Option Explicit
Option Base 1
Dim wrk As Workbook, DataSH As Worksheet, CurrentSH As Worksheet
Dim FirstCol As Integer, EmpRow As Integer, EmpID As String
Dim GetEmpRowLoop As Integer, StartingEmpCol As Integer
Dim StartColLoop As Integer, EndingEmpCol As Integer
Dim EndColLoop As Integer
Public Sub Macro1()
Set wrk = ThisWorkbook
Set DataSH = wrk.Worksheets("الاجازات ")
Set CurrentSH = wrk.ActiveSheet
If CurrentSH.Name = DataSH.Name Then
MsgBox "Please Navigate to an Active Sheet", vbCritical
Exit Sub
End If
EmpID = CurrentSH.Range("d2").Value
For GetEmpRowLoop = 9 To CurrentSH.Cells(Cells.Rows.Count, 2).End(xlUp).Row
If CurrentSH.Cells(GetEmpRowLoop, 2).Value = EmpID Then
EmpRow = GetEmpRowLoop
Exit For
End If
Next GetEmpRowLoop
For StartColLoop = 4 To CurrentSH.Cells(EmpRow, Cells.Columns.Count).End(xlToRight).Column
If CurrentSH.Cells(7, StartColLoop).Value = CurrentSH.Range("D3").Value Then
StartingEmpCol = StartColLoop
Exit For
End If
Next StartColLoop
For EndColLoop = 4 To CurrentSH.Cells(EmpRow, Cells.Columns.Count).End(xlToRight).Column
If CurrentSH.Cells(7, EndColLoop).Value = CurrentSH.Range("D4").Value Then
EndingEmpCol = EndColLoop
Exit For
End If
Next EndColLoop
CurrentSH.Range(Cells(EmpRow, StartingEmpCol), Cells(EmpRow, StartingEmpCol)).FormulaArray = _
"=IF(SUMPRODUCT(--(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E='الجمعة'))))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"
End Sub
我正在尝试确定公式本身或结果是否无关紧要。
您需要将单引号 (') 替换为双引号 ("")。但是,您需要加倍引用...
(NOT(E=""الجمعة""))
顺便说一下,SUMPRODUCT
没必要。以下应该足够了...
.Formula = "=IF(($D=$B9)*(E>=$D)*(E<=$D)*(NOT(E>=1))*(NOT(E=""الجمعة""))=1;VLOOKUP($D;LeavesTypes;2;0);"""")"