Besoin d'une macro pour excel

bonjour

je ne connais pas le language Visual basic
mais j’ai besoin d’une macro pour crée une deuxième feuille excel a partir de donnée d’un tableau

je vais essayer d’etre le plus clair possible.

la macro doit vérifier toutes les cellule du tableau une a une
si dans la cellule il y a un nombre alors il faut prendre le titre de la colonne , le titre de la ligne et rajouter le nombre derrière dans la nouvelle feuille excel

cette macro me servirais a écrire automatiquement des étiquettes repas
avec le nom du service,le type de repas,leur nombre

donc le programme devrais donner a peu prés une structure comme celle ci

  • ce placer sur la première cellule
  • vérifier si celle ci contient un nombre
  • si non alors passer a la cellule suivante
  • si oui alors concaténer le titre de la colonne avec le titre de la ligne plus le nombre contenu dans la cellule
    les placer dans une cellule sur la deuxième feuille dont le tableau possède 5 colonne
  • passer a la cellule suivante

pour info les données a analyser se trouve sur le tableau de (d4) a (v39)

doit être assez simple a programmer je pense mais perso me suis juste pencher sur le basic simple et le turbo pascal il y a des années :slight_smile:

merci d’avance si quelqu’un a le temps

Tu ne vas sans doute pas trouver un code entièrement écrit (difficile quand on n’a pas la source sous les yeux), mais on peut te guider pour que tu le réalises toi même

Il faut au minimum que tu apprennes à écrire une macro à partir de l’enregistrement automatique, et ensuite à modifier son code à partir de l’éditeur Visual Basic.
Bien sûr,il faut essayer d’abord sur des choses simples : copier/coller, modification du contenu de cellules …
et ne pas hésiter à demander

Dans l’absolu, ce que tu demandes ne paraît pas trop difficile, mais il faut quand même un certain nombre de précisions que tu ne donnes pas dans ton message

tu veux balayer tes cellules ligne par ligne ou colonne par colonne ? (sachant que faire la 1e colonne, puis la 2 etc est le plus facile)

tu dis que les données sont en D4:V39, mais où sont les ligne et colonne de titre ?
Et par quoi sont-elles entourées ? des cellules vides ?

donc à remplir ligne par ligne ? On commence en A1 ?
Au départ, la feuille cible est vierge ?

Tu ne vas sans doute pas trouver un code entièrement écrit (difficile quand on n’a pas la source sous les yeux), mais on peut te guider pour que tu le réalises toi même

- pense pouvoir me débrouiller avec un code générique la structure et pas si loin du pascal si il y a des annotation sur le fonctionnement devrais pas être insurmontable
de plus je vais devoir le modifier pour faire plusieurs feuille cible différentes

Il faut au minimum que tu apprennes à écrire une macro à partir de l’enregistrement automatique, et ensuite à modifier son code à partir de l’éditeur Visual Basic.
Bien sûr,il faut essayer d’abord sur des choses simples : copier/coller, modification du contenu de cellules …
et ne pas hésiter à demander

Dans l’absolu, ce que tu demandes ne paraît pas trop difficile, mais il faut quand même un certain nombre de précisions que tu ne donnes pas dans ton message

j’ai quelque jour de repos me pencher dessus
le programme par lui même n’est pas compliquer juste une boucle avec verification de contenu, de la copie de cellule et incrémentation de la place de la cellulea verifier

tu veux balayer tes cellules ligne par ligne ou colonne par colonne ? (sachant que faire la 1e colonne, puis la 2 etc est le plus facile)

le balayage ce ferais colonne par colonne

tu dis que les données sont en D4:V39, mais où sont les ligne et colonne de titre ?
Et par quoi sont-elles entourées ? des cellules vides

ligne titre en d2:v2
colonne titre c4:c39

donc à remplir ligne par ligne ? On commence en A1 ?
Au départ, la feuille cible est vierge ?

comme tu l’as deviner oui ligne par ligne et la feuille cible est vierge

merci de tes réponse

edit : je peut joindre la source excel si besoin
Edité le 10/06/2011 à 20:13

