peut-on mettre array dans array temporaire pour calcul

cathodique

XLDnaute Barbatruc
Bonjour tout le monde,

ce post est en relation avec mon précédent post ici, auquel je n'ai pas eu de retour. Je doute bien que malgré 2 posts, je ne suis pas parvenu à bien exposer mon problème.

Mes connaissances du VBA sont limitées, j'ai trouvé une solution par formule (Sommeprod) que j'ai introduite dans le code de récupération des données (même ce code n'est pas de moi, je remercie tous ceux qui m'ont aidé).
Code:
Sub Preparer_New()
Dim ligne As Long, j As Long, k As Long, Lastlig As Long
Dim i As Long
Dim o As Object, bd As Object
Dim Tb, Res()
Dim Dercol As Integer
Dim Val1 As String, Val2 As String
Application.EnableEvents = False
Application.ScreenUpdating = False
Set bd = Sheets("Cordonnées") 'définit l'onglet bd
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit derlg col1 onglet bd
Set o = Sheets("Relevé")
'Dans la variable tableau Tb
With bd
    Lastlig = .Cells(.Rows.Count, 1).End(xlUp).Row
    Tb = .Range("A2:J" & Lastlig)
End With
 
With o
Dercol = o.Range("A5").End(xlToRight).Column
     Val1 = .Range("B2")        'ouvrage
     Val2 = .Range("B3")        'LIMITE
    For i = 1 To Lastlig - 1
        '
    If Tb(i, 3) = Val1 And Tb(i, 4) = Val2 Then
      j = j + 1
      ReDim Preserve Res(1 To 12, 1 To j)
       Res(1, j) = j
       Res(2, j) = Round(Tb(i, 5), 2)   'PK
       Res(3, j) = Tb(i, 6)    'type
       Res(4, j) = "=IF((SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3)*val3))=0,"""",SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3)*val3))"
       Res(5, j) = "=IF((SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3)*val4))=0,"""",SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3)*val4))"
       Res(6, j) = Tb(i, 7)   'OUVRAGE VOISIN
       Res(7, j) = Tb(i, 8)    'PK VOISIN
       Res(8, j) = "=IF((SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3),(val1)))=0,"""",SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3),(val1)))"
       Res(9, j) = "=IF((SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3),(val2)))=0,"""",SUMPRODUCT((Ref=R4C7)*(Date=R1C6)*(Ouvrage=RC6)*(Voisin=R2C2)*(Type=RC3),(val2)))"
       Res(12, j) = Tb(i, 9)   'OBSERVATION
            
        End If
        
    Next i
    Lastlig = .Cells(.Rows.Count, 1).End(xlUp).Row
    If Lastlig > 8 Then .Range("A8:L" & Lastlig).Clear
    If j > 0 Then .Range("A8").Resize(j, 12) = Application.Transpose(Res)
    .Range("A8").Resize(j, Dercol).Borders.Weight = xlThin
End With
    
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
Dans ce code j'ai rajouté les 4 lignes avec formule sommeprod, j'obtiens bien le résultat escompté. Ce qui est gênant c'est de voir l’exécution du calcul cellule par cellule.
Pour éviter ceci, pourrait-on passer par un tableau temporaire afin que les calculs s'effectuent en mémoire?
Si oui, comment le faire? à moins que vous n'ayez une meilleure solution et plus adaptée.

En vous remerciant beaucoup.

Cordialement,

PS: J'ai nommée les colonnes de la feuille BD, ces noms sont utilisés dans la formule.
 

Pièces jointes

  • Commun2.xls
    344.5 KB · Affichages: 79

Herdet

Nous a quitté
Repose en paix
Re : peut-on mettre array dans array temporaire pour calcul

