Comparaison et calculs puis exportation vers nouveau tableau
Bonjour,
Je sollicite de nouveau votre aide. Étant totalement débutant en VBA (j'ai découvert son existence la semaine dernière...) j'essaye de comprendre comment cela fonctionne avec l'aide d'internet, mais pour l'instant mes résultats ne sont pas vraiment concluant.
Alors, voilà mon problème. Le fichier que je mets en PJ est un extrait de mon vrai fichier qui lui compte actuellement 3500 lignes mais est dynamique donc va s’agrandir d’encore plusieurs milliers de lignes au fur et à mesure des mois.
J’ai dans la 28e colonne des surfaces de feuilles. Chaque feuille est référencée par les colonnes 2, 3, 4, 5, 6 et 7, respectivement mois d’expérimentation, bloc, plant, rameau, n° de nœud et droite ou gauche.
Je souhaite obtenir une macro qui me permette de faire la chose suivante :
Mettre dans un tableau la superficie totale représentée par les feuilles d’un même rameau pour chaque mois. L’élément qui complique la chose est que d’un mois sur l’autre une feuille peut avoir tombé (or je travaille par cumul), peut toujours être là sans avoir changé de taille mais peut aussi avoir grandie.
Bon j'imagine que ce n'est pas très clair... Du coup je mets un exemple de ce que je voudrais en pièce jointe en plus du fichier où il y a mon essai de macro.
Voilà, j'espère que quelqu'un aura le courage de plancher sur mon problème car moi je suis clairement perdu...
Merci pour votre aide
Simon
Hola
Ce n’est pas facile de te suivre. Tu as une partie des explications sur le Forum, une partie dans ta macro, une partie dans ton fichier Word !!!! Une partie des dénominations sont en français, une partie en espagnole !!!!! (J’ai passé 5 minutes à essayer de voir à quelle colonne dans Excel correspondaient tes colonnes Word à l’aide de ton tableau de concordance sur le fil, mais j’ai abandonné).
Selon moi tu devrais redonner ton explication en te basant uniquement sur un exemple Excel (éventuellement en réduisant le nombre de lignes), en utilisant absolument les mêmes dénominations sur les deux feuilles concernées ainsi que dans tes explications (de manière à ce qu’on ne doive pas toujours « traduire » tes termes ; je préfère que tu parles de la colonne « Rama » tel qu’elle est visible plutôt que d’utiliser sa traduction), en indiquant manuellement quelques-uns des résultats attendus par macro et surtout comment tu as obtenus le résultat indiqué manuellement.
Alors il faudra voir si c’est plus simple de te proposer une nouvelle macro ou de travailler sur la tienne.
Cordialement.
Bonjour,
Désolé pour ces mélanges de langues et de documents... Je suis français mais travaille en espagnol du coup j'ai voulu simplifier les choses dans l'exemple mais je vois que finalement je n'ai réussi qu'à les compliquer. Bon en tout cas merci de t'intéresser à mon problème. Je vais réécrire ce que je veux qu'en un fichier et poste ça tout à l'heure.
Simon
Bonjour,
Alors voilà j'ai tout remis dans un seul fichier avec 3 feuilles : un extrait de ce que j'ai au départ dans "bdd", ce que me donne ma macro dans "resultat" et ce que je souhaite obtenir en vrai à partir de l'onglet "bdd" avec une macro dans "ce que je veux".
En gros. J'ai des feuilles référencées par "parcela", "mata", "rama", "nudo", "Iz/Der" avec une valeur "area hoja" (colonne AB) que je souhaite récupérer et comparer avec la valeur du mois précédent (colonne "mes") de la même feuille.
Si la feuille n'existe plus, c'est-à-dire qu'il n'y a pas de données, alors je reprends la valeur précédente.
Si la feuille n'a pas changé alors je reprends la valeur précédente ( Si strictement supérieur alors...)
Si la feuille a grandi alors je prends la nouvelle valeur.
Si la feuille n'existait pas, alors il compare avec 0 et la valeur est donc nécessairement plus grande. Il prend donc la nouvelle valeur.
Je fais cela avec la feuille de gauche "I dans la colonne Iz/Der" (obtention d'"areai1" et "areai2"), puis avec celle de droite "D dans la colonne Iz/Der" (obtention d'"aread1" et "aread2").
Je somme les 2 valeurs pour en avoir une au "nudo" ("arean1" et "arean2").
Je prends alors la valeur que j'avais obtenu jusque là pour le "rama" (j'avance "nudo" par "nudo" sur le "rama" avec une boucle for n = 1 to 3 étant donné qu'il y a 3 "ramas" par "mata") et ajoute la nouvelle valeur au "nudo" en soustrayant l'ancienne valeur du même "nudo".
Je mets cela dans une boucle pour les "mes" (48 mois, "mes", dans ce cas). Puis met cela dans une boucle pour les plants, "mata" : (for m 1 to 58) et dans une boucle pour les "parcelas" (for p = 1 to 5).
Pour l'instant j'ai des numéros de "mata" qui ne sont pas des numéros mais des choses comme 1b, 2b, 3b, ... 58b d'où le If IsNumeric au début de mon code, mais si il est problématique je peux l'enlever car de toutes façons il faudra que j'effectue la même opération avec ces "matas" donc je peux les renommer qu'avec des nombres.
Merci beaucoup pour votre aide
Simon
Re
J'ai toujours le même problème mais ai changé mon code et ai corrigé déjà quelques erreurs. Bon après au final ça ne marche toujours pas mais je pense que mon gros problème vient de l'imbrication de mes boucles... Elles ne doivent pas être dans le bon ordre, mais je n'arrive toujours pas à m'en sortir.
Voilà donc le nouveau fichier (le même que dans mon dernier message mais avec les modifications de code).
Merci
Simon
PS : les macros area_rama2 et area_rama3 ne sont pas importantes, c'était pour moi pour effectuer des tests.
Bonjour
J'ai fait un essai
Pas évident
J'ai considéré que les mesures ne seraient pas faites toujours dans le même ordre
A tester sur un plus grand nombre de données
Bon alors je vais essayer demain sur l'ensemble de ma base de données, mais là sur une grosse partie ça fonctionne très bien. Par contre je vais devoir m'atteler à essayer de comprendre ce que tu as écrit car pour l'instant ce n'est pas le cas... Déjà parce que ce serait bien que je comprenne ce que je fais et pas devoir appeler à l'aide à chaque fois mais aussi parce qu'il va falloir que je l'adapte pour d'autres cas de ma base de données. Je ne sais pas si c'est un code compliqué en vrai mais pour moi qui débute ça ne me parle pas du tout et me semble très difficile.
En tout cas merci énormément, ça devrait beaucoup m'aider.
Simon
Bonjour
Tu testes et selon les résultats on verra ce qu'il faut faire
Bonne nuit
Re
Alors j'ai essayé la macro avec la moitié de ma base de données et ça fonctionne parfaitement en pas trop longtemps (genre moins d'10min). Par contre quand je la prends entièrement il ne trouve jamais la solution... Comme si la boucle n'avait pas de fin... Le truc c'est que je ne peux pas poster mon fichier entier sur le forum car fait 1.8Mo... Du coup je sais pas si quelqu'un a une idée je suis preneur.
Merci
Simon
Bonjour
As tu essayé entre-autre Cjoint
Ensuite si cela ne fonctionne pas dis le moi et je te passera par MP une adresse où tu pourras me l'envoyer, que je regarde ce que je peux y faire
Bonjour,
Alors oui quand j'essaye de joindre un fichier sur le forum il me dit que les pièces jointes ne peuvent pas excéder 300Mo. Du coup mon fichier ne passe vraiment pas donc effectivement si ça ne te dérange pas de regarder, je suis toujours preneur pour une adresse mail à laquelle t'envoyer le fichier.
Et sinon j'ai beau continuer à chercher je ne trouve pas d'où vient le problème. Après j'ai aussi, je t'avoue, du mal à comprendre le code que tu as écrit avec mon niveau... Par exemple je ne comprends pas à quoi correspond le 103 dans la commande subtotal. J'ai beau avoir lu l'explication de l'aide et chercher sur internet je ne comprends pas comment cette commande fonctionne.
De même pour le filtre. Tu mets "If WsD.FilterMode = True Then WsD.ShowAllData". Mais je ne vois pas de filtre de défini au préalable... Il y a probablement une subtilité que je ne saisie pas, mais du coup ce n'est pas évident
Merci beaucoup
Simon
En fait je ne connaissais pas ce truc, Cjoint (et je n'avais pas vu le lien dans le dernier message...).
Donc voilà le lien vers ma base de données :
Merci
Bonsoir
Avec le fichier que tu as envoyé il met 15 minutes pour tout analyser (c'est long)
Pour le moment je n'ai pas d'autres idées
Faut que j'y réfléchisse (sans garantie)
Simon_agro a écrit :Par exemple je ne comprends pas à quoi correspond le 103 dans la commande subtotal
Cela correspond à SOUS.TOTAL(103,Plage)
Compte le nombre de valeurs (ligne) filtrées dans la plage
Si ce nombre est > 1 (avec la ligne de titre) cela veut dire qu'il y a des lignes filtrées
Simon_agro a écrit :If WsD.FilterMode = True Then WsD.ShowAllData
Si le filtre était actif alors on affiche toutes les données
Extrait de l'aide
FilterMode, propriété
Cette propriété a la valeur True si la feuille de calcul est en mode filtre. Type de données Boolean en lecture seule.
Note
Cette propriété a la valeur True si la feuille de calcul contient une liste filtrée qui contient des lignes masquées.
15min??? Mais ça veut dire qu'il arrive jusqu'au bout du calcul? Parce que sur mon ordi il n'y arrive pas... Parce qu'en soit le temps m'importe peu, je n'aurai à le faire tourner qu'une fois par mois, donc il peut bien prendre 1h ça m'est égal. Par contre je ne comprends pas pourquoi sur mon ordinateur il ne marche pas... D'autant que je ne pense pas que mon ordinateur manque de puissance (en tout cas pas pour un logiciel comme excel).
Merci pour ces explications et pour ton aide en général
Simon
Bonsoir
Oui j'avais fait 2 fois le test
La 1ère fois je n'avais pas mis de timer pour vérifier le temps
Mais il a tout fait (au moins sans message d'erreur) en 15 minutes
Je reviens de re-tester : Même résultat (XL 2003)
Mince alors. J'ai 2007 et il n'aboutit pas... Je suis obliger de l'arrêter avec le gestionnaire des tâches (avoir avoir attendu jusqu') plus d'une heure...) car excel plante à chaque fois.
Je vais essayer de trouver un autre ordi pour l'essayer alors. Mais si le problème vient de mon ordi je ne sais pas comment je vais le résoudre...
Merci
Re
Alors ça y est. J'obtiens des résultats. Le problème maintenant c'est qu'il ne calcule pas pour toutes les données et pour l'instant. Je viens d'ailleurs de me rendre compte que il fait des erreurs en effectuant mes macros d'actualisation. Du coup l'onglet BDD ne comporte pas toutes les données du classeur comme il devrait. Je ne trouve pas la faille pour l'instant.
Si tu veux bien regarder dans l'onglet area_hoja (le lien du nouveau fichier :
) il a bien calculé pour une partie des données mais pas pour toutes, à la fin il écrit des valeurs étranges, comme si il avait regroupé pleins de valeurs dont il ne savait pas quoi faire en une seule ligne... Une idée de la raison?
Merci
Bonjour
Simon_agro a écrit :Si tu veux bien regarder dans l'onglet area_hoja
L'onglet "area_hoja" inconnu au bataillon
Une macro (à tester) pour remplacer tes 2 macros Actualisacion
Sub Recopie()
Dim I As Integer
Dim DerLig As Long
Range("A2:R65000").Clear
For I = 1 To Sheets.Count
If Sheets(I).Name Like "P*M*R*" Then
With Sheets(I)
DerLig = .Range("A" & Rows.Count).End(xlUp).Row
If DerLig > 1 Then
.Range("A2:R" & DerLig).Copy Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
End If
End With
End If
Next I
End SubDis moi si tu as le même problème
Simon_agro a écrit :comme si il avait regroupé pleins de valeurs dont il ne savait pas quoi faire en une seule
Indiques-moi la bonne page
Bonjour,
Je vais essayer cette macro test. Sinon désolé je me suis effectivement trompé l'onglet ne s'appelle pas "area_hoja" mais "area_por_rama". Le résultat de la macro qui récupère les aires. Les dernières lignes qu'il affiche (cf fichier "bdd.aquiares.test3) ne sont pas du tout cohérentes.
Merci
Simon
Bonsoir
J'ai modifié la macro car je me suis aperçu que le nombre de "Rama" n'était pas limité à 3 (contrairement à ce que j'avais cru lire (et comprendre) dans un de tes précédents messages)
La macro met 38 minutes pour s'exécuter
Il doit y avoir plus rapide (peut-être en triant d'abord les données) mais je ne sais pas encore
Je ne sais pas si les résultats sont bons
A toi de vérifier et à dire
Avant de lancer cette macro j'ai utiliser la macro (nouvelle) "Recopie"
A vérifier