Coller une variable tableau
Résolu/Fermé
A voir également:
- Coller une variable tableau
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Imprimer tableau excel sur une page - Guide
- Trier tableau excel - Guide
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
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???)
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???)
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.
Il faudrait surtout faire le
f.EnableCalculation = False
Application.ScreenUpdating = False
dès le début de ta macro.
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...
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...
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
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
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
Il n'y a vraiment aucun autre moyen pour diminuer le temps du collé du tableau?
Merci beaucoup
kenzonal
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 ?
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
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
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
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
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
j'ai mis le
f.EnableCalculation = False
Application.ScreenUpdating = False
au début
je vous tiens au courant. Encore merci pour votre aide
Kenzonal