Problème sur une fonction IF

Problème sur une fonction IF - VB/VBA/VBS - Programmation

Marsh Posté le 07-02-2013 à 17:16:36    

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

Reply

Marsh Posté le 07-02-2013 à 17:16:36   

Reply

Marsh Posté le 07-02-2013 à 19:10:18    

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
Reply

Marsh Posté le 08-02-2013 à 08:28:33    

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 ?

Reply

Marsh Posté le 08-02-2013 à 08:57:46    

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'

Reply

Marsh Posté le 08-02-2013 à 10:52:17    

Comment puis-je corriger mon erreur ?

Reply

Marsh Posté le 08-02-2013 à 13:51:10    

Personne pour m'aider ?

Reply

Marsh Posté le 08-02-2013 à 14:37:07    

 
          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
Reply

Marsh Posté le 08-02-2013 à 15:23:53    

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

Reply

Marsh Posté le 08-02-2013 à 16:06:34    

 
           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.
 
 

Reply

Marsh Posté le 08-02-2013 à 16:17:23    

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 :)

Reply

Marsh Posté le 08-02-2013 à 16:17:23   

Reply

Marsh Posté le 08-02-2013 à 16:18:46    

 
            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
Reply

Marsh Posté le 11-02-2013 à 08:07:36    

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

Reply

Marsh Posté le 11-02-2013 à 08:14:49    

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 ?

Reply

Marsh Posté le 11-02-2013 à 08:24:17    

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 ;)

Reply

Marsh Posté le 11-02-2013 à 09:08:43    

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

Reply

Marsh Posté le 11-02-2013 à 09:12:16    

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) ?

Reply

Marsh Posté le 11-02-2013 à 09:14:57    

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.

Reply

Marsh Posté le 11-02-2013 à 11:58:58    

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
Reply

Marsh Posté le 11-02-2013 à 14:13:46    

 
            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 ?
 

Reply

Marsh Posté le 11-02-2013 à 17:03:44    

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 ?

Reply

Marsh Posté le 11-02-2013 à 17:33:35    

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
Reply

Marsh Posté le 12-02-2013 à 10:42:38    

+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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed