Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1663 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème sur une fonction IF

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème sur une fonction IF

n°2174589
Clochette0​307
Posté le 07-02-2013 à 17:16:36  profilanswer
 

Bonjour le forum,
J'aimerai vous poser une petite question.
J'ai la formule suivante en VBA pour sélectionner une colonne en fonction d'un mois renseigner dans une autre feuille.
Le problème, c'est que ma formule ne fonctionne pas et en général, c'est la seconde ligne du IF qui est surlignée en jaune.
Qqn peut-il m'aider ?
 

Code :
  1. 'DETERMINE le mois
  2. Worksheets("ECARTS" ).Columns("C:N" ).Hidden = False
  3. Sheets("SOMMAIRE" ).Select
  4. Dim mois As Integer
  5.     mois = Range("C8" )
  6.    
  7. If mois = "JANVIER" Then
  8.        Worksheets("ECARTS" ).Select = Columns("C" )
  9.     End If
  10. If mois = "FEVRIER" Then
  11.        Worksheets("ECARTS" ).Select = Columns("D" )
  12.     End If

mood
Publicité
Posté le 07-02-2013 à 17:16:36  profilanswer
 

n°2174617
boomy29
PSN: tintine29
Posté le 07-02-2013 à 19:10:18  profilanswer
 

Test ça plutôt  
 
pour ta ligne 8  
Worksheets("ECARTS" ).Columns("C" ).Select
 
ligne 12  
Worksheets("ECARTS" ).Columns("D" ).Select
.
.
.


---------------
[Ach] Just dance + cam PS4
n°2174650
Clochette0​307
Posté le 08-02-2013 à 08:28:33  profilanswer
 

Salut boomy29
J'ai adapté la formule comme tu me l'as conseillé.
Cependant, il m'affiche une erreur '13'.
Et me surligne en jaune la ligne 7.
Que faire ?

n°2174654
Clochette0​307
Posté le 08-02-2013 à 08:57:46  profilanswer
 

Code :
  1. Sub Ecarts()
  2. 'COPIER
  3. Sheets("PREPARATION ECARTS" ).Select
  4. Range("C4:C69" ).Select
  5. Selection.Copy
  6. 'OUVERTURE de la feuille BUDGET
  7. Sheets("ECARTS" ).Select
  8. Range("A1" ).Select
  9. 'DETERMINE le mois
  10. Worksheets("ECARTS" ).Columns("C:N" ).Hidden = False
  11. Sheets("SOMMAIRE" ).Select
  12. Dim mois As String
  13.     mois = Range("C8" ).Select
  14.     Dim colonne As Integer
  15.    
  16. If mois = "JANVIER" Then
  17.        Worksheets("ECARTS" ).Columns("C" ).Select
  18.     End If
  19. If mois = "FEVRIER" Then
  20.        Worksheets("ECARTS" ).Columns("D" ).Select
  21.     End If
  22.    
  23. If mois = "MARS" Then
  24.        Worksheets("ECARTS" ).Columns("E" ).Select
  25.     End If
  26.        
  27. If mois = "AVRIL" Then
  28.        Worksheets("ECARTS" ).Columns("F" ).Select
  29.     End If
  30.    
  31. If mois = "MAI" Then
  32.        Worksheets("ECARTS" ).Columns("G" ).Select
  33.     End If
  34.        
  35. If mois = "JUIN" Then
  36.        Worksheets("ECARTS" ).Columns("H" ).Select
  37.     End If
  38. If mois = "JUILLET" Then
  39.        Worksheets("ECARTS" ).Columns("I" ).Select
  40.     End If
  41.    
  42. If mois = "AOUT" Then
  43.        Worksheets("ECARTS" ).Columns("J" ).Select
  44.     End If
  45.        
  46. If mois = "SEPTEMBRE" Then
  47.        Worksheets("ECARTS" ).Columns("K" ).Select
  48.     End If
  49.    
  50. If mois = "OCTOBRE" Then
  51.        Worksheets("ECARTS" ).Columns("L" ).Select
  52.     End If
  53.    
  54. If mois = "NOVEMBRE" Then
  55.        Worksheets("ECARTS" ).Columns("M" ).Select
  56.     End If
  57. If mois = "DECEMBRE" Then
  58.        Worksheets("ECARTS" ).Columns("N" ).Select
  59.     End If
  60.    
  61.         colonne2 = colonne + 14
  62.     If colonne2 > 14 Then colonne2 = 14
  63.     Worksheets("ECARTS" ).Range(Cells(1, colonne + 1), Cells(1, colonne2)).Columns.Hidden = True
  64.     Cells(5, colonne).Select
  65.    
  66. 'COLLER
  67. ActiveSheet.Paste Link:=True
  68. End Sub


 
