Instructions VBA qui fonctionnent une fois sur deux

Bonjour,

Afin d’aider un membre sur un autre fil, j’ai commencé les macros du fichier ci-joint. Celles-ci sont une simplification de codes beaucoup plus longs et il se peut que vous ne compreniez pas toutes les parties qui semblent inutiles.

La macro principale ‘Sub Report()’ recherche dans le texte d’une cellule les retours à la ligne Chr(10), les espaces et les traits d’union et traite individuellement chaque partie séparée par l’un de ces signes.

Pour la cellule C17 - référencée en H3 pour une raison bien précise - cette macro traite donc tout d’abord la chaine ‘12’, puis la chaine ‘34‘, puis la chaine’56’ et enfin la chaine ‘78’.

On peut très bien le voir en plaçant un point d’arrêt sur la ligne

LitCouleurRVB Range(Bloc_1).Characters(Start:=Position_départ, Length:=Position_fin - 1).Font.Color et en lançant autant de fois que nécessaire la macro ; mon code y passe 4 fois.

Après la ligne indiquée ci-dessus, le code devrait continuer en passant par la macro ‘Public Sub LitCouleurRVB’, mais bizarrement, ça ne passe pas par ce code annexe à chaque fois, seulement la première et la quatrième fois !!!!!

Avez-vous une idée pourquoi ?

Autre question : par la ligne If Range(Bloc_1).Characters(Start:=Position_départ, Length:=Position_fin - 1).Font.Bold = True Then Drapeau_Bold = True, je cherche à savoir si les différentes chaines traitées sont en gras ou bien non. Cette ligne découvre alors sans problème que le texte ‘12’ est en gras, mais n’indique pas que le texte ‘56’ l’est également !

A nouveau, avez-vous une idée pourquoi ?

A vous relire.

25demo-forum.zip (14.40 Ko)

Bonsoir Yvouille

je ne voit pas soucis dans ta macros...

j'ai eut, je pense, un problème similaire il y a quelques temps...

quand j’exécutais mon code en mode pas à pas tout fonctionnait correctement, mais dès que je lançait la macro normalement il y avait des lignes de codes qui ne se faisaient pas.... puis en mettant des temps d'arrêt avec des msgbox pour voir l'evolution plus de soucis...

a croire que mon pc moulinait trop vite pour l’exécution de la macro.

j'avais trouvé une solution, qui n'est pas optimale, mais qui avait quand même l'avantage de fonctionné, en faisant une pause avec

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Sleep (500)

je ne suis pas sur d’être d'une grande aide... mais bon...

fred

Salut Fred et merci pour ta réponse.

Mon soucis est que je voudrais que mon texte en C17 soit reproduit absolument à l’identique – y compris les mises en forme – en H17 et que seules certaines parties du texte complet le sont.

Je ne vois pas trop comment tu penses que je devrais utiliser l'instruction proposée dans mon code. Mais je dois quand même te dire que j’ai de gros doutes quant au résultat. Peut-être devrais-tu tester toi-même ta solution et voir si ça joue.

Amicalement.

Bonsoir Yvouille

au premier passage,

LitCouleurRVB Range(Bloc_1).Characters(Start:=Position_départ, Length:=Position_fin - 1).Font.Color 

le résultat te renvoi un nombre car position départ =1 et position fin =3

donc pas de souci

mais vu que tu as placé on resume next,

au second et troisieme passage, litcouleur =null donc pas d'appel des couleurs et du bold

en conclusion, c'est la position fin de chaque boucle qui est faux

a toi de jouer

bon courage

Bonjour,

On Error Resume Next

Tu ne voudrais pas tester en ajoutant On Error Goto -1 dès que tu n'en a plus besoin ?

Après les 3 lignes .Search je suppose...

Je dis bien Goto -1. Pour réinitialiser le gestionnaire d'erreur en plus d'effacer l'erreur ce qui n'est pas fait avec Goto 0, et comme tu boucles sur une étiquette ne compte pas sur le End Sub...

Pas regardé le reste mais ça ça m'a fait tilt.

