Se connecter avec
S'enregistrer | Connectez-vous

DvDthèque - Déplacement de cellules [Excel-VBA]

Dernière réponse : dans Programmation

Bonjour.
Je m'excuse dors et déjà car c'est la première fois que je viens sur le forum et je ne me repère pas encore trop bien, veuillez m'excusez si le topic ne se situe pas au bon endroit.

**J'ai un petit souci, j'ai en projet de réaliser un classeur Excel contenant la liste des films de ma dvdthèque.

Contenant:
Le classeur est divisé en 27 feuilles.
1 feuille par lettre pour un rangement de chaque film par ordre alphabétique afin que ce soit clair lors d'une recherche.
1 feuille pour les nombres.
1 feuille pour faire mes traitements: Insertion de film et recherche de film.
Chaque feuille de rangement en contient qu'une seule colonne remplie contenant le nom du film. Il n'y a pas de titre de colonne, le premier film correspond donc à la première cellule (A1) de la page et le second à la seconde cellule (A2).

-------------------------------------------------------------

Spécifications:
Dans la feuille de traitement que j'ai appelé "Traitement" je désire donc incorporer deux macro.
-1 macro de recherche de nom de film avec un champ texte "Txt_ recherche" contenant le nom du film à chercher ainsi qu'un bouton "btn_recherche".
Le résultat affichera la réponse oui/non dans une cellule de la feuille "Traitement" si le film existe ou pas.

-1 macro d'insertion de film avec un champ texte "txt_inserer" contenant le nom du film à incorporer ainsi qu'un bouton "btn_inserer".
Le nom du nouveau film se rangera automatiquement dans la feuille correspondante à sa première lettre (pour que le fichier soit bien rangé comme dis précédemment) Et je souhaiterai aussi que la feuille se trie alphabétiquement.

-------------------------------------------------------------

Problème N°1:
Comment arriver à déplacer le nom contenu dans "txt_inserer" dans la bonne feuille et faire un tri alphabétique de toute la feuille par la suite ?.

Si je suis un raisonnement logique il faudrait prendre la première lettre du nom du film comme caractère d'opération, le comparer au nom des feuilles et dés que la correspondance est exacte, insérer le nom à la fin de la feuille.
Pour faire simple et vu qu'un trie alphabétique se fera par la suite, je pensai stocké le nom à la cellule n° 65000 et faire le tri sur toute la colonne par la suite.

Je pensai utilisé la fonction "sort" mais c'est la premiere fois et j'aurai aimé de l'aide savoir si cela allai faire ce que je souhaite ou bien si il y a mieux.
-------------------------------------------------------------

En vous remerciant à l'avance.
CortX
Lassé par la pub ? Créez un compte
Expert Programmation

Le meilleur moyen pour faire une macro adhoc sous Excel, c'est d'enregistrer dans une macro des actions toutes simples (écrire dans une cellule, trier une colonne), puis d'ouvrir l'éditeur VBA et de tenter de comprendre ce qui à été enregistrer. A partir de là, se prendre la tête avec la macro, l'aide en ligne et PPC.

Exemple : Comment arriver à déplacer le nom contenu dans "txt_inserer" dans la bonne feuille et faire un tri alphabétique de toute la feuille par la suite.

Actions simples :
- Choisir une feuille
- Ecrire quelque chose dans cette feuille
- Trier la feuille
En suivant le baratin précédent, on obtient :
  1. Sheets("Feuil1").Select
pour choisir une feuille.
  1. Range("A42").Select
  2. ActiveCell.FormulaR1C1 = "blablabla"
Et voilà comment écrire dans une cellule.
Pour trier
  1. Columns("A:A").Select
  2. Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
  3. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom


En lisant l'aide en ligne sur Sheets on peut apprendre que
Citation :
Pour renvoyer un seul objet [..] Worksheet, utilisez Sheets(index), où index est le numéro d'index ou le nom de la feuille.
Tip: Appelle ta première feuille A, le seconde B, la dernière 0-9, pour le reste
En relisant l'aide de chaque élément pour écrire dans une cellule, je simplifie le tout :
  1. Range("A42").Formula = "blablabla"

De même pour le tri :
  1. Selection.Sort Key1:=Range("A1")


