Coller une variable tableau

Résolu/Fermé
Kenzonal - 28 août 2009 à 16:21
 kenzonal - 1 sept. 2009 à 11:20
Bonjour,

J’ai un souci d’optimisation d’exécution de mon programme VBA. Il s’exécute en 25 minutes, et mon objectif est qu’il se fasse en moins de 15…
Afin d’éviter de faire rentrer la valeur à la fin de chaque fin de calcul à l’emplacement voulu (car finalement, c’est l’action coller qui prend beaucoup de temps), j’ai créé une variable tableau qui prend les valeurs au préalable calculées. J’ai pour objectif de faire le moins de collés possibles, donc j’aimerai coller ligne par ligne (en gros j’ai 58 lignes qui contiennent chacune 41 données).
Le problème c’est que je ne sais pas trop comment faire pour imprimer ma variable tableau sur la feuille excel ^^. Comment est ce possible sans faire une boucle sur les lignes et sur les colonnes ?

Je vous remercie pour votre aide et votre disponibilité

Kenzonal
A voir également:

8 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
31 août 2009 à 14:16
Bonjour ,

dans ce genre de problème, il faudrait que tu crées un tableau non de cellules mais de variables

je te conseille ce lien pour créer les vatriables-tableaux (gain de temps temps par rapport à égalité de cellule : 20 ):
https://silkyroad.developpez.com/vba/tableaux/

une fois construit, la restitution est rapide:
adresse de ta cellule de départ pour restituer par exemple sheet(2).range ("B2")
resize(nbre de lignes du tableau-1, nombre de colonnes du tableau-1) agrandit le nomvbre de lignes et colonnes
=tableau
soit
sheets(2).range ("B2").resize(57,39)=montab
maintenant,si tu bloques, il serait peur être intéressant que tu nous montres 1 extrait de la feuille de départ avec les paramêtres que tu désires pour sélectionner (sexe, age, autres???)


1
En fait tu as des while imbriqués au début de ta macro. J'ai l'impression que ce sont eux qui te prennent tout ton temps. As-tu vérifié ?

Il faudrait surtout faire le
f.EnableCalculation = False
Application.ScreenUpdating = False
dès le début de ta macro.
1
je suis débutante j'ai oublié de le préciser...

mais je pensais utiliser ceci:

Set F_destination_h = Worksheets("feuil2")
Set F_destination_f = Worksheets("feuil3")

lignepph.Copy
F_destination_h.Activate
Lignedestinationh = F_destination.Range("A65356").End(xlUp).Row + 1
F_destination_h.Range("B" & Lignedestinationh).Select
ActiveSheet.PasteApplication.CutCopyMode = False


Qu'en pensez vous?

Merci beaucoup...
0
Bonjour


Dans les traitement répétitifs, tu peux gagner beaucoup de temps :
. en inhibant le calcul automatique (sinon toute ta feuille est recalculée à chaque coller, à toi de voir si tu as besoin de ce recalcul. souvent c'est non)
. en inhibant la mise à jour de l'affichage sinon là encore la page est redessinée des tas de fois et c'est très long

dim f as worksheet

set f=activeWorksheet ' ou la feuille dans laquelle tu vas écrire
f.EnableCalculation=false ' pas de calcul automatique
application.ScreenUpdating=False ' pas de mise à jour de l'affichage

... ton traitement long

f.EnableCalculation=true
f.calculate
application.ScreenUpdating=True
0
merci beaucoup pour la rapidité de votre réponse

j'ai lancé le programme, je changerais le statut si cela m'a permis de réduire le temps d'exécution!

Bon week end

Kenzonal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Le programme s'exécute en 25 minutes, j'ai donc gagné quelques minutes mais il semblerait que ce soit bel et bien le copié collé qui prenne du temps... Le calcul des données et le remplissage de la variable tableau est rapide.

Il n'y a vraiment aucun autre moyen pour diminuer le temps du collé du tableau?

Merci beaucoup

kenzonal
0
Il n'y a aucune raison que la recopie de 58 lignes de 41 données prenne 25 minutes. Peux-tu montrer le script qui prend tout ce temps ?
0
voici mon programme, en fait je colle deux tableaux de 58 lignes et 40 colonnes chacun (un pour les hommes, l'autre pour les femmes). Voici le script (j'ai retiré les parties qui n'intéressent personne lol):

Sub Macro8()

(déclaration des variables et initialisation)

While age < 76

Worksheets("test").Cells(9, 2).Value = age

While Worksheets("feuil2").Cells(1, k).Value > 0

Worksheets("test").Cells(11, 2).Value = Worksheets("feuil2").Cells(1, k).Value

i = 2
While i < 483

numerateurh = numerateurh + Worksheets("test").Cells(i, 8).Value * Worksheets("test").Cells(i, 16)
denominateur = denominateur + Worksheets("test").Cells(i, 11).Value * Worksheets("test").Cells(i, 16).Value * Worksheets("test").Cells(i, 17).Value * Worksheets("test").Cells(i, 19).Value

If Worksheets("feuil2").Cells(i + 1, 8).Value <> 0 Then
i = i + 1

Else
i = 490
End If

Wend

numerateurf = numerateurh / (Worksheets("test").Cells(2, 9).Value / Worksheets("test").Cells(2, 8).Value)

pph = numerateurh * Worksheets("test").Cells(8, 24).Value / denominateur * 12
ppf = numerateurf * Worksheets("test").Cells(8, 24).Value / denominateur * 12
lignepph(age - 17, k - 3) = pph
ligneppf(age - 17, k - 3) = ppf
k = k + 1

Wend

i = 2
k = 4
ligne = ligne + 1
age = age + 1

Wend

Dim f As Worksheet

Set f = Sheets("feuil2")
f.EnableCalculation = False
Application.ScreenUpdating = False


For a = 2 To 59
For l = 4 To 44
With Sheets("feuil2")
.Cells(a, l) = lignepph(a - 1, l - 3)
.Cells(a + 63, l) = ligneppf(a - 1, l - 3)
End With
Next l
Next a

f.EnableCalculation = True
f.Calculate
Application.ScreenUpdating = True

End Sub
0
je m'étais déjà un peu penchée sur les tableaux de variables, mais comme je rentre comme valeur dans la cellule de mon tableau le résultat d'un sommeprod entre trois colonnes de l'autre onglet, divisé par un autre sommeprod de deux colonnes du mm tableau, j'étais bloquée...
Ceci dit, je vais lire attentivement le document que vous m'avez envoyé, et je trouverai peut être une astuce

Je crains de ne pas pouvoir envoyer le fichier qui est confidentiel, mais en gros il s'agit de versements probables que je dois multiplier avec des coef et sommer par la suite (premier sommeprod) et que je divise avec les versements réalisés (deuxième sommeprod avec les mêmes coef)... Un peu dur à expliquer, et dur pour vous à comprendre peut être!

merci

Kenzonal
0
oui j'ai remplacé tous les while en codant une sorte de sommeprod , on verra ce que ça va donner, je viens de lancer le programme.

j'ai mis le

f.EnableCalculation = False
Application.ScreenUpdating = False

au début

je vous tiens au courant. Encore merci pour votre aide

Kenzonal
0
Bonjour,

en utilisant le code pour éviter l'actualisation de la page, et avec un tableau de variables, j'ai un temps d'exécution de 11 minutes. Objectif atteint!

Je vous remercie sincèrement pour votre aide, et à bientot pour de nouvelles aventures peut être!

kenzonal
0