Voilà ma fonction.
Le problème c'est que désormais il bloque sur la fonction avant le 'COLLER
"Worksheets("ECARTS" ).Range(Cells(1,colonne+1),Cells(1,colonne2)......
Il me met erreur '1004'

n°2174680
Clochette0​307
Posté le 08-02-2013 à 10:52:17  profilanswer
 

Comment puis-je corriger mon erreur ?

n°2174738
Clochette0​307
Posté le 08-02-2013 à 13:51:10  profilanswer
 

Personne pour m'aider ?

n°2174743
Marc L
Posté le 08-02-2013 à 14:37:07  profilanswer
 

 
          Mettre un point d'arrêt sur la ligne afin de vérifier les valeurs des variables colonne & colonne2 …

 

          Relire le code, cela devrait sauter aux yeux !   Car définir une variable, c'est bien mais l'initialiser, c'est encore mieux ‼

 

          A tous les coups, la variable colonne est à zéro !  :sarcastic:

 

          Edit :   en fait colonne à zéro ne gêne pas sur cette ligne n°68 car il y a le + 1
                     mais l'erreur est évidemment déclenchée sur la ligne suivante !

 

                     Remonter les déclarations de variables (Dim) en début de procédure est plus sûr …

 

                     A noter le bloc des lignes n°18 à 64 peut être codé en 2 - 3 lignes, voir l'aide de la fonction Switch par exemple …
                     Mais ce bloc m'a l'air totalement inutile car la sélection effectuée n'est pas utilisée dans les lignes suivantes
                     puis remplacée par celle de la ligne n°69 (théoriquement avec colonne > 0 !) …

 

                     Même remarque pour les lignes n°8 & 9 …

 

                     Mettre en adéquation sa pensée et son code serait un plus …

 

                     L'enregistreur de macros ne génère pas que du code propre et retient toute sélection inutile,
                     il convient ensuite de le nettoyer et ne garder que l'essentiel.


Message édité par Marc L le 08-02-2013 à 15:22:05
n°2174756
hush hush
je savais que ça te plairait
Posté le 08-02-2013 à 15:23:53  profilanswer
 

Code :
  1. Sub Ecarts()
  2. 'COPIER
  3. Sheets("PREPARATION ECARTS" ).Select
  4. Range("C4:C69" ).Select
  5. Selection.Copy
  6. 'OUVERTURE de la feuille BUDGET
  7. Sheets("ECARTS" ).Select
  8. Range("A1" ).Select
  9. 'DETERMINE le mois
  10. Worksheets("ECARTS" ).Columns("C:N" ).Hidden = False
  11. Sheets("SOMMAIRE" ).Select
  12. Dim mois As String
  13.     mois = Range("C8" ).value
  14.     Dim colonne As Integer
  15.  
  16. If mois = "JANVIER" Then Worksheets("ECARTS" ).Columns("C" ).Select
  17. If mois = "FEVRIER" Then Worksheets("ECARTS" ).Columns("D" ).Select
  18. If mois = "MARS" Then  Worksheets("ECARTS" ).Columns("E" ).Select
  19. If mois = "AVRIL" Then Worksheets("ECARTS" ).Columns("F" ).Select
  20. If mois = "MAI" Then Worksheets("ECARTS" ).Columns("G" ).Select
  21. If mois = "JUIN" Then Worksheets("ECARTS" ).Columns("H" ).Select
  22. If mois = "JUILLET" Then  Worksheets("ECARTS" ).Columns("I" ).Select
  23. If mois = "AOUT" Then  Worksheets("ECARTS" ).Columns("J" ).Select
  24. If mois = "SEPTEMBRE" Then Worksheets("ECARTS" ).Columns("K" ).Select
  25. If mois = "OCTOBRE" Then  Worksheets("ECARTS" ).Columns("L" ).Select
  26. If mois = "NOVEMBRE" Then Worksheets("ECARTS" ).Columns("M" ).Select
  27. If mois = "DECEMBRE" Then Worksheets("ECARTS" ).Columns("N" ).Select
  28.  
  29.       colonne2 = colonne + 14
  30.     If colonne2 > 14 Then colonne2 = 14
  31.     Worksheets("ECARTS" ).Range(Cells(1, colonne + 1), Cells(1, colonne2)).Columns.Hidden = True
  32.     Cells(5, colonne).Select
  33.  
  34. 'COLLER
  35. ActiveSheet.Paste Link:=True
  36. End Sub


Hello, je passais par là,
En gras: je me demande ce que tu récupère avec un .select, essaye plutôt un .value,
Ensuite, j'ai un peu néttoyé le code,
C'est juste équivalent, mais bcp plus lisible