Le fait qu’il y ait une ligne vide entre la ligne de titres et les données complique un peu les choses, mais ça reste abordable si tu acceptes le principe d’un format de feuille “figé”, autrement dit si tu t’interdis d’ajouter/supprimer des lignes/colonnes, y compris à l’extérieur du tableau.
Tu peux essayer de te faire la main à partir de ce code :


Sub etiquettes()
    Set Rcible = Sheets(2).Range("A1")
    ' balayer la source
    For Each c In Sheets(1).Range("D4:V39")
        ' ecrire la valeur - à ajuster en fonction du format choisi
        Rcible.Value = Cells(2, c.Row) + " / " + Cells(c.Column, 3) + " :" + Str(c.Value)
      
        'avancer la cible
        Set Rcible = Rcible.Offset(1)
    Next
End Sub

Dans un premier temps, tu auras ton résultat sur une seule colonne dans la feuille 2 mais il sera toujours temps de compléter quand cette partie te conviendra (en particulier au niveau de la mise en forme de la cellule résultat.

me suis rapeller un peu mes conaissance en pascal et pondu ca pas le plus rapide mais ca fonctionne nickel
Sub etiquette()
lig = 1
col = 1
For colonne = 4 To 22
For ligne = 4 To 39
Sheets(“effectif”).Select
If Cells(ligne, colonne) > 0 Then
service = Cells(ligne - (ligne - 2), colonne)
repas = Cells(ligne, colonne - (colonne - 2))
nombre = Cells(ligne, colonne)
resultat = service & " " & repas & " " & nombre

        Sheets("etiquettes").Select
        If col > 5 Then col = 1
        col = col + 1
        If col > 5 Then lig = lig + 1
        Cells(lig, col) = resultat
    End If
Next ligne

Next colonne

End Sub

[b]edit :

juste un petit problème d’affichage dans la cellule qui contient le résultat

resultat = service & " " & repas & " " & nombre

et t’il possible d’avoir les 3 information les une sous les autre dans la cellule cible
pour un affichage de ce genre

service
repas
nombre

plutôt que

service repas nombre[/b]
Edité le 11/06/2011 à 11:16

En VBA excel, tu n’est pas obligé de sélectionner la cellule pour intervenir dessus.
Là avec tes select, ton écran va bouger en permanence. C’est pratique pendant la phase mise au point, mais à terme tu auras peut être intérêt à le supprimer.

service = Cells(ligne - (ligne - 2), colonne) -> service = Cells(2, colonne) devrait donner la même chose, non ?

Sheets(“etiquettes”).Select
If col > 5 Then col = 1
col = col + 1
If col > 5 Then lig = lig + 1
Cells(lig, col) = resultat

Je n’ai pas fait tourner, mais je pense que là tu ne dois pas écrire dans la colonne 1. C’est volontaire ?

Pour éviter de tester deux fois la condition sur la colonne :
Sheets(“etiquettes”).Select
If col =6 Then
lig = lig + 1
col = 1
else
col = col + 1
Endif
Cells(lig, col) = resultat

Pour ta mise en page ,tu dois pouvoir forcer le passage à ligne en utilisant chr(10) :
resultat = service & chr(10) & repas & chr(10) & nombre.

merci

En VBA excel, tu n’est pas obligé de sélectionner la cellule pour intervenir dessus.
Là avec tes select, ton écran va bouger en permanence. C’est pratique pendant la phase mise au point, mais à terme tu auras peut être intérêt à le supprimer.


oui ca flash a l’ecran mais si je suprime la selection de la feuille ou il travail comment vba fait pour ce situer
j’avoue que si je surprime les
Sheets(“effectif”).Select et Sheets(“etiquettes”).Select
je suis perdu pour dire sur quel feuille et quelle cellule travailler

sinon teste ça demain et vous tiens au courant de mon avancer

pour l’histoire de colonne et ligne
oui c’est volontaire doit encore intégrer des espace entre les cellules pour la mise en page futur :wink:
(genre quelques millimètre de décalage entre les cellule a imprimer)

en tout cas merci

Bonjour,

Si tu veux garder tes Sheets(xxx).Select et que tu ne veux pas que l’affichage bascule à chaque fois sur la feuille sélectionnée, tu peux utiliser au début de ta macro la commande Application.ScreenUpdating = False et bien sûr tu remets à True en fin de macro. :wink:
Edité le 12/06/2011 à 01:51

Tu peux très bien faire des actions sur une feuille qui n’est pas active.
Autrement dit, ton affichage peut rester sur la feuille “effectif”, et quand tu voudras travailler dans la feuille “etiquettes”, tu le préciseras explicitement

Sub etiquette()
lig = 1
col = 1
Sheets(“effectif”).Select ’ sécurité, pour être sûr de démarrer sur la bonne feuille
For colonne = 4 To 22
For ligne = 4 To 39
If Cells(ligne, colonne) > 0 Then
service = Cells(2, colonne)
repas = Cells(ligne, 2)
nombre = Cells(ligne, colonne)
resultat = service & chr(10) & repas & chr(10) & nombre

If col =6 Then
lig = lig + 1
col = 1
else
col = col + 1
Endif
Sheets(“etiquettes”).Cells(lig, col) = resultat

Next ligne
Next colonne

End Sub

merci de votre aide ma routine est beaucoup plus rapide sans les flash écran :wink:

j’aurais encore besoin de vous

je voudrais récupérer les commentaire de certaine cellule pour les mettre dans une variable et ainsi pouvoir les rajouter a la fin de la variable résultat (les allergie de certain pensionnaire sont en commentaire)

x = Cells(ligne, colonne).Comment.Text

Pour avoir de l’aide sur les méthodes et propriétés, tu tapes le nom d’objet dans l’éditeur visual basic (ici Cells), tu le sélectionnes et tu apppuies sur F1.
Autre méthode : tu tapes Cells. (bien noter le point après cells)
Normalement, tu vas avoir une liste contextuelle avec tout ce que tu peux utiliser.

merci

je teste ca demain

grace a vous j’ai bien avancer je vous remercie encore :wink:

[b]commentaire = Cells(ligne, colonne).comment.Text

me met une erreur 91 variable objet ou variable de bloc with non défini

essayer en déclarant la variable en string
en lui attribuant “” en valeur de dépare et if commentaire <>"" then Cells(ligne, colonne).comment.Text
rien a faire je bloque sur cette instruction
pas moyen de récupérer le commentaire[/b]
Edité le 13/06/2011 à 18:50

Ca c’est le message qu’on a quand la cellule en question ne possède pas de commentaire.
Tu es sûr de tes valeurs pour les variables ligne et colonne ?

Fais l’essai avec Cells(1,1) ; en mettant un commentaire dans la cellule A1, bien sûr.

Si le problème vient d’une cellule ne comportant pas de commentaire qui provoquerait alors une erreur, tu peux cacher le message d’erreur en mettant juste avant l’assignation :
Application.DisplayAlerts = False

Et évidemment, tu repositionnes à True juste après l’assignation. :wink:


Application.DisplayAlerts = False
x = Cells(ligne, colonne).Comment.Text
Application.DisplayAlerts = True

Cela ne te dispense bien sûr pas de tester ensuite la valeur de X (peut-être avec IsNothing ou IsEmpty ou IsNull).

donc me bloquer avec l’erreur 91 des que le programme rencontrer une cellule sans commentaire

j’ai contourner le soucis avec ceci

On Error Resume Next
commentaire = Cells(ligne, colonne).comment.Text
If Err.Number = 91 Then
resultat = "SERVICE " & service & Chr(10) & repas & Chr(10) & nombre
Else
resultat = "SERVICE " & service & Chr(10) & repas & Chr(10) & nombre & " " & commentaire
End If

Pour ne pas avoir à mettre en oeuvre la procédure de retraitement d’erreurs, tu peux tout simplement tester l’existence d’un éventuel commentaire :

If Cells(ligne, colonne).comment Is Nothing Then
resultat = "SERVICE " & service & Chr(10) & repas & Chr(10) & nombre
Else
resultat = "SERVICE " & service & Chr(10) & repas & Chr(10) & nombre & " " & Cells(ligne, colonne).comment.Text
End If
Edité le 14/06/2011 à 12:47

merci beaucoup plus simple en effet