Insertion d'une formule variant en fonction d'une condition

Résolu/Fermé
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016 - 23 juin 2015 à 08:21
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016 - 25 juin 2015 à 11:23
Bonjour,
J'aurais besoin de votre aide. J'aimerais faire une macro sur VBA mais je ne sais pas vraiment par où commencer.
J'ai un tableau1 dans une feuille 1 dont chaque ligne représente un tuyau. J'ai associé à ses tuyaux un numéro de groupe en fonction de différents critères au total j'ai 179500 éléments et 438 groupes. Dans une feuille 2 j'ai un autre tableau dont chaque ligne représente un groupe et les colonnes des caractéristiques de ce groupe. Le problème est que je n'arrive pas à calculer l'une de ces caractéristiques : le type de sol. Le type de sol du groupe est le type de sol qui apparaît le plus souvent dans le groupe. Il existe au total 9 types de sol différents et ils sont au format numérique.



Je connais la fonction MODE qui permet d'obtenir le type de sol qui apparait le plus souvent dans une plage de donnée, mais je n'arrive pas à faire varier cette plage en fonction du numéro de groupe. C'est pourquoi j'ai pensé utiliser VBA et insérer dans chacune des cellules de la colonne type de sol du tableau 2 la fonction MODE mais en faisant varier les bornes de la plage de donnée, peut être avec une boucle for. Le problème c'est que je ne sais pas quoi mettre comme variable. Je suis un peu perdue.

Merci de votre aide

3 réponses

Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016
Modifié par Pouschkine le 23/06/2015 à 10:09
Pour l'instant j'ai essayé ca mais cela m'indique une erreur

Remarque : k est le numéro de groupe, deb la premiere ligne de la plage de données et fin la derniere ligne de la plage de données
0
michel_m Messages postés 16582 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 27 novembre 2022 3 284
24 juin 2015 à 08:56
Bonjour
déjà comme tu annpnces 179515 les variables doivent ^tre déclarées en Long et non en Integer
integer concerne les nombres entre -32768 et 32767....
Il y a beaucoup d'autres choses à rectifier mais regarde ce que ca donne avec des types "long"
0
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016
24 juin 2015 à 09:07
Merci pour votre réponse :)

Par contre j'ai toujours une erreur : erreur 1004, application-defined or object-defined error.
Entre temps j'ai un peu changé le code, je pense avoir corrigé certaines erreurs mais apparement ce n'est pas suffisant.

Sub Soil_type()

Dim k As Integer 'k est le numéro du groupe
Dim deb As Long 'deb la premiere ligne de la plage
Dim fin As Long 'fin la derniere ligne de la plage

k = 1
deb = 2

For i = 2 To 179515

If Worksheets("sheet1").Cells(i, 18) = k Then
fin = i
Else
Cells(k + 1, 5).Formula = "=MODE.SNGL(sheet1!M " & deb & ": M " & fin & ")"
deb = i
k = k + 1
End If

Next

End Sub
0
michel_m Messages postés 16582 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 27 novembre 2022 3 284
24 juin 2015 à 09:32
dire sur quelle ligne la macro s'arrete (surlignée en jaune)
0
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016 > michel_m Messages postés 16582 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 27 novembre 2022
24 juin 2015 à 09:34
La macro s'arrête sur la ligne où j'insère la formule :
Cells(k + 1, 5).Formula = "=MODE.SNGL(sheet1!M " & deb & ": M " & fin & ")"
0
michel_m Messages postés 16582 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 27 novembre 2022 3 284
Modifié par michel_m le 25/06/2015 à 09:27
Bonjour

je ne connais pas la fonction Mode.sngl (j'ai xl2007)
mais avec 179000 lignes, le pas à pas par cellule est extrèmement chronophage; il faut alors passer par des variables-tableaux

edit 9:28H
pour tenter d'^tre efficace
Mettre un extrait du classeur ( env.1000 à 2000 lignes) sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse
Dans l'attente


Michel
0
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016
25 juin 2015 à 10:25
Bonjour,

Je crois que dans Excel 2007 vous avez la fonction MODE qui fait à peu près la même chose que la fonction MODE.SNGL. Elle permet de renvoyer l'élément qui apparait le plus souvent dans une plage de donnée.
Après plusieurs essais j'ai finalement utilisé FormulaR1C1 au lieu de Formula et ca marche. Ca donne :
Cells(k + 1, 5).FormulaR1C1 = "=MODE.SNGL(sheet1!R" & deb & "C13 :R" & fin & "C13)"

Par contre je n'ai toujours pas compris pourquoi la première formule ne fonctionnait pas, si vous avez une idée n'hésitez pas.

En tout cas merci de vous être intéressé à mon problème.
0
michel_m Messages postés 16582 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 27 novembre 2022 3 284 > Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016
25 juin 2015 à 11:18
Par curiosité, dites moi la durée d'éxécution de votre code.
0
Pouschkine Messages postés 13 Date d'inscription mardi 23 juin 2015 Statut Membre Dernière intervention 22 avril 2016
25 juin 2015 à 11:23
C'est instantané.
Et excusez moi mais je n'avais pas vu la suite de votre précedant message.
0