Et pas bien compris comment tester. Il ne passe toujours que 2 fois dans le sub et il est tard

eric

Bonjour

Je pense qu'il y a confusion avec Lenght

On doit fournir la longueur du texte à traiter et non la position du caractère

Exemple

1er Mot "12" + vblf

Position_départ = 1, Position_Fin = 3 : Pas de souci pour ça

Après cela se corse

2ème mot "34-"

Position_départ = 4,Position_Fin = 6 : tu devrais avoir (6+4)+1, donc 3 qui correspond à la longueur de "34-"

Je pense qu'il faut creuser dans ce sens

J'ai cherché et j'ai modifié ton code

J'en avais profité pour trouver une autre approche pour résoudre de problème, tu trouveras 2 autres macros pour traiter la "Feuil1" et la "Feuil1 (2)"

A vérifier

Bonjour et merci à tous les intervenants qui ont tenté de m’aider

Banzai m’offre une solution – même deux – toutes cuites, je n’ai donc pas cherché beaucoup plus loin.

Mon intention était d’aider le membre Gloub et je vais donc lui dire de venir consulter ce fil.

@ Banzai Probablement que Gloub aura des problèmes à adapter les codes que tu as proposés à son fichier et je lui proposerai de venir ici demander des compléments d’information en espérant que tu sois d’accord de poursuivre la discussion avec lui. Ca m’éviterait de devoir étudier tes codes, avec le risque de ne pas tout comprendre, du moins pas facilement.

Très bonnes salutations à tout le monde.

Bonsoir

Ton code fonctionne bien, moins compliqué que le mien, pourquoi ne pas continuer avec lui

J'ai juste proposé une autre approche c'est tout

Salut Banzai,

Effectivement que je n'avais pas vu que tu avais corrigé mon code également. Donc probablement que je vais continuer moi - soit sur ce fil, soit sur l'autre fil - en fonction de la réponse de Gloub

Encore merci et bonne fin de soirée.

Bonjour le Forum !

Avant tout, merci à tous ceux qui se sont penchés sur mon problème, à commencer par Yvouille qui a même ouvert ce sujet spécialement pour ça.

Je crois comprendre que la solution avance...mais je n'y comprends rien !

En particulier, la macro du dernier fichier joint sur ce fil me renvoie un message d'erreur...

Pour simplifier, je réintroduis donc ici mon sujet initial (et son fichier joint), parce que je ne saurais pas adapter les dernières réponses au fonctionnement de la macro de mes rêves, que voici :

En partant de 2 cellules-source contenant du texte mis en forme (gras, couleur, souligné,...) je voudrais récupérer dans une 3ème cellule (la cellule-cible) :

  • le contenu initial de cette 3ème cellule, sans perdre ses mises en forme
  • un saut de ligne
  • le contenu de la 1ère cellule, sans perdre ses mises en forme
  • un saut de ligne
  • le contenu de la 2ème cellule, sans perdre ses mises en forme

Le fonctionnement idéal serait :

  • je sélectionne la 1ère cellule source
  • je sélectionne la 2ème cellule source avec CTRL+CLIC (les 2 cellules ne sont pas forcément contiguës et il peut y avoir un filtre actif)
  • je sélectionne la cellule cible par CTRL + CLIC

Merci à tous ceux qui se pencheront là-dessus !

21temp.xls (14.00 Ko)

Bonsoir le forum

Sur une idée de PMO2

Gloub, place ces 2 événementielles dans le module de la Feuil1

double-click pour copier puis click droit pour coller.

Const CHAMP_VALIDE As String = "A1:K20"