Maintenant la UserForm. Le texte de la TextBox est nom_de_la_textbox.Text. Le reste est facile :

  1. Private Sub CommandButton1_Click()
  2. Dim X as String
  3. If TextBox1.Text = "" Then
  4. ' On sort parce que le nom du film n'est pas renseigné.
  5. ' Mettre ici un bip, un message d'erreur ou autre
  6. Exit Sub
  7. End If
  8. ' Prendre la première lettre à gauche
  9. ' et la mettre en majuscule. Mettre un Trim éventuellement
  10. X = UCase(Left(TextBox1.Text, 1))
  11. ' Si la feuille des A s'appelle A c'est facile,
  12. ' sinon si c'est plus compliqué, utiliser des If ou des Case
  13. If X >= "A" And X <= "Z" Then Sheets(X).Select else Sheets("0-9").Select
  14. Range("A65536").Formula = TextBox1.Text
  15. Selection.Sort Key1:=Range("A1")
  16. End Sub


Tu as posté dans la bonne cat.
Ton problème n°1 devrait être règlé.
J'espère que ta prochaine question portera sur un bon de code maintenant que tu sais comment en produire simplement. ;) 

Un conseil : Utilise MsgBox pour afficher les messages. C'est plus sympa qu'un texte dans une cellule.

Exemple, dans ta recherche, affiche "Film non trouvé" dans une boîte de message si les film n'est pas là,
sinon, ouvre la bonne feuille et sélectionne la bonne ligne.

Oula, ca c'est du dépannage.
Merci infiniement.

Tu va peut etre pouvoir me dépanner j'ai un second probleme.

Problème N°2:
Sur ma feuille j'ai voullu faire du desing un peu mieux que de la gestion de cellule. J'ai donc utilisé des zone de texte pour mes champs à remplir.

Seulement voici le probleme.
Durant la macro il n'est pas possible (je n'ai pas reussi) de selectionner le contenu de la zone de texte, il selectionne la zone de texte entiere.
Et donc le copier coller déplace la zone et texte et son contenu plutot que le texte tout seul.

Dans le code que tu m'a donné:
Citation :

pour choisir une feuille.
Range("A42").Select

Ici tu selectionne la Cellule A-42.
Seulement c'est pas une cellule qui doit etre selectionné mais plutot le contenu de la zone de texte.
J'ai donc essayé de dire à excel via les propriété des zone de texte de "boite a outil de controle" d'associer la cellule a la case comme il est possible de le faire pour les zone de liste de "formulaire" mais je n'y suis pas arrivé.
Expert Programmation

( Ah la la. Du design dans Excel ! Exceml est un tableur, pour faire des calculs, pas une base de données. Ce que tu cherches à faire, c'est pile poil dans le registre de Access. Mais peut-être n'as tu pas Access - bonne raison, ou simplement pas envie de le faire avec Access - très mauvaise excuse )

Je me répète :
Citation :
Le meilleur moyen pour faire une macro adhoc sous Excel, c'est d'enregistrer dans une macro des actions toutes simples
C'est à toi de jouer maintenant. Quel code obtiens-tu lors de l'enregistrement d'une macro, lorsque tu sélectionnes du texte dans ta zone de texte ?

/!\ Le contenu du message est faux cf posts suivants /!\

Citation :
Heu si j'ai acces, mais je n'ai fait qu'une initiation en cours.
Je vais étudier cela, c'ets peut etre pas si bete, je n'y avais aps pensé.

Citation :

ActiveSheet.Shapes("TextBox1").Select
Selection.Verb Verb:=xlPrimary
Range("F14").Select
ActiveSheet.Paste


Alors en fait la solution, se trouve dans le fait de faire:
Lors de la creation de la macra, nosu somme en mode edition docn; il suffit de faire un clic droit sur al zone de texte > Objet de zone de texte > Edition
A ce moment la, avec un ctrl+A il est possible de selectionné tout le texte et de faire un copier coller.

Alors que sans etre dans cette "edition un peu spéciale", le curseur de la souris reste normal et ne passe pas en mode sélection donc impossibilité de séléctionner le texte alors que là oui.

Je vais essayé de finir sous excel maintenant que cette action marche comme je le souhaitai.
Et j'enchainerai par le meme sous Access en demandant des cours à mes profs pour qu'il m'explique un peu mieux comment le logiciel fonctionne.

