[Résolu] Soucis sur une macro

Bonjour à tous et à toutes,

Etant novice en matière de macros je me permets de soliciter votre aide.

Au sein d'un classeur, je dispose de deux feuilles :

  • l'une est un tableau reprenant toutes les informations relatives à une vente ( nom du commercial, montant de la transaction etc ...)
  • l'autre est un courrier ( curieux sur exel je sais x) ) qui devra être automatisé de A à Z en fonction des informations saisies dans la première feuille.

Mon problème est le suivant, dans ma première feuille ( que nous appellerons Données ) se trouve les conditions de paiement de la vente ( de B33 à B44 ). Et je souhaite retranscrire dans mon courrier uniquement les champs remplis.

Est-il possible de créer une macro qui ne selectionnerait que les champs remplis ( de la feuille Donnees, cellules B33 à B44 ) pour les insérer dans mon courrier ? ( de B35 à B46 )

En espérant avoir été clair, et en vous remerciant par avance

Syon

Salut le forum

Essaye avec l'enregistreur de macro, et regarde le code fourni.

Tu peux recopier ton code ici, pour que quelqu'un maximise ta macro.

Sinon, tu n'as qu'à cliquer sur ce lien : Joindre un fichier pour que quelqu'un puisse t'aider, et recopier l'adresse sur ta ficelle.

Mytå

Bonsoir et bienvenue au club,

en nommant ta 2ème feuille "courrier"

Tu lance la macro depuis la feuille "données"

Sub AjouteCourrier()
Dim N
Dim i As Integer
    Application.ScreenUpdating = False

    N = WorksheetFunction.CountA(Range("b33:b44"))
        If N = 0 Then Exit Sub
            Range("b33").Activate
                Do While ActiveCell = ""
                    ActiveCell.Offset(1, 0).Select
                Loop
            ActiveCell.Copy Destination:=Range("courrier!b35") '1ère
    For i = 1 To N
saute:          If ActiveCell = "" Then
                        ActiveCell.Offset(1, 0).Select
                    GoTo saute
                End If
            ActiveCell.Copy Destination:=Range("courrier!b45").End(xlUp)(2)
            ActiveCell.Offset(1, 0).Select
    Next i
End Sub

amicalement

Claude.

En effet ca à l'air de fonctionner, un grand merci à toi

J'ai cependant remarqué un petit détail curieux. Lorsque j'éxécute ma macro, la première valeur que je saisie dans ma feuille de données est toujours insérée en double dans mon courrier. J'ai beau me pencher dessus, je ne l'explique pas. Une idée ?

Merci encore.

Bonsoir,

ton fichier n'est certainement pas configuré comme ta 1ère description !

ou alors, envoie ta feuille

Claude.

re,

reste sur le fil du forum, pas de MP

remplace le code par celui-ci

Sub AjouteCourrier()
Dim N
Dim i As Integer
    Application.ScreenUpdating = False

    N = WorksheetFunction.CountA(Range("b33:b44"))
        If N = 0 Then Exit Sub
            Range("b33").Activate
                Do While ActiveCell = ""
                   ActiveCell.Offset(1, 0).Select
                Loop
            ActiveCell.Copy Destination:=Range("courrier!b35") '1ère
            ActiveCell.Offset(1, 0).Select
    For i = 1 To N - 1
saute:          If ActiveCell = "" Then
                        ActiveCell.Offset(1, 0).Select
                    GoTo saute
                End If
            ActiveCell.Copy Destination:=Range("courrier!b45").End(xlUp)(2)
            ActiveCell.Offset(1, 0).Select
    Next i
End Sub

Claude.

Et bien le moins que je puisse dire c'est bravo et surtout un grand merci à toi, je ne pensais pas qu' Excel offrait de telles possibilités de "programmation", il semblerait que l'on puisse tout faire, du moment que l'on possède la bonne macro.

Supposons que je veuille sur ma feuille "courrier" ( cellule B35 ) établir une macro dans ce genre là :