Dim Plage As Range

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'au double clic
Dim R As Range
    Set R = Application.Intersect(Target, Range(CHAMP_VALIDE))
    If R Is Nothing Then Exit Sub
    If Target.Value = "" Then Exit Sub
    Cancel = True    'évite le mode édition lié au double-clic
    Set Plage = ActiveCell
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'au clic droit
Dim R As Range
Dim reponse
Dim A$
Dim Adresse$
    Set R = Application.Intersect(Target, Range(CHAMP_VALIDE))
    If R Is Nothing Then Exit Sub
    '/////////////////
    If Plage Is Nothing Then Exit Sub
    Cancel = True    'évite le menu contextuel lié au clic droit
    If ActiveCell <> "" Then
        A$ = Target
        reponse = MsgBox("Plage déjà prise, voulez-vous remplacer le contenu ? ", vbYesNo + vbExclamation, "Attention :")
        If reponse = vbYes Then
            Plage.Copy Destination:=Target
        Else
            Adresse$ = Target.Address
            Plage.Copy Destination:=Target
            Range(Adresse$) = A$ & Chr(10) & Chr(10) & Range(Adresse$)
            Range(Adresse$).EntireRow.AutoFit
            Range(Adresse$).EntireColumn.AutoFit
        End If
    Else
        Plage.Copy Destination:=Target
    End If
    Set Plage = Nothing
End Sub

Problème cela ne recopie pas le format, voir peut-être du coté de la méthode PasteSpecial

klin89

Bonsoir,

Merci d'avoir pris le temps de réfléchir à une solution.

Cela dit soit je ne comprends pas tout, soit des infos se sont perdues en route...

L'idée générale, c'est de pouvoir récupérer dans une 3ème cellule, le contenu de 2 cellules sélectionnées, sans perdre leur mise en forme.

Dans ta macro, je ne vois pas comment on sélectionne les 2 cellules sources...

Mais c'est peut-être là que je n'ai pas compris....

Salut Banzai,

A mon retour de vacances, je découvre un message privé de Gloub qui m’indique que son sujet est un peu resté au point mort. Il est lui-même maintenant en vacances et n’est donc pas trop pressé.

Comme il voudrait voir tes solutions appliquées à ses demandes premières, j’ai tenté de me remettre à la tâche.

J’ai alors découvert qu’avec la macro que j’avais commencée et que tu as modifiée (la macro ‘Report’ placée derrière mon bouton ‘Report’ de ton fichier ‘Yvouille Démo Forum V001.xlsm ‘), le trait d’union reporté en H17 n’est pas coloré de manière correcte, contrairement à si on utilise ton nouveau bouton ‘Recopie1 module Banzai1’ sur la même feuille.

Alors, avant de tenter de comprendre moi-même tes différents codes, je te demande si tu ne serais pas d’accord de répondre toi à la demande de Gloub et de lui trouver une solution afin d’appliquer ton autre macro ‘Recopie2’ à son problème réel, c’est-à-dire qu’au lieu que les textes à recopier soient, dans l’ordre, dans les cellules C17, C3 et C10, qu’ils soient placés aléatoirement sur la feuille ?

Gloub avait proposé qu’il puisse sélectionner les 3 cellules nécessaires par Clic + Ctrl, mais ça risque d’être assez compliqué. J’étais alors parti sur l’idée de lui faire inscrire quelque part sur la feuille les références aux 3 cellules à traiter (d’où, sur la Feuil1, mon tableau en G3:H5) et que la macro parte sur cette base afin d’effectuer le report.

Te charges-tu donc de cela ?

Cordialement.

Bonjour

A tester

Wow ! En plein dans le mille, si j'ai bien compris le souhait de Gloub

Il ne reste plus qu'à attendre qu'il revienne au pays - enfin, dans votre pays, quoi - pour voir s'il est tout autant enthousiaste que moi

Merci de t'être chargé de ce problème.

Amicalement.

Bonjour à tous,

Je reviens "au pays" et WOW !!!

C'est parfait, génial, incroyable.

Merci merci merci à tous les contributeurs et en particulier à Yvouille et à Banzai64.

Vous n'imaginez pas comme ça va me faciliter la vie.

Dernier truc : je pense que mon cas est très particulier, mais sans doute ça intéresserait les membres du forum de disposer d'une version simplifiée, qui ajoute simplement le contenu d'une cellule source au au contenu d'une cellule cible en conservant le format de l'une et de l'autre.

Mais bon, c'est encore du boulot, alors c'est comme vous le sentez.

Rechercher des sujets similaires à "instructions vba qui fonctionnent fois deux"