n°2174782
Marc L
Posté le 08-02-2013 à 16:06:34  profilanswer
 

 
           Oui bien vu pour la ligne n°15 ‼   Mais bon cela ne change rien quant à la "logique" du code dans sa globalité …
 
           Enchaîner des IF concernant la valeur d'une même variable n'est pas performant car ils sont tous évalués …
       …  tandis qu'une structure

Code :
  1.     If mois = "JANVIER" Then
  2.         Worksheets("ECARTS" ).Columns("C" ).Select
  3.     elseIf mois = "FEVRIER" Then
  4.         Worksheets("ECARTS" ).Columns("D" ).Select
  5.     elseIf mois = {…
  6.         …}
  7.     end if

           est bien plus efficient …
 
           Utiliser Switch par exemple l'est aussi.
 
 

n°2174791
hush hush
je savais que ça te plairait
Posté le 08-02-2013 à 16:17:23  profilanswer
 

Marc L a écrit :

 
           Oui bien vu pour la ligne n°15 ‼   Mais bon cela ne change rien quant à la "logique" du code dans sa globalité …
 
           Enchaîner des IF concernant la valeur d'une même variable n'est pas performant car ils sont tous évalués …
       …  tandis qu'une structure

Code :
  1.     If mois = "JANVIER" Then
  2.         Worksheets("ECARTS" ).Columns("C" ).Select
  3.     elseIf mois = "FEVRIER" Then
  4.         Worksheets("ECARTS" ).Columns("D" ).Select
  5.     elseIf mois = {…
  6.         …}
  7.     end if

           est bien plus efficient …
 
           Utiliser Switch par exemple l'est aussi.
 
 


 
Oui ou case,
Sinon, encore mieux, si la date est entrée en format date, récupérer l'indice du mois avec month(cells(x,y).value) et l'utiliser en indice pour pointer sur la bonne colonne, mais vu le niveau de clochette, il me semble bon de ne pas trop la bombarder de trucs nouveaux :)

mood
Publicité
Posté le 08-02-2013 à 16:17:23  profilanswer
 

n°2174792
Marc L
Posté le 08-02-2013 à 16:18:46  profilanswer
 

 
            Oui c'est ce que je comptais proposer en cas de réponse favorable dans ce sens, ou aussi en utilisant la fonction Switch …


Message édité par Marc L le 08-02-2013 à 16:21:11
n°2175122
Clochette0​307
Posté le 11-02-2013 à 08:07:36  profilanswer
 

Pardon d'être débutante !
Merci pour vos réponses

n°2175123
Clochette0​307
Posté le 11-02-2013 à 08:14:49  profilanswer
 

A tout hasard,  
Es-ce que l'un de vous aurait une idée pour copier/coller uniquement les valeurs d'une cellule ?
Afin de me permettre de supprimer des données d'une feuille mais que celle-ci restent dans ma nouvelle feuille quand je les copie ?

n°2175124
Clochette0​307
Posté le 11-02-2013 à 08:24:17  profilanswer
 

J'aimerai l'automatiser avec ma macro que je vous ai montré un peu plus haut.
Parce que sinon, rassurez-vous je sais le faire avec le clic droit de la souris ;)

n°2175131
hush hush
je savais que ça te plairait
Posté le 11-02-2013 à 09:08:43  profilanswer
 

Clochette0307 a écrit :

A tout hasard,  
Es-ce que l'un de vous aurait une idée pour copier/coller uniquement les valeurs d'une cellule ?
Afin de me permettre de supprimer des données d'une feuille mais que celle-ci restent dans ma nouvelle feuille quand je les copie ?


Essaye avec l'enregistreur de macros... c'est un bon moyen d'apprendre les commandes.
Perso, j'évite tant que je peux de faire des copier/Coller en vba, je te conseille plutôt de boucler sur tes cellules et de passer les données:
worksheet("feuille2" ).cells(x,y).value= worksheet("feuille2" ).cells(w,z).value

n°2175133
Clochette0​307
Posté le 11-02-2013 à 09:12:16  profilanswer
 

Merci pour ta réponse si rapide.
J'ai commencé avec l'enregistreur de macro il y a deux semaines et j'essaie d'évoluer gentiment.
Par contre, j'ai une question (con, je le dis d'avance).
Cells(x,y)  
Cela correspond à l'adresse de ma cellule ?  
Ex : Cells(C,3) ?

n°2175134
Clochette0​307
Posté le 11-02-2013 à 09:14:57  profilanswer
 

L'idée que tu me soumet est bonne, mais quand j'aurai supprimé mes valeurs de la feuille dans ma feuille SIG, il y aura 0.
Le but de ma feuille PREPARATION est de générer des données tous les mois et de faire des calculs chaque mois dans le SIG, tout en gardant le résultat du mois précédent.

