Pourquoi que ca marche pas???

Bonsoir,

J'ai un problème insoluble et incompréhensible avec un fichier.

Le but de ce fichier est de gérer les formations des agents de mon boulot.

La macro qui pose problème est sensée se baser sur une base de données que l'on nous envoie pour remplir une base de données interne au fichier.

Cette seconde base de données se remplit à l'aide de deux onglets.

J'ai réussi à tout programmer (à ma façon d'autodidacte, c'est-à-dire très brouillon...), et j'ai un résultat incompréhensible...

Une variable répète mon code pour chaque ligne de la base de données initiale. Sur les plus de cent lignes, ça fonctionne pour toutes sauf quatre, perdues au milieu des autres données et je ne comprends pas pourquoi, la formule étant la même...

Si vous pouvez m'aider, ce serait sympa.

Malheureusement, le fichier est trop gros pour le joindre mais je peux vous l'envoyer par mail.

Merci d'avance.

Bonsoir,

utilise ce lien http://www.cjoint.com

Amicalement

Claude

Merci!!

Bonsoir

Dans toutes ces macros laquelle pose problème ?

A priori Private Sub CommandButton3_Click()

Essaies de faire la manip de mon texte de départ dans le forum, tu pourras constater le soucis.

Merci

Bonsoir,

Ta macro ne fonctionne pas bien car ta feuille "Liste Perso" possède plusieurs caractères "espace" parasites colonne 3 ou 5

Ligne 46 : DUBOIS# Colette

Dans cette extraction c'est 6 fois la même erreur, mais il y à d'autres caractères "espace" sur d'autres lignes qui le cas échéant produiraient le même effet si ces noms figuraient dans le "PAF"

Il est donc important d'éliminer tous les espaces de fin indésirables dans les colonnes 3 et 5 de ta feuille "Liste Perso" .

La macro sera plus rapide si tu la modifies comme suit :

Private Sub CommandButton3_Click()
Dim i%, k%, kp%, ko%, p%, o%

MsgBox "Cette opération peut prendre quelques secondes."
kp = Sheets("PAF").Range("A10000").End(xlUp).Row
ko = Sheets("Liste_perso").Range("A10000").End(xlUp).Row
For i = 1 To k
Sheets("PAF").Range("A" & i) = UCase(Sheets("PAF").Range("A" & i))
Next

For p = 2 To kp
  For o = 2 To ko
    If Sheets("PAF").Cells(p, 1) Like "*" & Sheets("Liste_perso").Cells(o, 3) & "*" Then
      If Sheets("PAF").Cells(p, 1) Like "*" & Sheets("Liste_perso").Cells(o, 5) & "*" Then
        If Not Sheets("PAF").Cells(p, 5) = "DEMANDE ETAT NEANT" Then
          With Sheets("Recap_formations")
          k = .Range("B10000").End(xlUp).Row + 1
            .Cells(k, 2) = Sheets("Liste_perso").Cells(o, 3)
            .Cells(k, 3) = Sheets("Liste_perso").Cells(o, 5)
            .Cells(k, 4) = Sheets("Liste_perso").Cells(o, 9)
            .Cells(k, 5) = Sheets("Liste_perso").Cells(o, 15)
            .Cells(k, 6) = Sheets("Liste_perso").Cells(o, 12)
            .Cells(k, 7) = "PAF"
            .Cells(k, 8) = "CONTINUE"
            .Cells(k, 9) = Sheets("PAF").Cells(p, 5)
            .Cells(k, 10) = Sheets("PAF").Cells(p, 12)
            .Cells(k, 11) = Sheets("PAF").Cells(p, 14)
          End With
        End If
      End If
    End If
  Next
Next

MsgBox "L'intégration s'est déroulée avec succès."
End Sub

Cette macro supprimera tous les espaces indésirables dans les cellules sélectionnées :

Sub SupprimeEspace()
For Each o In Selection
  o.Value = Trim(o)
Next
End Sub

A+

Bien joué!

Encore une fois ca marche parfaitement!

Par contre si je peux me permettre... Est-ce que tu peux m'expliquer le code?

JE ne comprends pas du tout la définition de tes variables

Merci

Bonjour,

Il est communément admis de déclarer les variables dès le début de la procédure.

Les déclarations suivantes sont identiques :

Sub blabla()
Dim i%, k%, kp%, ko%, p%, o%
Sub blabla()
Dim i as Integer, k as Integer, kp As integer, ko as Integer, p as Integer, o as Integer
Sub blabla()
Dim i as Integer
Dim k as Integer
Dim kp As integer
Dim ko as Integer
Dim p as Integer
Dim o as Integer

Donc tu peux utiliser l'une ou l'autre forme si ça te fait plaisir. Personnellement le galopin étant un peu fainéant j'utilise le plus simple donc le moins fatiguant !

Les variables sont des containeurs destinés à contenir des choses différentes.

Quand tu les déclares ainsi :

Dim i

Tu déclares un containeur vide qui peut contenir n'importe quoi : cornichons, papillons, string, cellules...

Si tu déclares ainsi :

Dim i as Integer

Tu déclares un containeur qui ne peut contenir que des nombres (integer de -32 768 et 32 767) ce qui est bien suffisant pour des numéros de lignes et beaucoup plus économique du point de vue de vue de VBA car déclarer un container polyvalent qui peut contenir aussi bien des cornichons, que des nombres est très couteux en terme de ressources VBA.

J'ai donc juste précisé la destination de tes variables : Tes variables sont toutes destinées à contenir plus tard des nombres (numéro de ligne inférieurs à 36000) donc integer.

En outre j'ai créé les variables kp et ko destinées à mémorisé le nombre de lignes des feuilles "PAF" et "Liste perso" ce qui est plus pratique de de boucler systématiquement sur 10000 lignes inutiles et de programmer un Exit tout aussi inutile...

Ok ?

A+

C'est marrant. En lisant ton message je me sens tout bête... Parce que tout devient si limpide.

Merci de ces explication qui m'ouvrent les yeux sur certaines choses que je ne comprenais alors pas.

Merci beaucoup!!!

Rechercher des sujets similaires à "pourquoi que marche pas"