Comme précedemment, je ne souhaite selectionner que les champs remplis de la feuille "Donnees", ( cellules B33 à B44 ) mais, il faudrait concatener ces informations avec les infos d'une autre feuille, que nous appelerons "Recap" , pour avoir un résultat dans ce genre là :

  • > Si Donnees!B33 contient des données, alors concatener avec Recap!A2
  • > Si Donnees!B33 est vide alors regarder si Donnees!B34 contient des données, si tel est le cas, alors concatener avec Recap!A3
  • > Si B34 est vide, alors chercher si Donnees!35 contient des données, si tel est le cas, alors concatener avec Recap!A4 et ainsi de suite

J'ai tenter en vain de programmer une fonction, mais il s'avère que ce n'est vraiment pas la solution appropriée, surtout pour avoir les résultats les uns en dessous des autres sans lignes vides. Une telle macro est elle possible ?

Cordialement

Syon

Bonsoir Syon et à tous,

Oui, c'est possible ! . + complexe, mais tout à fait possible.

Pour le moment, j'ai 3 gros fichiers sur le feu et je ne pourrais t'aider.

Relance si tu n'obtiens pas de réponse.

Claude.

Pas de soucis, je vais essayer de me pencher dessus je verrai bien ce que ça donne.

Ceci dit, si quelqu'un a des suggestions, je suis preneur.

Syon

Up, et bonsoir à tous.

Plutot galère à trouver , quelqu'un à une idée ?

Merci d'avance,

Syon

Bonsoir à tous,

Aprés de nombreux essais je m'approche du but, cependant, bien que ma macro s'éxécute, le résultat ne s'affiche pas ( #REF )

En gros, comme précedemment, je souhaite récupérer uniquement les cellules remplies d'une plage de données ( Feuille Recap, de C2 à C13, les données à l'intérieur de ces cellules sont des valeurs concatenées des colonnes A & B ) pour les transférer dans ma feuille courrier ( de B35 à B46 )

Ma macro est la suivante :

Sub AjouteCourrier()

Dim N

Dim i As Integer

Application.ScreenUpdating = False

N = WorksheetFunction.CountA(Range("c2:c13"))

If N = 0 Then Exit Sub

Range("c2").Activate

Do While ActiveCell = ""

ActiveCell.Offset(1, 0).Select

Loop

ActiveCell.Copy Destination:=Range("courrier!b36") '1ère

ActiveCell.Offset(1, 0).Select

For i = 1 To N - 1

saute: If ActiveCell = "" Then

ActiveCell.Offset(1, 0).Select

GoTo saute

End If

ActiveCell.Copy Destination:=Range("courrier!b47").End(xlUp)(2)

ActiveCell.Offset(1, 0).Select

Next i

End Sub

Quelqu'un voit d'ou peux venir l'erreur ?

Merci d'avance,

Syon

Bonsoir,

en lisant ton code, je vois au moins 4 .Select en trop.......

Et comme tu n'as pas joint de fichier exemple, il sera assez dur de te répondre à coup sûr..

Élabores un fichier factice, avec ce que tu pourrais avoir, au début, et ce que tu désirerais, en fin....

Bonne soirée

Salut le forum

Ton dernier recours c'est de joindre un fichier épuré de données confidentielles.

Tu n'as qu'à cliquer sur ce lien : Joindre un fichier pour que l'on puisse t'aider, et recopier l'adresse sur ta ficelle.

Mytå

Bonjour à tous et merci de votre réactivité,

Voilà le fichier en question :

https://www.excel-pratique.com/~files/doc/1tqHCCourrier_auto.rar

J'ai mis en fond vert les champs qui nous intéresse.

Petit récapitulatif, pour infos :

  • les colonnes A & B de la feuille "Recap" s'automatisent avec les valeurs de la feuille "Donnee"
  • la colonne C de la feuille "Recap" concatene les valeurs des colonnes A & B

Objectif :

- Copier / Transférer uniquement les cellules remplies de la colonne C de la feuille "Recap" dans le courrier ( de B35 à B46 )

