Coller une variable tableau

Résolu
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
Configuration: Windows XP Internet Explorer 6.0

8 réponses

  1. 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
    1. 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
  2. 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 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
      1. Contributeur
        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. 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 ?
          1. 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
        2. 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
          1. 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
            1. 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
          2. 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...