Se può essere utile per meglio indirizzare una soluzione, ho provato nel frattempo ad utilizzare degli Array ma non ho avuto risultati migliori, anzi il contrario. Ho copiato la query "BDG" in un array v1 e poi ho popolato un array V2 (dimensionato con lo stesso numero di "righe" di v1 e con un numero di colonne pari al numero di campi di "elab_bdg") usando le stesse routine che ho riportato sopra, senza miglioramenti. Qui sotto il codice
Sub prova2()
Dim rst As DAO.Recordset
Dim xlApp As Excel.Application
Dim v1 As Variant
Dim v2 As Variant
anno_bdg = 2018
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
Set rst = CurrentDb.OpenRecordset("BDG")
xlSheet.Range("A1").CopyFromRecordset rst
Set rTable = xlSheet.Range("A1").CurrentRegion
v1 = rTable.Value
a = rTable.Rows.Count
b = rTable.Columns.Count
Set rTable = Nothing
xlApp.Visible = True
xlBook.Close (False)
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
ReDim v2(a, 31)
For i = 1 To a
v2(i, 1) = v1(i, 1) 'articolo
v2(i, 2) = v1(i, 2) 'fornitore
'Nr lotti di acquisto annuo:
If v1(i, 13) > 0 Then
v2(i, 3) = IIf(v1(i, 17) > v1(i, 20), v1(i, 17), v1(i, 20)) / v1(i, 13)
Else: v2(i, 3) = Null
End If
'VarPrInflasCls:
anno_list = Year(v1(i, 10))
If anno_list < Year(Now()) And Not IsNull(v1(i, 10)) Then
If anno_list < 2003 Then RifCls = "var.med" Else RifCls = v1(i, 26)
strSQL = "SELECT * from [cls_merc] WHERE CodCls = '" & RifCls & "' AND Anno = " & anno_bdg - 1
Set qry_cls = CurrentDb.OpenRecordset(strSQL)
qry_cls.MoveFirst
IndClsAct = qry_cls.Fields("Indice")
qry_cls.Close
Set qry_cls = Nothing
strSQL = "SELECT * from [cls_merc] WHERE CodCls = '" & RifCls & "' AND Anno = " & anno_list
Set qry_cls = CurrentDb.OpenRecordset(strSQL)
qry_cls.MoveFirst
IndClsPrec = qry_cls.Fields("Indice")
qry_cls.Close
Set qry_cls = Nothing
v2(i, 4) = IndClsAct / IndClsPrec - 1
Else:
v2(i, 4) = 0
End If
Next i
End Sub