n°2175171
hush hush
je savais que ça te plairait
Posté le 11-02-2013 à 11:58:58  profilanswer
 

Clochette0307 a écrit :

Merci pour ta réponse si rapide.
J'ai commencé avec l'enregistreur de macro il y a deux semaines et j'essaie d'évoluer gentiment.
Par contre, j'ai une question (con, je le dis d'avance).
Cells(x,y)  
Cela correspond à l'adresse de ma cellule ?  
Ex : Cells(C,3) ?


En code, on écrit: cells(lign,col) (Mnémo: le président US Lincoln, ie c'est toujours dans le sens ligne puis colonne)
Exemple: cells(1,2) renvoi à la cellule en B2
En argument, tu peux mettre des chiffres ou des variables (utile pour boucler)

Clochette0307 a écrit :

L'idée que tu me soumet est bonne, mais quand j'aurai supprimé mes valeurs de la feuille dans ma feuille SIG, il y aura 0.
Le but de ma feuille PREPARATION est de générer des données tous les mois et de faire des calculs chaque mois dans le SIG, tout en gardant le résultat du mois précédent.


L'instruction:
worksheets("Nomdelafeuillearrivée" ).cells(1,1).value = worksheets("Nomdelafeuilledepart" ).cells(1,1).value
ne supprime pas de données, enfin si, elle écrase la valeur de la cellule arrivée par la cellule départ, en laissant celle ci intacte.
 
 
Allez, petits tips pour bien débuter: toujours faire référence à ta feuille quand tu manipule des cellules dans le code, histoire de bien savoir ce que tu modifie.
 
Mon conseil:
Dim wsD as worksheet 'déclaration feuille départ
Dim wsA as worksheet 'déclaration feuille arrivée
 
set wsD = worksheets("NomFeuilleDépart" ) 'affecte la feuille de départ
set wsA = worksheets("NomFeuilleArrivée" ) 'affecte la feuille d'arrivée
 
Si tes ranges sont fixes et définissables par exemple par: A2:C33 (et que ça ne change jamais) tu peux utiliser:
wsA.range("A2:C33" ).value=wsD.range("A2:C33" ).value
(oui, du coup, je suis passé par l'objet range, ça marche comme les cellules à peu près, mais c'est des range)


Message édité par hush hush le 11-02-2013 à 11:59:45
n°2175192
Marc L
Posté le 11-02-2013 à 14:13:46  profilanswer
 

 
            Mieux vaut copier par bloc que par cellule, c'est bien plus rapide !

Clochette0307 a écrit :

Es-ce que l'un de vous aurait une idée pour copier/coller uniquement les valeurs d'une cellule ?

            Une cellule ne peut prendre qu'une valeur, sinon de quoi sagit-il ?
 

n°2175232
Clochette0​307
Posté le 11-02-2013 à 17:03:44  profilanswer
 

J'ai pu résoudre mon problème.
Merci à tous.
J'ai actuellement un souci avec cette partie là de ma fonction
 
'REMPLACE le "." par la ","
Range("C1:E1500" ).Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 
Une fenêtre s'ouvre et me demande de mettre à jour les valeurs.
Si je clique annuler, les valeurs sélectionner dans mon tableau s'efface.
Que faire ?

n°2175239
Marc L
Posté le 11-02-2013 à 17:33:35  profilanswer
 

Clochette0307 a écrit :

Une fenêtre s'ouvre et me demande de mettre à jour les valeurs.

            Quelles valeurs ?   Copie écran de la fenêtre ?   Version d'Excel ?

 

            Sinon est-ce dû encore une fois à la mauvaise utilisation de Select ?   Au lieu de travailler directement sur l'objet !


Message édité par Marc L le 11-02-2013 à 17:34:37
n°2175333
hush hush
je savais que ça te plairait
Posté le 12-02-2013 à 10:42:38  profilanswer
 

+1 Avec Marc L
 
Creuse aussi du coté de l'accéssibilité internationale (là où tu définie si ton ordi est en . ou en ,)
ça pue de faire du ctrl f /remplace en code...
Le vba c'est bien, mais pour faire le café avec la petite feuille dans la mousse qui va bien, il vaut mieux allez chez starbucks :o

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème sur une fonction IF

 

Sujets relatifs
Chronométrer le temps d'exécution d'une fonction en C et à la µsproblème lecture de fichier texte en ada
fonction find[VB] probleme de fin d'instruction
Problème d'include lié à iostream et SNMP++problème format cellule
Problème d'algorithme pour mon moteur 3DProbleme : Tableau de pointeurs sur structure
[RESOLU] Problème de version de PHP (ou ZEND) ?Problème bandeau joomla
Plus de sujets relatifs à : Problème sur une fonction IF


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR