Copier Coller erreur de compatibilité [Résolu]

Signaler
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
bonjour, suite à un nouveau problème, je reviens vers vous. Pour le coup, je ne comprends vraiment pas le truc.

Voici le code dans son intégralité.

L'objectif est de mettre des valeurs de la feuille SoldeCaisse (colonne 4) dans la feuille Synthèse (colonne 6 par exemple).

Ce code marchait très bien pour d'autre feuilles mais ne fonctionne pas pour la feuille SoldeCaisse. Il refuse de prendre les données pour la colonne 4 (dans les autres feuilles, les données à copier se trouvaient en colonne 7).

L'erreur est de type:

erreur d'exécution 13 incompatibilité de type

Sub MettreDépensesDansSynthèse()
 
'Déclaration des variables
Dim Z As Integer
Dim A As Integer
Dim B As String
Dim C As Integer
Dim Y As Integer
Dim D As Integer
Dim E As Integer
Dim F As Currency
Dim Nom As String
Dim Nom2 As String

For Each Wb In Application.Workbooks 'ouverture de la boucle: pour tous les classeurs ouverts

    Nom = Wb.Name 'la variable Nom prend la valeur du nom du fichier activé
    
If Left(Nom, 5) = "suivi" Then
Nom2 = Nom
Else
End If
Next

'Je me mets sur la feuille ou je dois commencer la macro

Workbooks(Nom2).Worksheets("Dépenses").Select

Z = Range("B3").End(xlDown).Row 'je calcule le nombre de ligne dans la feuille écarts
C = 1

For A = 4 To Z
    B = 0 'On initialise la valeur B

    If Len(Cells(A, 2)) = 10 Then 'Test pour savoir si la cellule contient bien 10 caractères
            B = Cells(A, 2).Value  'La variable B prend la valeur de la cellule de la ligne A et de la 2è colonne
            B = Right(B, Len(B) - 6)  'On enlève les 6 premiers caractères
            Cells(C, 11).Value = B 'On a copié le numéro d'agence dans le colone K
            Cells(C, 12).Value = A 'On a copié le numéro d'agence dans le colone L
            C = C + 1
   Else
   End If
Next A

Z = Range("K1").End(xlDown).Row

Sheets("Synthèse").Select
Y = Range("A6").End(xlDown).Row

Sheets("Dépenses").Select


'C'EST CETTE ETAPE QUI NE MARCHE PAS

For A = 1 To Z

    B = Cells(A, 11).Value
    Sheets("Synthèse").Select
    
    For D = 6 To Y
        If Cells(D, 1).Value = B Then
        Sheets("Dépenses").Select
         E = Cells(A, 12).Value
         F = Cells(E, 7).Value
        Sheets("Synthèse").Select
        Cells(D, 4).Select
        Cells(D, 4).Value = F
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'Dépenses'" & "!G" & E
        Range(Cells(7, 4), Cells(Y, 4)).Select
        Selection.Font.ColorIndex = 0
        Selection.HorizontalAlignment = xlCenter
        Sheets("Dépenses").Select
        Else
        End If
    Next D
    
Next A

'FIN DE L'ETAPE QUI NE MARCHE PAS

Columns("K:L").Select
Selection.ClearContents

Sheets("Synthèse").Select
Cells(1, 1).Select

End Sub


Je pense que c'est une erreur de format ou un truc du style que je ne vois pas de part mon manque d'expérience en VBA.

Je précise: les données de la feuille SoldeCaisse à la colonne 4 sont en Standard (les valeurs sont des chiffres).

Merci d'avance de votre aide.

19 réponses

Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Pour la virgule, je regarderais du côté de la fonction Replace ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Tu ne m'as répondu en ce qui concerne la liberté ou non de modifier d'emblée les données importées.
Je vais donc traiter les deux hypothèses :
Hypothèse 1 : oui : tu as cette liberté et alors , tout de suite après ton code d'importation des données du CSV :

Dim plage As Range
  With Sheets("depenses") ' si dépenses est bien son nom ... sinon : modifie
    Set plage = .Range("D4:D" & .Range("D" & Rows.Count).End(xlUp).Row)
    plage.NumberFormat = "###0.####"
    plage.Value = plage.Value ' ne sois par surprise par cela, hein (tu verras tes virgules remplacer les points).
    set plage = nothing
  End With

Cette hypothèse 1 est celle la meilleure (adapter de'emblée la source)

Hypothèse 2 : tu n'as pas le droit de modifier la source, mais uniquement le résultat (ta feuille "synthèse").===>> et alors dans ce cas ===>> et avec ton mécanisme (tel qu'il est) ===>>
'C'EST CETTE ETAPE QUI NE MARCHE PAS

  Dim desti As Worksheet, source As Worksheet
  Set desti = Sheets("synthèse")
  Set source = Sheets("Dépenses")
  For A = 1 To Z
      For D = 6 To Y
        If source.Cells(D, 1).Value = sourceCells(A, 11).Value Then
          E = source.Cells(A, 12).Value
          With desti
            .Cells(D, 6).Value = source.Cells(E, 4).Value
            .Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'Dépenses'" & "!G" & E
            .Range(Cells(6, 6), Cells(Y, 6)).Font.ColorIndex = 0
            .Range(Cells(6, 6), Cells(Y, 6)).HorizontalAlignment = xlCenter
          End With
        End If
     Next D
'FIN DE L'ETAPE QUI NE MARCHE PAS
with desti
  dim plage as range
  Set plage = .Range("D1:D" & Z)
  plage.NumberFormat = "###0.####"
  plage.Value = plage.Value 
  set plage = nothing
End with
...
et ta suite ...

Supprime bien évidemment la ligne déclarant F, devenue inutile.
Voilà. J'ai préféré parler d'une feuille source et d'une feuille desti car je ne sais plus où on en est (les noms que tu as donnés changent d'un message à l'autre ...)
Comme tu le vois : j'ai enlevé tous les Select de cette étape. On n'y utilise pas non plus de Replace en boucle. Pas de Replace du tout, d'ailleurs.
Je n'ai traité que l'étape concernée et cela ne signifie pas que j'approuve (ni les mécanismes, ni tes select, activate, etc ...)

Il se peut que, dans tes classeurs à portée de main et donc "tirant dans le brouillard", je me sois trompé sur un détail de pointage. Tu dis.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bonjour,
B = Right(B, Len(B) - 6)  'On enlève les 6 premiers caractères

