简体   繁体   中英

VBA won't translate vba reference into excel reference

Good morning all,

I have a problem with vba translating formulas into excel:

I've got this code:

'Tramos para calcular el total, mañana, tarde y noche
TramoIni = Array(4, 20, 36, 4)
TramoFin = Array(51, 35, 51, 19)

'Formulas
FormulaTramo = _
    Array("=SUMIFS('Mapa Turnos'!C[4],'Mapa Turnos'!C1,RC1,'Mapa Turnos'!C3,RC2)/30", _
        "=R[-1]C*(1-SUM(R[5]C:R[8]C))", _
    "=IFERROR(IF(IFERROR((R[13]C*R[-1]C*1800)/R[3]C,0)/R[2]C>1,1," _
        & "IFERROR((R[13]C*R[-1]C*1800)/R[3]C,0)/R[2]C),0)", _
    "=sla(IF(R[-2]C=0,0,IF(R[-2]C<1,1,R[-2]C)),INDIRECT(ADDRESS(MATCH(RC2,Objetivos!C2,0),4," _
        & ",,""Objetivos"")),R[1]C,R[2]C)", _
    "=IF(AND(R[-7]C>0,R[-11]C=0),""SI"",""NO"")", _
    "=1", _
    "=1", _
    "=SUM(RC1:RC2)", _
    "=R[-11]C-R[-2]C", _
    "=CallCapacity(R[-12]C,INDIRECT(ADDRESS(MATCH(RC2,Objetivos!C2,0),3," _
        & ",,""Objetivos"")),INDIRECT(ADDRESS(MATCH(RC2,Objetivos!C2,0),4,,,""Objetivos"")),R[-8]C)", _
    "=IF(R[-1]C>R[-10]C,R[-10]C,R[-1]C)", "=Utilisation(R[-14]C,R[-11]C,R[-10]C)")

LastRow = ws.Range("A100000").End(xlUp).Row
Col = ws.Range("XDF4").End(xlToLeft).Column
ColTotal = ws.Cells.Find("Total").Column
ColF = ColTotal - 1
ColMañana = ws.Cells.Find("Mañana").Column
ColTarde = ws.Cells.Find("Tarde").Column
ColNoche = ws.Cells.Find("Noche").Column
For i = 1 To UBound(KPI)
    ws.Range(ws.Cells(4, 1), ws.Cells(LastRow, Col)).AutoFilter Field:=3, Criteria1:=KPI(i)
    If KPI(i) <> "5.Pronóstico" And KPI(i) <> "92.Requeridos" Then
        With ws.Range(ws.Cells(5, 4), ws.Cells(LastRow, ColF)).SpecialCells(xlCellTypeVisible)
            .FormulaR1C1 = "'" & FormulaTramo(i - 1)
        End With
    End If
    For x = 0 To UBound(TramoIni)
        'Formulas total, mañana, tarde y noche
        FormulaTotal = _
            Array("=SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")/2", _
                "=SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")/2", _
                "=IFERROR(IF(SUMPRODUCT(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ",R[2]C" & TramoIni(x) & _
                    ":R[2]C" & TramoFin(x) & ")/R[2]C>1,1,SUMPRODUCT(RC" & TramoIni(x) & _
                    ":RC" & TramoFin(x) & ",R[2]C" & TramoIni(x) & ":R[2]C" & TramoFin(x) & ")/R[2]C),0)", _
                "=IFERROR(SUMPRODUCT(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ",R[1]C" & TramoIni(x) & _
                    ":R[1]C" & TramoFin(x) & ")/R[1]C,0)", _
                "=SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")", _
                "=SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")/2", _
                "=IF(COUNTIF(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ",""SI"")>0,""SI"",""NO"")", _
                "=IFERROR(SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")/2,0)", _
                "=SUM(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ")", _
                "=IF(R[-2]C>R[-10]C,R[-10]C,R[-2]C)", _
                "=IFERROR(IF(SUMPRODUCT(RC" & TramoIni(x) & ":RC" & TramoFin(x) & ",R[-14]C" & _
                    TramoIni(x) & ":R[-14]C" & TramoFin(x) & ")/R[-14]C>1,1,SUMPRODUCT(RC" & _
                    TramoIni(x) & ":RC" & TramoFin(x) & ",R[-14]C" & TramoIni(x) & ":R[-14]C" & _
                    TramoFin(x) & ")/R[-14]C),0)")
        With ws.Range(ws.Cells(5, TramoFin(0) + x + 1), ws.Cells(LastRow, TramoFin(0) + x + 1)). _
            SpecialCells(xlCellTypeVisible)
                .FormulaR1C1 = "'" & FormulaTotal(i - 1)
        End With
    Next x
Next i
ws.Rows(4).AutoFilter
x = ws.Range("A100000").End(xlUp).Row
i = ws.Range("XDF4").End(xlToLeft).Column
ws.Range(ws.Cells(5, 4), ws.Cells(x, i)).Value = ws.Range(ws.Cells(5, 4), ws.Cells(x, i)).Value

This is just some arrays containing formulas and the column where they should start taking values.

The thing is that the if, countif and sum aren't taking the cells references when going to excel:

转换之前

As you can see above every formula has the same cell reference, the one that vba has.

But later on when we convert it to excel (last line of code):

转换后

As you can see sumproducts worked well, but the rest are taking literally the column RC and the row which was supposed to be the column reference on VBA.

Any thoughts what could be doing this? I need to work like this because this worksheet can have up to 7k rows and 50+ columns with formulas in like the 80% of them so introducing the formulas in every loop would take ages, instead I'm doing this so they all recalculate at the same time.

This way still takes ages to calculate and I don't know if there is a more efficient way to input so many formulas which include erlangs and custom functions.

Any help would be appreciated! Thanks!

MCVE of the problem in question:

Range("A1").FormulaR1C1 = "'" & "=SUM(RC20:RC25)"
Range("A1").Value = Range("A1").Value

Formula in RC-notation is assigned to the Value property. Excel tries to recognize the formula type. There are only absolute references in this formula, so it looks like valid A1-notation relative formula.

Some of the formulas containing relative references (with square brackets) were correctly recognized as RC notation - because those would not be valid A1 formulas.

To solve the problem, array with formulas needs to be assigned to FormulaR1C1 property:

ws.Range(ws.Cells(5, 4), ws.Cells(x, i)).FormulaR1C1 = ws.Range(ws.Cells(5, 4), ws.Cells(x, i)).Value

Much better way to avoid long calculations during code execution is to disable automatic calculation:

Application.Calculation = xlCalculationManual
'all code here
Application.Calculation = xlCalculationAutomatic

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM