2017-09-21 1 views
0

J'ai une série de fonctions pour chacune des colonnes listobject. Le fichier est lourd et plante, donc je veux juste garder les résultats de chaque formule en tant que valeurs statiques. Je peux allouer des formules à la gamme et demander à Excel de convertir la gamme en valeur. Mais je me demande s'il existe un moyen de demander à VBA d'écrire uniquement les valeurs statiques dans la plage au lieu de la formule elle-même. Voici ce que j'ai jusqu'à présent:comment écrire les résultats d'une formule directement dans une plage Excel par code VBA

Sub calculate2() 
Dim i As Long, t As Long 
t = Timer 
    With Sheet3.ListObjects(1) 
     For i = 3 To 9 
     .ListColumns(i).DataBodyRange.ClearContents 
     .Range.Cells(2, i).Formula = sheets3.range("formula").cells(i,1).formula 
     .ListColumns(i).DataBodyRange = .ListColumns(i).DataBodyRange.Value 
     Next i 
    End With 
Debug.Print Timer - t 
End Sub 
+1

Avez-vous essayé '.Range.Cells (2, i) .Value =. ListColumns (i) .Total'? – UGP

+0

Hé, En fait, je n'utilise que la ligne totale pour garder mes formules. quelque chose comme ceci est stocké là. '= IFERROR (SI (COUNTIFS ('ZZ84'! $ B: $ B, [@ WO], 'ZZ84'! $ E: $ E," = * V99 ", 'ZZ84'! $ L: $ L , "<>") = 1,1, SI (SUMIFS ('ZZ84'! $ G: $ G, 'ZZ84'! $ B: $ B, [@ WO], 'ZZ84'! $ L: $ L, "")/((SUMIFS ('ZZ84'! $ G: $ G, 'ZZ84'! $ B: $ B, [@ WO]))/10)/10 = 1,0,1-SUMIFS ('ZZ84 '! $ G: $ G,' ZZ84 '! $ B: $ B, [@ WO],' ZZ84 '! $ L: $ L, "")/((SUMIFS (' ZZ84 '! $ G: $ G , 'ZZ84'! $ B: $ B, [@ WO]))/10) /10-0.01)), "")) 'J'ai changé le code. La formule est une chaîne de texte commençant par = –

Répondre

0

En réponse à ma propre question, Ce que je cherchais est: « Application.Evaluate » Je signale que si quelqu'un est venu ici par la recherche peut trouver l'idée et la solution que j'ai finalement trouvées. Voici un exemple:

Sheet3.ListObjects(1).ListColumns(3).DataBodyRange = [IFERROR(IF(COUNTIFS(ZZ84!$B:$B,[WO],ZZ84!$E:$E,"=*V99"‌​,ZZ84!$L:$L,"<>")=1,1,0),"")] 

dans ce cas, il n'y a pas besoin de boucle et pour chaque plage doit écrire la ligne code nécessaire (Intégrer la fonction en VBA, ce que je cherchais excatly). La seule différence dans la fonction ci-dessus avec la mise directe dans une cellule Excel est l'utilisation de [WO] au lieu de [@WO]. Ainsi, évaluat calcule un tableau de données et l'écrit directement dans la plage spécifiée. (ici gamme de corps des colonnes de la liste 3).

Pour moi, il m'a aidé à éviter les accidents en raison du calcul de voilate par mes fonctions.

Un autre exemple simple serait:

range("b1:b10")=[if(row(1:10),if(a1:a10>3,"big","Small"))] 

ou

range("b1:b10") = evaluate("if(row(1:10),if(" & range("a1:a10").address&">3,""big"",""small""))") 

Meilleures salutations, M