C'est tout bêtement
B = Mid(B,7)
!
Veux-tu bien commencer par cesser de travailler à coups de select et cie, au lieu de travailler avec lkes objets de Excel ? (je ne regarderai qu'après cet effort, personnellement).
Par exemple (et uniquement par exemple, car à corriger ailleurs également dans ton code) :
Sheets("Synthèse").Select
 Cells(D, 4).Select
 Cells(D, 4).Value = F

n'est rien d'autre que
Sheets("Synthèse").cells(D,4).value =  F

qui, au moins : va beaucoup plus vite en exécution - évite de transformer ta feuille en arbre de Noël
Reviens avec tout ton bout de code corrigé dans ce sens et je le regarderai alors.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Une précision :
Pour que tu comprennes bien ma réaction :
J'ai déjà eu l'occasion (plus d'une fois) d'appeler ton attention sur cet aspect-là.
Tu ne peux être un(e) éternel(lle) débutant(e).
Si l'on ne corrige pas à la source cette manière d'aborder le développement, on n'y arrive pas !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Je fais ça tantôt. Désolée, ces codes dates et ne proviennent pas de moi mais de quelqu'un qui tente de m'aider en prog, et je n'ai pas encore eu le temps de tout homogénéiser.

En tout cas, je ne vois pas ce qu'un select te fait, ils sont parfois obligatoires.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Ah !
Soit tu invites cette personne à venir ici elle-même
soit tu viens discuter ici de ton propre code

Dans le cas contraire : cela voudrait dire : corrigez s'il vous plait à ma place un code que je ne comprends pas et que je n'ai pas écrit !
Sur ce forum de développeurs, tu voudras bien comprendre que l'on discute entre développeurs et non par personnes interposées entre développeurs.

Si le développeur précédent a écrit unb code inefficace ou défectueux ===>> Ecris donc le tien et on en discutera mieux et en meilleure connaissance de cause alors.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Il est par ailleurs attendu (et c'est un minimum) que le demandeur ne se contente pas de dire qu'il a une erreur (même en précisant laquelle), mais qu'il précise sur quelle ligne. Tu ne l'as pas fait. Doit-on donc deviner ?
Or, il se trouve que cette erreur dépend de tes données, que tu es seule à connaître ! Et seule l'indication de la ligne où elle surgit peut guider vers la découverte de la donnée fautive !
A défaut, donc, de cette précision : tout ce que je devine est que l'une de tes données n'est pas un numérique valide attendu (et que l'erreur est alors générée sur une de tes lignes de code déterminant la valeur de A,A,B,C,Y,D,E ou F).
Entre donc en mode débug et vérifie ===>> tu le sauras ainsi rapidement
Voilà voilà !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Ca bug là:

Il refuse de prendre les données pour la colonne 4 (dans les autres feuilles, les données à copier se trouvaient en colonne 7).

Ca me paraissait clair: l'erreur intervient quand il y a la colonne 4
Voici le code épuré:

Sub MettreDépensesDansSynthèse()
 
'Déclaration des variables
Dim Z As Integer
Dim A As Integer
Dim B As String
Dim C As Integer
Dim Y As Integer
Dim D As Integer
Dim E As Integer
Dim F As Currency
Dim Nom As String
Dim Nom2 As String

For Each Wb In Application.Workbooks 'ouverture de la boucle: pour tous les classeurs ouverts

    Nom = Wb.Name 'la variable Nom prend la valeur du nom du fichier activé
    
If Left(Nom, 5) = "suivi" Then
Nom2 = Nom
Else
End If
Next

'Je me mets sur la feuille ou je dois commencer la macro

Z = Workbooks(Nom2).Worksheets("SoldeCaisse").Range("A7").End(xlDown).Row

  'je calcule le nombre de ligne dans la feuille SoldeCaisse

Workbooks(Nom2).Worksheets("SoldeCaisse").Activate

C = 1
For A = 7 To Z
    B = 0 'On initialise la valeur B

    If Len(Cells(A, 1)) = 4 Then 'Test pour savoir si la cellule contient bien 4caractères
            B = Cells(A, 1).Value  'La variable B prend la valeur de la cellule de la ligne A et de la 2è colonne
            Cells(C, 11).Value = B
            Cells(C, 12).Value = A
            C = C + 1
   Else
   End If
Next A

Z = Workbooks(Nom2).Worksheets("SoldeCaisse").Range("K1").End(xlDown).Row

Y = Sheets("Synthèse").Range("A6").End(xlDown).Row

Sheets("SoldeCaisse").Select


'C'EST CETTE ETAPE QUI NE MARCHE PAS

For A = 1 To Z

    B = Cells(A, 11).Value
    Sheets("Synthèse").Select
    
    For D = 6 To Y
        If Cells(D, 1).Value = B Then
        
         E = Sheets("SoldeCaisse").Cells(A, 12).Value
         F = Sheets("SoldeCaisse").Cells(E, 4).Value 'ligne PLANTE
         
        Sheets("Synthèse").Cells(D, 6).Value = F
        
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="'Dépenses'" & "!G" & E
        Range(Cells(6, 6), Cells(Y, 6)).Select
            Selection.Font.ColorIndex = 0
            Selection.HorizontalAlignment = xlCenter
        Sheets("SoldeCaisse").Select
        Else
        End If
    Next D
    
Next A

'FIN DE L'ETAPE QUI NE MARCHE PAS

Worksheets("SoldeCaisse").Columns("K:L").ClearContents

Sheets("Synthèse").Select

End Sub





Les select restants sont pour moi utiles dans la mesure où ils permettent de savoir où se placer, ou alors pour les mises en forme, de faire moins de ligne de code. Je me trompe peut être.


Merci donc de m'aider pour ces fameuses lignes où la colonne 4 est refusée.

Je précise: la ligne qui plante: Elle marche pour A=1 car la valeur dans la colonne 4 est nulle (case vide). Puis pour A=2, soit pour le deuixème tour de la boucle for, c'est là qu'il me sort l'erreur 13.

Je vous donne donc les valeurs des premières cellules de SoldeCaisse à reporter dans Synthèse:

Ligne 8 colonne 4:
Ligne 9 colonne 4: 367.76
Ligne 10 colonne 4:112.93
Ligne 11 colonne 4:613.78



J'espère être claire...
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Bonjour. Insères entre la ligne E = et F = la ligne suivante :
                       Debug.Print E

puis après le plantage vérifies la valeur de E dans la fenêtre d'exécution de l'environnement VBA ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Il "plante" donc ici :
F = Sheets("SoldeCaisse").Cells(E, 4).Value 'ligne PLANTE

Je tg'ai demandé d'entrer en mode debug, non ?
Combien vaut donc E à ce moment là ?
Je parie qu'il ne s'agit pas d'un numérique pouvant être typé en Currency !
Rentre donc en mode debug et dis-nous (nécessaire)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Ce qui est d'ailleurs le cas de tout nombre décimal où le séparateur décimal est le point, si (comme c'est presque toujours le cas sur les versions françaises) il a été défini comme virgule, hein ... !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
(je n'avais pas vu que le mode Debug avait déjà été réclamé ...   Bref nous sommes d'accord !)


___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

MarcPL:
J'ai mis le debug, la valeur de E suite à cela:
E : 9 : Integer

Ucfoutu:

Je connais le mode debug, mais je ne suis pas censée être au courant que quand on demdande un mode debug ça veut dire donner les valeurs des variables. Se serait bien d'expliquer clairement les choses plutôt que d'être désagréable.

Ceci étant dit, ce n'est pas mon E qui est de type currency. Il prend bien les bonnes valeurs, E correspond à la ligne où se trouve la cellule à copier.

C'est bien la valeur de F qui est en currency quand il prend la valeur de la 4eme colonne.

Il y a bien un point et non pas une virgule.
C'est donc CA et UNIQUEMENT CA mon problème.
En effet, les feuilles où j'avais testé, c'était bien des virgules qu'il y avait.

J'ai donc tenté en mettant une virgule à la place du point et ça marche.

Question: comment modifier pour qu'il capte une virgule au lieu d'un point? Mes données sont directement exportées d'un ERP.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bon !
Comme je vois que tu as tout compris (euh..), que tu penses que ce n'est pas ta variable F (de type currency) qui est concernée par le contenu non compatible de la ligne E de la colonne 4..
Je te laisse personnellement net là (comme confirmé par ma réponse à ton message privé).
Il ne m'est humainement pas possible de continuer avec toi dans de telles conditions. Désolé.
Pardonne-moi et bonne chance.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Et un dernier mot : c'était bien et cela continue à l'être, la valeur de la variable E en mode debug qui était (et continue à l'être) révélatrice. Elle seule permettait (et continue à la permettre) de déterminer la ligne concernée dans ta colonne 4.
Derrière tout cela : juste un peu de réflexion. Sans cette réflexion : je n'ai plus la force de t'aider. Impossible sans participation intelligente.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Mon E prendre les valeurs entre 8 et .........
8 9 10 11 12 13 14 ....

Des entiers tout simplement. Le integer est donc requis. Je continu de ne pas voirpourquoi tu insistes sur ce E.

Tu insistes tout le temps sur des problèmes qui n'ont pas lieux d'être:

as tu lu mes postes?

J'ai bien précisé que si je mettais des virgules à la place des points dans les valeurs de ma colonne 4, ça marche.

Si c'est dur à comprendre tant pis.
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Ah ok, merci, je ne connais pas cette fonction. Je vais regarder de ce côté.

Merci beaucoup
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Pour Ucfoutu:

mes données sont importées de l'ERP de l'entreprise en format CSV car il n'y a pas moyen de l'exporter directement en excel. ensuite je convertis en format excel.

Ces données sont ajustables au niveau mise en forme par des macros (à la main c'est trop long il peut y avoir beaucoup de lignes), en supprimant les colonnes qui ne me sont pas utiles, des titres et autres infos qui ne servent pas pour ce que je fais.

Les cellules de la colonne 4 sont comme je l'ai déjà précisé au format standard.

S'il t'en faut plus dis moi, mais il me semble avoir répondu à tout.
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

" Ces données sont ajustables au niveau mise en forme par des macros (à la main c'est trop long il peut y avoir beaucoup de lignes), en supprimant les colonnes qui ne me sont pas utiles, des titres et autres infos qui ne servent pas pour ce que je fais. "

On ne peut pas faire plus claire.