Problème sur une fonction IF - VB/VBA/VBS - Programmation
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
.
.
.
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 ?
Marsh Posté le 08-02-2013 à 08:57:46
Code :
|
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'
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 !
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.
Marsh Posté le 08-02-2013 à 15:23:53
Code :
|
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
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 :
|
est bien plus efficient …
Utiliser Switch par exemple l'est aussi.
Marsh Posté le 08-02-2013 à 16:17:23
Marc L a écrit :
est bien plus efficient … |
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
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 …
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 ?
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
Marsh Posté le 11-02-2013 à 09:08:43
Clochette0307 a écrit : A tout hasard, |
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
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) ?
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.
Marsh Posté le 11-02-2013 à 11:58:58
Clochette0307 a écrit : Merci pour ta réponse si rapide. |
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. |
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)
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 ?
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 ?
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 !
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
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 ?