Bonjour tout le monde,
Mes connaissances du VBA sont limitées, j'ai trouvé une solution par formule (Sommeprod) que j'ai introduite dans le code de récupération des données (même ce code n'est pas de moi, je remercie tous ceux qui m'ont aidé).
Dans ce code j'ai rajouté les 4 lignes avec formule sommeprod, j'obtiens bien le résultat escompté. Ce qui est gênant c'est de voir l’exécution du calcul cellule par cellule.
Pour éviter ceci, pourrait-on passer par un tableau temporaire afin que les calculs s'effectuent en mémoire?
Si oui, comment le faire? à moins que vous n'ayez une meilleure solution et plus adaptée.
En vous remerciant beaucoup.
Cordialement,
PS: J'ai nommée les colonnes de la feuille BD, ces noms sont utilisés dans la formule.
Bonjour,
Bizarre, sur mon PC en Excel 2010, l'actualisation se fait en 3 secondes.
Ci-jointe une autre solution :
- copier toutes les valeurs calculées suivant ta méthode mais sans les SOMMEPROD
- dans les 4 colonnes concernées : copie en bloc des formules SOMMEPROD
et remplacement par les valeurs, cela évite d'alourdir inutilement le tableur avec plus de 200 SOMMEPROD
Le temps de calcul global est de 2 à 3 sec mais il devrait mieux fonctionner sur ton PC.

PS : si tu préfères, tu peux garder les formules en enlevant les Copy/Paste
Cordialement
Robert
 

Pièces jointes

  • NOUVEAU_Commun2.xls
    312 KB · Affichages: 58

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Bonsoir Herdet,

Je te remercie beaucoup pour ton aide. En effet, avec ta solution on ne voit plus le calcul s'effectuer (cellules vides au lieu des 0).

Mon micro n'est plus très jeune, ça s’exécute en 22s chez moi. Mais ça ne me dérange pas trop. pour les collègues je ne sais pas trop. J'adopte ta solution étant donné que je n'ai pas eu de retour à mes précédents posts.

Je suis persuadé que l'on peut traiter mon problème autrement (de façon plus ''orthodoxe'' en VBA). J'avais pensé aux filtres automatiques (j'ai enregistré des macros sans savoir ensuite comment arranger le code). j'ai fait des recherches poussées sur le site de JB et j'ai téléchargé pas mal de fichiers mais rien n'y fait, je reste bloquer. Formation Excel VBA JB

Mais bon, apparemment mon sujet n'a retenu l'attention de pas grand monde.

Je te remercie beaucoup, ça va me permettre d'avancer dans mon projet. je te suis très reconnaissant.

Cordialement,
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Re,:)

je viens de faire un test sans les Copy/Paste, et ce sont les formules qui sont copiées dans les cellules.

Je garde donc les copy/paste car je dois archiver les valeurs.

Encore merci, bonne soirée.

Cordialement,

Elias
 

Misange

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Bonjour Cathodique, Hello Robert

Cathodique, quelques remarques plus générales : lis ton message en te mettant dans la peau de quelqu'un qui ne connait pas ton problème... Si il faut aller lire une autre ficelle pour comprendre de quoi tu parles, autant rester dans la ficelle précédente. Si tu n'as pas de réponse à une question posée su XLD, c'est en général parce qu'elle est mal posée ou trop complexe. Certains contributeurs prennent le temps de décortiquer des questions très complexes mais il faut du temps pour ça.


Pour ton classeur :
1) quand tu as des bases de données, prends l'habitude de les transformer en tableaux excel (onglet accueil/Style/mettre sous forme de tableau), ça te permet des tas de choses, à lire ici : Ce lien n'existe plus Ca t'évite en particulier de devoir utiliser les formules avec decaler pour créer des noms dynamiques, cela se fait tout seul.

2) Avant de partir vers des sommeprod ou leur équivalent en VBA mon premier réflexe c'est de voir si je ne peux pas utiliser un tableau croisé dynamique. J'ai essayé de faire un début de truc mais j'ai pas beaucoup de temps maintenant pour regarder ça en détail. L'avantage c'est que tu n'as aucune formule à rentrer et que tout est fait en langage machine, bien plus rapide que les formules de type de sommeprod et bien plus rapide que le VBA
Ce lien n'existe plus

3) dans la base de données, un simple filtre ne te suffit pas ?

Si tu veux plus d'infos sur les arrays, tu en a 8 pages ici
Ce lien n'existe plus (et suivantes !)
 

Pièces jointes

  • Commun2.xlsx
    174.1 KB · Affichages: 94

Herdet

Nous a quitté
Repose en paix
Re : peut-on mettre array dans array temporaire pour calcul

Bon, pour ne pas trop compliquer les choses par du code VBA compliqué et un TCDpas très viable (j'ai testé), il vaut mieux traiter le problème comme une vraie Base de données avec une colonne de Code unique dans la feuille BD et dans la feuille Relevés (créés par formules en colonne A )

La nouvelle méthode supprime tout le code VBA vu ci-dessus et les SOMMEPROD avec une simple formule INDEX/EQUIV et le recalcul automatique est instantané.
Le tableau Relevé peut être étendu en tirant les lignes vers le bas pour les formules.
Voir la liste des noms de variables dans l'onglet "Variables définies"
J'ai renommé les colonnes de la base en BD_xxxx
Ci-joint le fichier.

Bon travail
Robert
 

Pièces jointes

  • NOUVEAU2_Commun2.xls
    357 KB · Affichages: 60

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Messieurs Bonsoir,

@Misange
je te remercie pour tes conseils. Et tu as absolument raison, je me doutais bien que j'avais très mal exposé mon problème. j'ai creusé un peu de mon côté, c'est la raison pour laquelle j'ai ouvert une autre discussion.
Ces deux feuilles sont effectivement des bases de données. l'une correspond à des coordonnées de lieux géographiques où l'on effectuent des mesures électriques et la seconde à l'archivage des ces mesures électriques. Donc les TCD ne répondent à mes traitements. Merci, beaucoup pour les liens que je ne manquerai pas de consulter pour apprendre et mieux comprendre le vba.

@Herdet, je te remercie beaucoup, mais je ne peux pas modifier la structure des 2 feuilles de données (BD et Coordonnées).
je télécharge ton fichier et je reviendrai pour te mettre au courant de la suite.

Merci, encore à vous deux. Bonne soirée.

Cordialement,
 

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Rebonsoir Herdet,:eek:

Je viens de consulter ton fichier joint, désolé les résultats obtenus sont erronés. Les valeurs réelles de la ligne 29 de la feuille "relevé" doivent être ceux de la ligne 22 (jaune) de la feuille "BD". De plus, je ne peux pas modifier ces feuilles. Sinon, je serai obligé de revoir tous les modules de codes, ça sera un sacré boulot.

Je te remercie beaucoup pour ton aide, surtout pour le temps que tu viens de me consacrer et tes efforts.

Cordialement,
 

Herdet

Nous a quitté
Repose en paix
Re : peut-on mettre array dans array temporaire pour calcul

Messieurs Bonsoir,

@Herdet, je te remercie beaucoup, mais je ne peux pas modifier la structure des 2 feuilles de données (BD et Coordonnées).
je télécharge ton fichier et je reviendrai pour te mettre au courant de la suite.
"je ne peux pas modifier la structure des 2 feuilles de données (BD et Coordonnées)"

Ton message #1 disait "Si oui, comment le faire? à moins que vous n'ayez une meilleure solution et plus adaptée.

Il aurait été sympa de préciser cette restriction importante en tête de ton message, cela nous aurais évité de perdre du temps pour trouver d'autres solutions plus efficaces.
Je ne vois toujours pas ce qui t’empêche d'insérer dans les 2 feuilles une colonne à gauche que tu peux facilement masquer par un mode Plan.

... pourquoi faire simple quand on peut faire compliqué !!! :confused:
 

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Re Misange,

Merci pour tes liens, c'est juste pour te mettre au courant que pour ce lien Ce lien n'existe plus, j'obtiens sur la page ceci: Erreur 404 : Page non trouvée

Merci beaucoup et bonne soirée.

Cordialement,
 

cathodique

XLDnaute Barbatruc
Re : peut-on mettre array dans array temporaire pour calcul

Re Herdet,

Désolé de t'avoir fait perdre ton temps. Le tableau temporaire dont je parlais dans mon post#1 et le même que j'utilise pour récupérer les données de la feuille "Coordonnées". ça pourrait être un tableau intermédiaire dans lequel se feront les calculs en mémoire avant de transférer les données sur la feuille "relevé". Je ne parlais du tableau de la feuille BD ou coordonnées.

Je t'ai donné les raisons pour lesquelles je ne peux pas modifier les feuilles surtout la feuille BD. Je dois reprendre tous les modules de codes de mon fichier. C'est un travail énorme pour moi, surtout que je ne maitrise pas bien le vba.

Encore désolé, je tiens à te dire que j'ai appris quelque chose avec toi. Merci beaucoup.

Cordialement,
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 508
Membres
103 568
dernier inscrit
NoS