N'ayant pas la feuille original sous la main je suis sur une feuille classique je réedit mon message dans quelque instant avec les bon noms de zone de texte.

/!\ Le contenu du message est faux cf posts suivants /!\

zeb: Quel code obtiens-tu lors de l'enregistrement d'une macro, lorsque tu sélectionnes du texte dans ta zone de texte ?
Rep: Je n'obtient pas de code car on en peut pas faire cette manip (on peut la selectionné a la souris mais ce n'est pas comptabilisé comme du code) ou bien je m'y prend comme un manchot.

Dommage que l'on ne puisse pas rayer d'un gros trait rouge le post précédent mais je me suis completemetn trompé.
J'avais gardé en mémoire un ancien c/c ce qui m'a trompé.

J'ai rééssayé la technique et elle ne marche plus.
J'ai donc cherché autre chose.

Dans les propriété de la zone de textz (Clic droit > propriétés > une ligne s'appele "linked Cell"
J'ai donc essayé en mettant la cellule "A1" et effectivement il me la lie.
Ce qui me permet donc de faire un selection d'un texte contenu dans une cellule plutot que dans une zone de texte.

J'ai pris un chemin détourné il est vrai qui réduit la difficulté mais je n'ai pas trouvé de moyen, contrairement a ce que j'ai dis au post précédent de faire une copie d'un texte contenu dans une "zone de texte".

J'ai donc un code on en peut plus simple:
  1. Range("A1").Select
  2. Selection.Copy
  3. Range("G3").Select
  4. ActiveSheet.Paste
Expert Programmation

( Pour supprimer ton post, va dans "Editer ce message", puis coche "Effacer ce message" et clique sur valider.... et hop plus de message indésirable ).

Je te posais la question pour plusieurs bonnes raisons.
1°) si tu apprends à le faire par toi-même tu auras gagné plus qu'en récupérant un truc tout fait.
2°) Je n'avais pas Excel à dispo pour te donner la soluce de mémoire :D .

Mais c'est tant mieux, tu as trouvé toute seule.
Expert Programmation

Si ça s'affiche !! Mais sur la feuille Traitement. D'où la petite modif suivante
  1. ' AVANT
  2. If X >= "A" And X <= "Z" Then Sheets(X).Select Else Sheets("0-9").Select
  3. Range("A5").Formula = TextBox1.Text
  4.  
  5. 'APRES
  6. If X >= "A" And X <= "Z" Then Sheets(X).Select Else Sheets("0-9").Select
  7. ActiveSheet.Range("A5").Formula = TextBox1.Text
Une fois la solution sous les yeux, ça paraît simple :D 

Effectivement, le Activesheet devient évident.. on ne comprenaient pas le pourquoi de l'erreur.
Surtout qu'il changeai bien de feuille et que le collage venai apres.

Enfin merci encore pour ce dépannage

Nouveau probleme:
Je cherche à réaliser un bouton qui me permettra de trier toutes mes pages d'un seul coup.
J'avais donc l'intention d'utilisé une structure en "for ... next" mais mon problème est le suivant.
Mes nom de pages sont des lettres et je ne sais pas comment faire pour attribuer une valeur à la variable ainsi que d'incrémenter mon pas de changement.

  1. Sub Triagetot()
  2.  
  3. Dim nompage As Characters
  4.  
  5. For nompage = A To Z Step 1
  6.  
  7. Sheets(nompage).Select
  8.  
  9. ' ActiveSheet.Columns("A").Select
  10. ' Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
  11. ' OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  12. ' DataOption1:=xlSortNormal
  13.  
  14. Next nompage
  15. End Sub


Mon problème se situe à la ligne 5 du code: "For nompage = A To Z Step 1"
.
"Erreur de compilation.
Incompatibilité de type"

Mon step me semble bizarre aussi étant donnée que la variable est un charactère.

Je n'ai pas réussi à trouvé de site expliquant le fonctionnement d'une telle structure de la variable.

En vous remerciant à l'avance.
CortX
Expert Programmation

oué donc le for avec des chaines c'est pas très adapté
donc faut prendre la versoin plus classique
  1. dim bidule as string
  2. dim nompage as integer
  3. for nompage = 0 to 25
  4. bidule=chr$(asc("A")+nompage)
y a surement mieux, mais bon je connais pas VB ...
Expert Programmation

elch a dit :
ça serait pas :
  1. For nompage = "A" To "Z" Step 1
