Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

herve62

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

re bonsoir
J'ai continué avec les "IF" par tranche de 4 ( en fait j'ai 20 codes donc 5 X 4 ) mais cela devient lourd
je pense qu'il y a + léger et adéquat en code ??

quelle est donc la marche à suivre ?

Merci
 

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
156
Réponses
19
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…