Contrainte : les données transférées sur le courrier doivent être alignées ( pas de saut de lignes entre les valeurs autrement dit )

En espérant avoir été le plus clair possible et vous remerciant par avance,

Cordialement

Syon

Bonsoir à tous,

Personne a une idée de la macro à utiliser ? Parceque là, à force d'essayer en vain il commence à me sortir par les yeux ce courrier x)

En espérant une réponse,

Cordialement

Syon

Re-bonsoir,

Un peu de nouveau, avec la macro suivante, les données concatenées ( C2 : C14 ) se copient bien dans au sein de mon courrier, exeptées les données de C3. ( allez savoir pourquoi u_u )

De plus, les cellules remplies ne se mettent pas les unes en dessous des autres.

dubois si tu passes par ici, tu reconnaitras ta macro que j'ai adapté. Sauf que la mienne ne marche pas comme elle devrait x)

Je suis toujours ouvert aux suggestions

Cordialement,

Syon

Sub Conditions()

Dim N

Dim i As Integer

Application.ScreenUpdating = False

N = WorksheetFunction.CountA(Range("c2:c14"))

If N = 0 Then Exit Sub

Range("c2").Activate

Do While ActiveCell = ""

ActiveCell.Offset(1, 0).Select

Loop

ActiveCell.Copy Destination:=Range("courrier!b36") '1ère

ActiveCell.Offset(1, 0).Select

For i = 1 To N - 1

saute: If ActiveCell = "" Then

ActiveCell.Offset(1, 0).Select

GoTo saute

End If

ActiveCell.Copy Destination:=Range("courrier!b47").End(xlUp)(2)

ActiveCell.Offset(1, 0).Select

Next i

End Sub

PS : félix, j'ai essayé de lever les .Select, mais la macro refuse de s'éxécuter.

bonsoir,

concataine directement dans recap sans formule

Sub AjouteRecap()
Dim N
Dim i As Integer
Dim k As Variant
    Application.ScreenUpdating = False

    N = WorksheetFunction.CountA(Range("b33:b44"))
        If N = 0 Then Exit Sub
            Range("b33").Activate
                Do While ActiveCell = ""
                    ActiveCell.Offset(1, 0).Select
                Loop
    For i = 1 To N
saute:          If ActiveCell = "" Then
                    ActiveCell.Offset(1, 0).Select
                    GoTo saute
                End If
            k = ActiveCell & " % à la mise en fabrication"
            Range("Recap!c65536").End(xlUp)(2) = k
            ActiveCell.Offset(1, 0).Select
    Next i
End Sub

claude.

Une fois encore ton aide est précieuse, mais ta macro est programmée pour toujours mettre le libellé " % à la mise en fabrication" dans les données qu'elle concatene.

Or, le but est de concataner les valeurs inscrites dans la feuille de données avec les libellés correspondants.

ex : 10% à la commande, 30% à la livraison etc

Ta macro est juste, dans le sens ou elle concatenne les taux les uns à la suite des autres, seuls les libéllés sont éronnés.

Merci tout de même de ta réponse à cette heure-ci. On s'approche doucement du "Résolu" =)

re,

tu veux prendre la colonne A de donnée et la concaténer ?

édit :il me manque les colonne de %

on verras çà demain

Claude.

re,

tu veux prendre la colonne A de donnée et la concaténer ?

Avec les taux correspondant oui.

Les conditions de vente ( taux + libellé ) se concatennent automatiquement en colonne C de Recap. L'idéal serait de copier les données d'ici dans le courrier, ou si ce ne pas possible, de la feuille données directement.

C'est tout ce qu'il reste à faire, vu que ta macro prends en compte l'alignement des valeurs.

En fichier joint, un classeur avec les données qu'il te manque.

https://www.excel-pratique.com/~files/doc/Feuilles_SIP.rar

Bonne fin de soirée,

Cordialement,

Syon

Rechercher des sujets similaires à "soucis macro"