?
Batchy> Eh, eh, le VBA n'est pas aussi convivial que le C !

Cortx> Pour info, le nom interne des feuilles reste Feuil1, Feuil2. Tu aurais pu t'en servir. La solution proposée par Batchy reste quand même la plus élégante.

J'ai renomé le nom interne des feuille en leur lettre d'identification, pour etre sur de ne aps avoir de probleme lors des syntaxe vb, ne sacchant pas qu'elle nom il prendrai, 'jai mis les deux meme (identification et nom).

J'ai 2 heure devant moi, je vais finir normalement mon projet, il ne me reste que la focntion de recherche à faire.
1\ Récupérer le nom du film dans une textbox (ca maintenant c'est bon).
2\ Utilisé ce nom pour faire une recherche sur toute les feuilles. (ca reste à faire)
Je vais surement utilisé le systeme de la premiere lettre pour me mettre sur al bonne page, et ainsi effectué la recherche via une macro.Et afficher le résultat sous forme de msgbox.

Allez je me met au travail.
Bonne fin de journée je vous tinedri au courant des résultats.

Bah justetement, me revoila, je bloque sur quelque chose et en plus je crois meme savoir d'ou est ce que cela vient.

Voila, lors de ma recherche, je lui demande d'analyser les cellules et si le mot est trouvé dans la cellule active, il me renvoie une réponse sinon il ne me renvoie rien.
Le probleme c'ets que si le film n'éxiste pas, la cellule ne peut pas etre activé (logique) et donc j'ai le débeugeur qui se met en place.

Code VBA
  1. Private Sub cmd_Recherche_Click()
  2. Dim lettre As String
  3. Dim mot As String
  4. 'If TextBox2.Text = "" Then
  5. ' Exit Sub
  6. 'End If
  7. mot = TextBox2.Text
  8. lettre = UCase(Left(TextBox2.Text, 1))
  9. If lettre >= "A" And lettre <= "Z" Then Sheets(lettre).Select Else Sheets("0-9").Select
  10. 'Appel Macro
  11. ActiveSheet.Select
  12. Recherche

Code Macro
  1. Sub Recherche()
  2.  
  3. Dim mot As String
  4. mot = Sheets("Traitement").TextBox2.Text
  5.  
  6. If Cells.Find(What:=mot).Activate Then
  7. MsgBox ("Le film est présent")
  8. Else: MsgBox ("Le film n'existe pas")
  9. End If
  10.  
  11. End Sub


Le problème se situe à la ligne 6 du second code (code Macro).
Si je comprend bien le probleme, cela vient du ".Activate" qui signifie "la cellule acitvé"
Le problème étant que si le mot n'es pas trouvé, aucune cellule n'est activé et donc il bloque.
Ce qu'il faudrai c'est trouvé une autre syntaxe pour qu'il fasse autre chose que activate, j'ai essayé avec un ".copy" pensant qu'il ne ferai rien mais non.

Le message d'erreur est:
"Variable d'objet ou de bloc With non définie"

J'ai pensé à faire une recherche négative, plutot que de commencé par la possibilité que le mot existe, commencé par la possibilité que le mot n'éxiste pas.
Est ce que cela serait possible, je n'ai pas trouvé de syntaxe "If not".

CortX

edit 15h23; je dois alelr en cours, je reprend le problème lorsque je seria chez moi ce soir, au environ de 19h-19h30
Expert Programmation

Voilà un soucis de programmation Objet. Vérifier que l'objet retourné n'est pas nul.

RTFM : Cells.Find renvoie un Range, ou Nothing.
Alors écrivons
  1. Dim r as Range
  2. Set r = Cells.Find(What:=mot)
  3. If r is Nothing Then
  4. MsgBox "Le film n'existe pas"
  5. Else
  6. r.Activate
  7. MsgBox ("Le film est présent")
  8. End If


Enjoy!

Rebonsoir,

Je viens de tester ce que tu m'a mis, tout simplement parfait.

Tu peux m'expliquer ce que c'est qu'un range, au début je croyai que c'était le mot pour cellules mais en fait je m'apercois que non, et je n'arrive pas à identifier précisement de quoi il s'agit.

Ci joint une copie du fichier final.
J'ai retirer mes données mais j'ai laissé la pages "SAV" au cas ou si une personne viendrait à l'utiliser, posséderait déja une liste de feuille sous Excel, il lui suffirai de copier sa liste dans la colonne "A" de la feuille "SAV" et d'executer les 3 bouttons à droite de "Traitement".
Expert Programmation

( Avec l'inversion de lettre dans le mot RANGE, j'ai d'abord lu MAGE :D  :D  :D . )

En anglais, Range, c'est une gamme.
En Excel, c'est une plage de cellules.

Range("A2"), c'est la cellule A2
Range("A:A"), c'est la colonne A
Range("A2:C3"), c'est 6 cellules : A2, A3, B2, B3, C2 et C3.

oops encore une...

Désolé je suis un newbie...

En VB il exsite aussi:

  1. 'for each xxxx in yyy
  2.  
  3. 'next xxxx


Donc pour trouver les feuilles, on aurait pu avoir:
  1. Sub Triagetot()
  2.  
  3. Dim Page As worksheet
  4.  
  5. For each Page in worksheets
  6.  
  7. Page.Select
  8.  
  9. ' ActiveSheet.Columns("A").Select
  10. ' Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
  11. ' OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  12. ' DataOption1:=xlSortNormal
  13.  
  14. Next Page
  15.  
  16. End Sub


=> toutes les pages y passent.
Les pages "annexes" vont être triées.

Si cela est génant il faudra ajouter des tests:
  1. if ((Page.name <> "SAV") AND (Page.name <> "traitement")...) then
  2.  
  3. endif


Attention aux tests avec "AND" ou "OR" qui amménent vite de la confusion

Ce qui a déjà était donné est très bien.
Peut-être plus interressant car fait travailler sur les conversions de types (chaine <-> nombre).

Bon courage
Tchuss
Expert Programmation

azertysim> Il n'a y pas à mon sens de solutions + ou - intéressantes. Par contre, il y a des solutions + ou - élégantes. Tu as bien fait, cette solution n'en manque pas :) .

En dehors de toutes considérations sur le VBA, permets-moi une petite remarque sur les AND et les OR. Les conditions des tests peuvent être très alambiqués. Retenir alors la solution la plus élégante (il insiste le bougre). Par exemple dans ce cas, il peut être plus malin de dire : Prendre les pages dont le nom est une lettre ou le mot 0-9. Imagine que cortx décide d'ajouter une page de commentaires, d'aide, de copyright/copyleft, etc. Ah ben sinon faut recoder la macro ! Pas glop.

Bonjour zeb,

Tout à fait d'accord sur l'élégance.
D'ailleurs ca fait bientot 24h que je suis sur le sujet, sans aboutir élégament...

Bien que relativement élégante "ma" solution, n'est pas pratique pour ce cas, où les feuilles "utiles" sont fixes/déterminées.
C pourquoi j'avais ajouté la remarque sur les tests.

Dans un autre cas où les feuilles utiles sont "variables", cette solution peut devenir interressante.
Je le signale plus précisément maintenant et peut-être cela pourra-t-il servir à d'autres.

Bon courage à tous les "codeux".
A+

bonjour, :) 
par expérience, Excel n'est pas le meilleur outil pour ce genre de gestion.
Il est préférable d'utiliser Access.
Ce qui permet de gérer des tables et de faire toutes sortes de requêtes SQL

En outre comme ils se programment tout les 2 en VBA, çà donne accès à l'ASP et à la programmation Web

J'ai commencé il y a de cela quelques mois à apprendre l'Html, ASP, PHP, CSS, javascript, XML, ....
et çà ouvre énormément de perspectives

Le grand avantage de la programmation Web est qu'il suffit d'un browser pour visualiser vos DVDs
Alors qu'une base Excel ou Access vous oblige à l'utilisation d'une clé USB avec l'appli dessus
ET surtout de partager sa passion avec d'autres internautes ( Web = réseau, partage )

Grace à des fonctions style "noter un DVD" => Liste des meilleurs DVDs

Cordialement
Christian

PS. Voilà où j'en suis sur la programmation de ma DVDthèque... çà progresse doucement
http://www.dvdlib.be/dvdpreview/dvdnew6.asp
C'est parti d'une base Access que j'utilise toujours d'ailleur pour encoder les Fiches cinéma et transfert des fiches sur le Web via le protocole SOAP
Lassé par la pub ? Créez un compte