Eviter le "IF" si trop de conditions VBA

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous

Je traite une appli. de relevé d'heures , tout va bien … sauf que j'ai plusieurs cas d'horaires Codés ( RP4:00, MAT7:00 … etc) au début 2 ou 3 en VBA ca va ,, j'ai su faire
Maintenant j'en ai + de 15 donc le code va bougrement s' alourdir et j'ai peur de m' y perdre
Je demande juste s'il n'y a pas une autre manière de s'y prendre ?? pour tester ces codes de 2 a 4 caracteres , ( matrice , appel à sub … ?)
Mon code est déjà dans un "bouton clic"
Une idée , un bout de code , c'est juste pour la manière, le reste je me debrouille

Pour une bonne comprehension : lorsque je tombe sur un de ces codes comme MAT7:00 par exemple , je dois recopier simplement 7:00 pour faire un TOTAL JOUR correct

L'exemple joint montre cela ( c'est juste un petit bout pour vous aider ) , sinon je traite un relevé annuel de 365jours x par 2 ( matin et am)

Merci de votre aide , je cherche simplement l'idée de comment faire autrement que :

If Left(Cells(dat + j, orig + 1).Value, 2) = "RP" Or Left(Cells(dat + j, orig + ).Value, 3) = "RHS" Or Left(Cells(dat + j, orig + 1).Value, 3) = "MAT" Or Left(Cells(dat + j, orig + 1).Value, 4) = "CREA" ......... Then ……..

car la liste va être TRES longue ... et gérer les variables et constantes sans se tromper !!!!!

Sinon je ferais avec ....

Bonne soirée
Hervé
 

Pièces jointes

  • Pl_code.xls
    20 KB · Affichages: 62

kjin

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

bonsoir hervé62,
Tu pourrais peut-être utiliser Select Case, à la place de If..then
Cela dit, je ne comprends pas bien le fonctionnement de ton fichier car j'ai l'impression que tu saisies 2 fois les infos en définitive
A+
kjin

Bonsoir victor21, plus rapide à la détente et pas vu ton message;désolé.
 

wilfried_42

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

bonsoir

Tes codes :

Mem_code = Cells(dat + j, orig + 1).Value, 2)

select case Mem_code
case "RP"
le traitement specifique
Case "RHS"
le traitement specifique
Case "MAT", "CREA"
Le traitement est le meme pour les 2 code

à la fin
Case ELSE
Le code n'est pas bon
End Select
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Eviter le "IF" si trop de conditions VBA

Bonjour le forum

Kjin : Non je ne saisis pas 2 X , c'est un EXEMPLE ! , le tableau du haut vient d'ailleurs et je le met dans l'appli justement pour le traiter ( découper les horaires)

Wilfried : Je ne vois plus LEFT(..... ) ; car le Pb c'est que les codes varient de 2 à 4 caractères : exemples au pif ,MAT4:00 doit donner -> 4:00 de même que CREA7:00 ---> 7:00 comme ça dans le traitement je peux faire le TOTAL JOUR sans erreur

Je pensais mettre tous les codes dans un genre de matrice ou tableau que j'appelerais pour tester à chaque passage de boucle ( je balaye le tableau du haut sur 1 année donc 365 x2 cas possible) mais je ne vois pas la manière de concrétiser cela
Quelqu'un a certainement une idée précise ?
Merci
 

wilfried_42

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

re:

Tu peux faire 2 Fonctions perso qui scindent les valeurs

Code:
Function get_code(Cellule as range) as string
            dim i as integer
            for i = 1 to len(cellule.value)
                if mid(cellule.value,i,1)>="A" and mid(cellule.value,i,1)<="Z" then get_code = get_code & mid(cellule.value,i,1)
            next i
end function

Code:
Function get_valeur(cellule as range) as date
             dim i as integer, trav as string
            for i = 1 to len(cellule.value)
                if mid(cellule.value,i,1)>="A" and mid(cellule.value,i,1)<="Z" then goto suite
                trav = trav + mid(cellule.value,i,1)
suite:
            next i
            if trav > "" then get_valeur = cdate(trav)
end function

@ te lire
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Eviter le "IF" si trop de conditions VBA

Salut Wilfried

Merci de t'occuper de mon cas
1 : faut-il écrire les 2 fonctions , ou 1 suffit ?
2: Comment fait-on appel a ces fonctions lorsque l'on est dejà dans du VBA ? ( rappel : lorsque je teste les cellules je suis dans un "Bouton clic" , exemple :
For n= 1 to 10
........
get_code (cellule)
....
Next ?? ou autre syntaxe ?

