Conditions If...

Résolu/Fermé
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - Modifié par pijaku le 18/09/2014 à 14:18
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 21 sept. 2014 à 20:55
Bonjour à tous

Je me fais des noeuds au cerveau en essayant de réadapter la formule macro ci-dessous.
En fait j'aimerai poser des conditions "if" pour l'importation d'une base de données.
-Si la plage "MALQ2" est vide, donc affichage du MsgBox ("Voulez-vous importer la Base de Donnée ori ") suivi de toute la procédure d'importation
-Si la plage "MALQ2" n'est pas vide, alors affichage du MsgBox ("Vous ne pouvez Importer la BASE DE DONNEES ") puis fermeture .....

J'ai recopié le code ci-dessous.
Merci beaucoup de m'aider à résoudre ce casse-tête.



Private Sub Cmd_Import_BDD_Click() 

On Error Resume Next 

With Worksheets("BDD Agents ") 
    Set plage = Range("MALQ2") 
    If Application.CountA(plage) <> 0 Then 

        MsgBox ("Vous ne pouvez Importer la BASE DE DONNEES ") 
        Cancel = True 
        If Application.CountA(plage) = 0 Then 
            MsgBox ("Voulez vous importer la Base de Donnée ori ") 

            Dim Table, derlig 
            With Worksheets("BDD Agents ") 

                'derniere cellule non vide colonne A 
                derlig = .Range("A" & Rows.Count).End(xlUp).Row 
                'mise en memoire des infos 
                 Table = .Range("A2:J" & derlig) 
            End With 
            With Worksheets("BDD Agents ori") 
                'derniere cellule non vide colonne A 
                derlig = .Range("A" & Rows.Count).End(xlUp).Row 
                'si deja vide 
                If derlig = 1 Then 
                     derlig = 2 
                End If 
                'efface zone 
                .Range("A2:J" & derlig).ClearContents 
                'copie infos 
                .Range("A2").Resize(UBound(Table, 1), UBound(Table, 2)) = Table 
            End With 
            MsgBox ("L'importation de la Base de Donnée Q1 s'est terminée correctement.") 
        End If 
    End If 
End With 
End Sub

25 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
17 sept. 2014 à 17:17
Bonjour,

devrait aller:

Private Sub Cmd_Import_BDD_Click()
Dim Table, derlig

On Error Resume Next

If Application.CountA(Range("MALQ2")) > 0 Then
MsgBox ("Vous ne pouvez pas Importer la BASE DE DONNEES ")
'Cancel = True ???????????????????
Else
reponse = MsgBox("Voulez-vous importer la Base de Donnée ori ?", vbYesNo)
If reponse = vbYes Then
With Worksheets("BDD Agents ")
'derniere cellule non vide colonne A
derlig = .Range("A" & Rows.Count).End(xlUp).Row
'mise en memoire des infos
Table = .Range("A2:J" & derlig)
End With
With Worksheets("BDD Agents ori")
'derniere cellule non vide colonne A
derlig = .Range("A" & Rows.Count).End(xlUp).Row
'si deja vide
If derlig = 1 Then
derlig = 2
End If
'efface zone
.Range("A2:J" & derlig).ClearContents
'copie infos
.Range("A2").Resize(UBound(Table, 1), UBound(Table, 2)) = Table
End With
MsgBox ("L'importation de la Base de Donnée Q1 s'est terminée correctement.")
Else
MsgBox ("Pas d'importation base a votre demande.")
End If
End If
End Sub

A+
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
18 sept. 2014 à 13:25
Bonjour f894009

Merci pour le code.Ca marche

J'ai voulu cacher certains onglets de mon fichier en passant par afficher /masquer dès que les feuilles concernées sont impliquées dans un calcul avec macro ou dès que j'en fais appel par un bouton ; il me met erreur; je pense que Excel ne les retrouve plus (puisqu'elles sont masquées)

J'ai regardé pas mal de forums mais je n'arrive pas à trouver la résolution du problème.

Auriez-vous une solution?

merci énormément
0
Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 396
Modifié par Vaucluse le 18/09/2014 à 13:43
Bonjour
pour utiliser une feuille masquée dans un calcul, utilisez activate au lieu de select pour sélectionner la feuille.
... et bien sur
Sheets("....").Visible = true
pour la faire réapparaître si besoin.
crdlmnt
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
18 sept. 2014 à 15:51
Bonjour Vaucluse,

julia Namor:: faudrait voir ce que vous avez comme codes, il y a ce que propose Vaucluse, mais a voir
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 10:25
Bonjour F894009
Oui , je vais explorer la méthode de vaucluse
merci
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 10:26
Bonjour à toutes et à tous

Je me permets de rester sur ce fil pour vous solliciter à nouveau

Je finalise un fichier sous forme de logiciel sur la gestion des arrêts.

Problèmes : le fichier est lourd (19mo), long à ouvrir (presque 3mns) et à fermer mais une fois ouvert on navigue dedans assez aisément.
J'y ai une multitude de formules de calculs (si, si et, si ou.....) associées à des macros.

Je reste convaincue (à tort certainement) que les causes de la lourdeur du fichier et de la lenteur d'ouverture proviennent des nombreuses formules.

Pour vous donner une idée, je vous joins une copie d'une partie du fichier. Notez que cette copie ne représente que la partie ou se trouvent les formules que j'incrimine et constitue le tiers du fichier final.

NB : J'ai aussi effectué un nettoyage manuel de toutes les feuilles pour éliminer les dernières cellules utilisées par Excel

Est possible selon vous d'alléger les formules pour gagner en rapidité.

Merci beaucoup


https://www.cjoint.com/?3Itke29FYDF
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
19 sept. 2014 à 11:04
Bonjour,

Je reste convaincue (à tort certainement) que les causes de la lourdeur

Ben si, que de formules et colonnes farcies. J'espere que vous avez besoin de tous ces renseignements pour une seule personne (qui est au courant de cela). Access aurait ete plus approprie dans votre cas. Avec du VBA, un minimum de formules et du temps ce serait jouable
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 11:17
Question peut être... bête

J'ai lu quelque part que les formules nommées permettaient de gagner en rapidité.

En nommant chaque formule de la ligne 2 par un nom est-ce que je pourrais les étirer vers le bas?

Cordialement
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 11:27
Bonjour le fil,

Oui tout à fait, exemple va dans le gestionnaire des et donne un nom à ta formule exemple Test
et dans fait référence à: tu saisis ta formule exemple A1+B1

en C1 tu fais appel à ton champ =Test et tu incrémentes vers le bas

mais tu pourrais également ajouter une conditionnelle pour ne pas afficher les zéros dans le cas de cellule vide
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
19 sept. 2014 à 12:11
Bonjour Mike_31,

merci du tuyau, mais sera-ce suffisant car son fichier est le 1/3 du final ????
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 12:54
Re,

L'intérêt d'un champ nommé ou dans ton cas une formule nommée est que tu peux l'appeler sur n'importe quel onglet et allège énormément un fichier. Après il faut voir la structure du fichier pour juger
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 13:15
Bonjour et merci mike-31

j'ai nommé quelques formules comme tu m'as suggéré mais l'incrementataion vers le bas ne marche pas .

Ou peut etre que je m'y suis mal pris?
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 13:48
Re,

Colle une de ces formules qui ne s'incrémente pas pour voir
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 13:58
Un exemple de formule que j'ai nommé "AF" .Quand j'incrémente vers le bas c'est toujours AF qui est marqué et j'obtiens le même résultat pour toute la colonne .

=SI(ET($I2="Médecine");SI(OU($J2="titulaire";$J2="stagiaire";$J2="Contractuel CDI");nbja($K2:$L2:$M2:$N2:$O2:$P2:$Q2;8;21)))
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
19 sept. 2014 à 15:21
Re, tout le monde

Dans le fichier de Julia Namor, pour moi, il faudra un nom par cellule avec formule puisque aucune formule est identique. Mais je ne connais pas tout ....
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 15:46
Re,

explique ce que tu attends de ta formule, et que vient faire nbja

=SI(ET($I2="Médecine");SI(OU($J2="titulaire";$J2="stagiaire";$J2="Contractuel CDI");nbja($K2:$L2:$M2:$N2:$O2:$P2:$Q2;8;21)))
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 16:01
En fait cette formule veut dire pour l'agent : si affectation est médecine puis statut est soit titulaire ou Contractuel CDI ou stagiaire donc calcul :somme de tous les jours d'arrêts compris entre 8jrs et 21jrs des colonnes k, m, n , o, p ,q

NBJA vient de cette macro ci-dessous.

Public Function nbja(plage As Range, nmin As Long, nmax As Long)
Dim cel As Range, total As Long, t, k As Long
Application.Volatile
total = 0
For Each cel In plage
t = Split(cel.Value, "+")
For k = 0 To UBound(t)
If t(k) >= nmin And t(k) <= nmax Then total = total + 1
Next k
Next cel
nbja = total
End Function

Merci beaucoup
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 16:58
Re,

positionne la cellule sur la première cellule qui doit comptabiliser les jours et active le gestionnaire des noms, remplace ta formule

=SI(ET($I2="Médecine");SI(OU($J2="titulaire";$J2="stagiaire";$J2="Contractuel CDI");nbja($K2:$L2:$M2:$N2:$O2:$P2:$Q2;8;21)))

par

=SI(ET(Feuil1!$I2="Médecine");SI(OU(Feuil1!$J2="titulaire";Feuil1!$J2="stagiaire";Feuil1!$J2="Contractuel CDI");SOMME(Feuil1!$K2:$Q2;8;21)))

mais d'après la fonction personnalisée elle doit compter le nombre entre une valeur mini et une valeur maxi que tu peux traiter dans la formule
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
19 sept. 2014 à 17:05
Ok mike-31 je traite tout ca et te tiens au courant

Merci beaucoup
0
Mike-31 Messages postés 18313 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 5 073
19 sept. 2014 à 21:41
Re,

par contre pour compter le nombre d'arrêt la formule dans le gestionnaire des noms serait

=SI(ET(Feuil1!$I2="Médecine");SI(OU(Feuil1!$J2="titulaire";Feuil1!$J2="stagiaire";Feuil1!$J2="Contractuel CDI");NBVAL(Feuil1!J2:P2);21))
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 20/09/2014 à 00:27
Bonjour,

Au passage tes 3 fonctions personnalisées n'ont pas l'air d'avoir besoin d'être volatile.
Elle reçoivent en paramètre toutes les cellules dont elles ont besoin, elles sont donc ré-évaluées automatiquement si un des paramètre change.

Là tu les recalcules systématiquement dans toutes les cellules pour rien, ça consomme des ressources inutilement.
Rien que sur cet extrait, pour une moindre saisie n'importe où sur la feuille (même si aucune de ses fonction est partie prenante) tu la recalcules 7200 fois...
Met en commentaire application.volatile dans les 3 fonctions et tu n'attendras plus 3-4 secondes entre chaque saisie.

Autre conseil sur les formules.
Soit la formule : =SI(ET($G2="Hébergement");SI(OU($H2="titulaire";$H2="stagiaire";$H2="Contractuel CDI");nbja($I2:$J2:$K2:$L2:$M2:$N2:$O2;1;3)))
Le test OU($H2="titulaire";$H2="stagiaire";$H2="Contractuel CDI") est utilisé 20 fois sur la même ligne par d'autres formules, et encore plus loin au moins 110 fois, je n'ai pas eu le courage de regarder plus loin.
Ressort ce test dans une colonne ou il sera évalué une seule fois et le résultat utilisé par tes 130 formules.
Gain de réactivité encore. Même si c'est moins spectaculaire que s'il y avait des multiplications ou divisions, les opérations sur les chaines sont assez coûteuses.

eric

En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
20 sept. 2014 à 09:18
Bonjour Eric


Si j'ai bien compris

Je nomme le test "OU ($H2="titulaire";$H2="stagiaire";$H2="Contractuel CDI")" puis je le remplace par son nom dans toutes les formules.

"Met en commentaire application.volatile dans les 3 fonctions et tu n'attendras plus 3-4 secondes entre chaque saisie"

Je n'ai pas bien compris ce que tu voulais dire

Merci de m'aider
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
20 sept. 2014 à 12:56
Bonjour,

Je nomme le test "OU ($H2="titulaire";$H2="stagiaire";$H2="Contractuel CDI")" puis je le remplace par son nom dans toutes les formules.
Je proposais dans une colonne supplémentaire mais tu peux aussi passer par un nom.
Attention à 2 choses :
- être sur la ligne 2 avant de définir ton nom puisque dans la formule tu es en relatif par rapport à cette ligne.
- re-contrôler la définition du nom après validation. Excel a la fâcheuse manie parfois de modifier des références, ou bien d'ajouter des " qui faussent la formule.
Pour remplacer : Ctrl+3 pour afficher les formules, Ctrl+H
Ensuite recopier les formules vers le bas.
Mais bon, je ne sais pas comment tu utilises les résultat de tes 1800 formules par ligne mais ça ne parait pas très efficient. A mon avis tu devrais repenser comment résoudre ton problème autrement. Il y en a peut-être 1700 de trop...

"Met en commentaire application.volatile dans les 3 fonctions et tu n'attendras plus 3-4 secondes entre chaque saisie"
Je n'ai pas bien compris ce que tu voulais dire

Dans le code des 3 fonctions personnalisées ajoute une ' devant la ligne :
' application.volatile
Ca la rend inactive. Si tu constates que j'ai fait une mauvaise analyse et qu'elle est vraiment nécessaire tu rétablis.
C'est ici que tu auras le plus gros gain en réactivité.

eric
0