3: Puis je simplement mettre la boucle avec : IF mid(....... , a la place de ce que j'ai fait ( IF LEFT(.....) ?
Merci pour les réponses
 

wilfried_42

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

re:

l'avantage des fonctions personnalisées c'est qu'elle sont appelables aussi bien dans une macro que dans une feuille de calcul

exemple Formule :
En I18 tu mets : =get_code(C6) et tu as le code en I18
En J18 tu mets : =get_valeur(C6) et tu as la valeur en J18

exemple en macro : (en reprenant la macro plus haut)
select case get_code(Cells(dat + j, orig + 1))

ensuite tes
case "toncode"
x = get_valeur(Cells(dat + j, orig + 1))
etc etc
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Eviter le "IF" si trop de conditions VBA

Re

Pour mieux comprendre je joins le début de mon appli (ensuite c'est trop lourd)
Dans le tableau de relevé , j'ai mis des exemples de codes en rouge . Dans la recap. ( a droite) je dois retrouver les horaires , tout va bien .... sauf jusqu'au traitement des "codes"
2 ou 3 ca va avec des "IF" , mais la liste est d'environ de 16 codes possibles !!!
D'ou ma question : comment alléger tout cela ?
J'ai déjà fait le test des "R" et "CP" en mettant une formule dans la colonne "tot"
Donc j'aimerais aménager le code VBA au plus "léger" et simple

Info : Dans l'appli definitive j'ai un autre bouton qui efface tous les horaires de la recap de droite sans toucher à la colonne "tot" , ceci afin de copier un autre relevé horaire et de recommencer le traitement ( donc pas de formules en "dur" dans ces cases)

Si j'ai la manière concrète de faire dans cet exemple de 3 codes , je saurais l'étendre à 16
Dans la macro , j'ai mis du comm. pour montrer ou il faudrait le code

Merci
 

Pièces jointes

  • test_codes.zip
    21 KB · Affichages: 48

wilfried_42

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

re:

j'ai du mal à comprendre ton code, pour savoir ce que tu veux faire

J' ai mis les 2 fonctions (que j'ai modifié un peu, il y a des espaces)

Par contre je ne sais pas ce que tu veux en faire, j'ai modifié un peu ta macro

S'il y a un code, il recupere la valeur, sinon il execute tes lignes

En dessous de temps = get_valeur(........) si tu as des tratement sprcifiques selon les codes, tu mets :
if temps>0 then
select case get_code(..............)
Case "Code 1"
cells(........) = temps
case "Code 2"
cells(.......) = temps
case "Code3", "code4", "code5" ' meme traitement pour ces trois codes
cells(........) = temps
end select
end if
 

skoobi

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

Bonsoir herve62, wilfried_42,

je propose une version "allégée" de la fonction "get_valeur":

Code:
Function get_valeur(cellule As Range) As Date
             Dim i As Integer, trav As String
            For i = 1 To Len(cellule.Value)
                If Mid(cellule.Value, i, 1) Like "[!A-Z]" Then trav = trav + Mid(cellule.Value, i, 1)
            Next i
            If trav > "" Then get_valeur = CDate(trav)
End Function
wilfried, je te laisse trouver l'équivalent pour l'autre fonction ;).
 

wilfried_42

XLDnaute Barbatruc
Re : Eviter le "IF" si trop de conditions VBA

re: Bonjour skoobi :)

Merci Skoobi, je ne connaissais pas like, interressant comme operateur logique, j'ai vu pour les codes il suffit de retirer !

Neanmoins, il faut ajouter " [!A-Z]" un espace, j'ai trouvé dans ses saisies des espaces genants

Merci encore et @+ sur le forum
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Eviter le "IF" si trop de conditions VBA

Bonjour à tous
Salut Skoobi et dejà grand merci .....aussi à Wilfried il a démarré , c'est ensuite que je ne comprenais plus très bien .
C'est ce que je recherchais ( et aussi allégé), je l'ai adapté dans ma macro et testé le début ça marche
En fait , j'ai pris ta boucle , remplacé "cellule" par "Cells(dat + j, orig + 1).Value" puis à la fin je remets la valeur dans l'autre variable
En plus , l'avantage de cette fonction : la liste de mes codes peut s'allonger sans rien faire !
J'ai aussi essayé de faire appel à la fonction comme ci-dessous mais ça se Gâte !!!! ,

For j = 0 To 6
Cells(4 + rg, col).Value = Cells(dat + j, orig).Value ' activité matin ou 1
cellule = Cells(dat + j, orig + 1).Value
get_valeur (cellule)
If Len(get_valeur(cellule)) < 5 Then
Cells(4 + rg, col + 2).Value = get_valeur(cellule)
GoTo sui1
End If

Cells(4 + rg, col + 1).Value = Left(Cells(dat + j, orig + 1).Value, 5) 'extrait heure gauche
Cells(4 + rg, col + 2).Value = Right(Cells(dat + j, orig + 1).Value, 5) ' extrait heure droite
sui1:
Cells(5 + rg, col).Value = Cells(dat + j, orig + 2).Value


Je ne sais pas l'utiliser correctement , donc erreur !

Merci encore
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Eviter le "IF" si trop de conditions VBA

Bonsoir (re)
Je rebondis au lieu d'ouvrir un 2eme "post" comme je viens juste de le repprocher ( il me semble que c'est la charte du forum : 2 post !à éviter ) ... bon
Hélas j'en suis tjs au même point , l'astuce de SKOOBI ca va ... sauf que j'ai le cas de "R" ou "CP" tout SEUL , pas d'horaire , ou encore "DISPO" donc là ça mer..... !
car je dois laisser dans une seule cellule ces lettres , la colonne "tot" traite cela et ne fais pas de calcul horaire
Je suis en fin d'appli ... c'est "ballot" de ne pas finir !!
D'après ce qui a été fait ... une légère modif ... non ??? possible ?
Merci d'avance
Hervé
 

Discussions similaires

Réponses
0
Affichages
148
Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16