Se connecter avec
S'enregistrer | Connectez-vous

Rechercher dernier numéro

Dernière réponse : dans Programmation

Bonjour;

Je cherche à savoir comment je peux rectifier la macros que j'ai faite ci dessous. En effet je pars d'une base de données comptable et j'ai besoin d'extraire les dernières factures saisies. J'arrive à les sélectionner et les insérer dans mon fichier en faisant un filtre par n° > à 1007108. Cependant la prochaine extraction n'aura plus ce numéros. Je voudrais qu'il aille me chercher le dernier n° dans le fichier de destination et qu'il me fasse le filtre en fonction de ce dernier. J'espère avoir été claire.


'
  1. ChDir "U:\"
  2. Workbooks.OpenText Filename:="U:\ELGI.CO", Origin:=xlMSDOS, StartRow:=1, _
  3. DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
  4. :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
  5. Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), _
  6. Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), _
  7. Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True
  8. ActiveWindow.SmallScroll Down:=-18
  9. Rows("1:1").Select
  10. Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  11. ActiveWindow.SmallScroll Down:=-9
  12. Selection.AutoFilter
  13. ActiveSheet.Range("$A$1:$O$440").AutoFilter Field:=7, Criteria1:="C"
  14. ActiveSheet.Range("$A$1:$O$440").AutoFilter Field:=3, Criteria1:="=9*"
  15. ActiveSheet.Range("$A$1:$O$440").AutoFilter Field:=4, Criteria1:=">[color=#ff0054]1007108[/color]", _
  16. Operator:=xlAnd
  17. Range("A2:M438").Select
  18. Selection.Copy
  19. Sheets.Add After:=Sheets(Sheets.Count)
  20. Range("A2").Select
  21. ActiveSheet.Paste
  22. Columns("A:A").Select
  23. Application.CutCopyMode = False
  24. Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  25. Columns("D:D").Select
  26. Selection.Cut
  27. Columns("A:A").Select
  28. ActiveSheet.Paste
  29. Columns("B:B").Select
  30. Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  31. Columns("D:D").Select
  32. Selection.Cut
  33. Columns("B:B").Select
  34. ActiveSheet.Paste
  35. ActiveWindow.SmallScroll Down:=-9
  36. Columns("A:A").Select
  37. Selection.Cut
  38. Columns("D:D").Select
  39. ActiveSheet.Paste
  40. Columns("F:F").Select
  41. Selection.Cut
  42. Columns("A:A").Select
  43. ActiveSheet.Paste
  44. Columns("J:J").Select
  45. Selection.Cut
  46. Columns("E:E").Select
  47. ActiveSheet.Paste
  48. Range("F2").Select
  49. ActiveCell.FormulaR1C1 = _
  50. "=IF(RC[5]=3,""CHQ"",IF(RC[5]=12,""LCR"",IF(RC[5]=13,""LCR"",IF(RC[5]=""PRE"",""PRE"",IF(RC[5]=""LCM"",""LCM"",IF(RC[5]=""CHQ"",""CHQ"",IF(RC[5]=""VIR"",""VIR"",IF(RC[5]=""TRA"",""TRA"",IF(RC[5]=7,""LCR"","""")))))))))"
  51. Range("F3").Select
  52. ActiveWindow.SmallScroll Down:=-15
  53. Range("F2").Select
  54. Selection.AutoFill Destination:=Range("F2:F125"), Type:=xlFillDefault
  55. Range("F2:F125").Select
  56. ActiveWindow.SmallScroll Down:=-117
  57. Columns("G:G").Select
  58. Selection.Delete Shift:=xlToLeft
  59. Columns("H:I").Select
  60. Selection.Delete Shift:=xlToLeft
  61. Columns("I:L").Select
  62. Selection.Delete Shift:=xlToLeft
  63. Range("J10").Select
  64. ActiveWindow.SmallScroll Down:=-15
  65. Range("A2:G125").Select
  66. Selection.Copy
  67. ChDir "X:\SANDRINE\ECHEANCIERS"
  68. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", _
  69. Origin:=xlWindows
  70. Range("A1146").Select
  71. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  72. :=False, Transpose:=False
  73. ActiveWindow.SmallScroll Down:=-111
  74. Application.CutCopyMode = False
  75. Selection.Borders(xlDiagonalDown).LineStyle = xlNone
  76. Selection.Borders(xlDiagonalUp).LineStyle = xlNone
  77. With Selection.Borders(xlEdgeLeft)
  78. .LineStyle = xlContinuous
  79. .ColorIndex = 0
  80. .TintAndShade = 0
  81. .Weight = xlThin
  82. End With
  83. With Selection.Borders(xlEdgeTop)
  84. .LineStyle = xlContinuous
  85. .ColorIndex = 0
  86. .TintAndShade = 0
  87. .Weight = xlThin
  88. End With
  89. With Selection.Borders(xlEdgeBottom)
  90. .LineStyle = xlContinuous
  91. .ColorIndex = 0
  92. .TintAndShade = 0
  93. .Weight = xlThin
  94. End With
  95. With Selection.Borders(xlEdgeRight)
  96. .LineStyle = xlContinuous
  97. .ColorIndex = 0
  98. .TintAndShade = 0
  99. .Weight = xlThin
  100. End With
  101. With Selection.Borders(xlInsideVertical)
  102. .LineStyle = xlContinuous
  103. .ColorIndex = 0
  104. .TintAndShade = 0
  105. .Weight = xlThin
  106. End With
  107. With Selection.Borders(xlInsideHorizontal)
  108. .LineStyle = xlContinuous
  109. .ColorIndex = 0
  110. .TintAndShade = 0
  111. .Weight = xlThin
  112. End With
  113. ActiveWindow.SmallScroll Down:=111
  114. Range("H1146:P1269").Select
  115. Range("H1269").Activate
  116. Selection.Borders(xlDiagonalDown).LineStyle = xlNone
  117. Selection.Borders(xlDiagonalUp).LineStyle = xlNone
  118. With Selection.Borders(xlEdgeLeft)
  119. .LineStyle = xlContinuous
  120. .ColorIndex = 0
  121. .TintAndShade = 0
  122. .Weight = xlThin
  123. End With
  124. With Selection.Borders(xlEdgeTop)
  125. .LineStyle = xlContinuous
  126. .ColorIndex = 0
  127. .TintAndShade = 0
  128. .Weight = xlThin
  129. End With
  130. With Selection.Borders(xlEdgeBottom)
  131. .LineStyle = xlContinuous
  132. .ColorIndex = 0
  133. .TintAndShade = 0
  134. .Weight = xlThin
  135. End With
  136. With Selection.Borders(xlEdgeRight)
  137. .LineStyle = xlContinuous
  138. .ColorIndex = 0
  139. .TintAndShade = 0
  140. .Weight = xlThin
  141. End With
  142. With Selection.Borders(xlInsideVertical)
  143. .LineStyle = xlContinuous
  144. .ColorIndex = 0
  145. .TintAndShade = 0
  146. .Weight = xlThin
  147. End With
  148. With Selection.Borders(xlInsideHorizontal)
  149. .LineStyle = xlContinuous
  150. .ColorIndex = 0
  151. .TintAndShade = 0
  152. .Weight = xlThin
  153. End With
  154. ActiveWindow.ScrollColumn = 6
  155. ActiveWindow.ScrollColumn = 5
  156. ActiveWindow.ScrollColumn = 4
  157. ActiveWindow.ScrollColumn = 3
  158. ActiveWindow.ScrollColumn = 2
  159. ActiveWindow.ScrollColumn = 1
  160. End Sub



Merci d'avance pour votre aide

Autres pages sur : rechercher dernier numero

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Concernant ton problème de montants, relis les deux derniers codes proposés.
J'ai apporté une petite correction.

Avant correction, on avait le code suivant :
  1. cellule_destination.Value = cellule_source
au lieu de
  1. cellule_destination.Value = cellule_source.Value
Le problème est invisible car le VBA n'hésite pas à interpréter ce que tu veux.

Exemple :
  1. MsgBox Range("A1")
Ce code fonctionne parfaitement. VBA/Excel considère que tu veux le classeur par défaut (ActiveWorkbook), la feuille par défaut (ActiveWorksheet), et la propriété par défaut (qui est Text et non pas Value, d'où l'erreur).
C'est pour éviter tous ses défauts ( :D  ) que je t'ai montré comment programmer explicitement sans laisser à Excel l'opportunité de deviner ce que tu voulais.

Las, dans ma précipitation à te répondre, j'ai laissé passer ce détail.

Tu veux trouver la dernière ligne ?
Enjoy : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
:sol: 
Expert Programmation

Bonjour,

Le règlement stipule que tout morceau de code doit être publié entre les balises [code]. Merci de modifier tout message qui ne respecterait cet impératif !
Expert Programmation

OMG, quel code horrible ! Avoue, ce n'est pas toi qui a écrit une telle laideur. Seul l'enregistreur de macro peut faire aussi moche. Si tu veux, on peut voir ensemble pour l'améliorer.

En attendant, je comprends ceci. Tu voudrais à la ligne 15, mettre la plus grande valeur de la colonne D. Est-ce bien ça ? Si oui, c'est facile :
  1. WorksheetFunction.Max(Columns("D"))

Bonjour Zeb,

Je ne cacherais pas que c'est l'enregistreur qui a écrit ce code horrible, je débute en macro et j'ai déjà modifié pas mal ce code afin de l'améliorer. Mais bon, j'essaye de me former en parallèle.
  1. Sub extraction_achat()
  2. '
  3. ' extraction_achat Macro
  4. ' extraction achat pour christelle afin de lui éviter la double saisie des factures achat, fait le 12082010 par elvan
  5. '
  6. ' Touche de raccourci du clavier: Ctrl+k
  7. '
  8. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, StartRow:=1, _
  9. DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
  10. :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
  11. Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), _
  12. Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), _
  13. Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True
  14. ActiveWindow.SmallScroll Down:=-18
  15. Columns("a:a").Select
  16. Selection.Delete
  17. Columns("a:a").Select
  18. Selection.Delete
  19. Columns("b:b").Select
  20. Selection.Delete
  21. Columns("d:d").Select
  22. Selection.Delete
  23. Range("A1:M2000").Select
  24. Selection.Copy
  25. Sheets.Add After:=Sheets(Sheets.Count)
  26. Range("A2").Select
  27. ActiveSheet.Paste
  28. Columns("A:A").Select
  29. Application.CutCopyMode = False
  30. Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  31. Columns("e:e").Select
  32. Selection.Cut
  33. Columns("A:A").Select
  34. ActiveSheet.Paste
  35. Columns("B:B").Select
  36. Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  37. Columns("D:D").Select
  38. Selection.Cut
  39. Columns("B:B").Select
  40. ActiveSheet.Paste
  41. ActiveWindow.SmallScroll Down:=-9
  42. Columns("e:e").Select
  43. Selection.Cut
  44. Columns("D:D").Select
  45. ActiveSheet.Paste
  46. Columns("j:j").Select
  47. Selection.Cut
  48. Columns("e:e").Select
  49. ActiveSheet.Paste
  50. Columns("G:G").Select
  51. Selection.Delete Shift:=xlToLeft
  52. Rows("1:1").Delete
  53. ActiveWindow.SmallScroll Down:=-117
  54. Rows("1:1").Select
  55. Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  56. ActiveWindow.SmallScroll Down:=-9
  57. Selection.AutoFilter
  58. ActiveSheet.Range("$A$1:$O$1000").AutoFilter Field:=4, Criteria1:="=9*"
  59. ActiveSheet.Range("$A$1:$O$1000").AutoFilter Field:=1, Criteria1:=">1007210", _
  60. Operator:=xlAnd
  61. Range("A1:M2000").Select
  62. Selection.Copy
  63. Sheets.Add After:=Sheets(Sheets.Count)
  64. Range("A1").Select
  65. ActiveSheet.Paste
  66. Range("F2").Formula = _
  67. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""")))))))))"
  68. Range("F3").Select
  69. ActiveWindow.SmallScroll Down:=-15
  70. Range("F2").Select
  71. Selection.AutoFill Destination:=Range("F2:F438"), Type:=xlFillDefault
  72. Range("F2:F438").Select
  73. Range("A2:G125").Select
  74. Selection.Copy
  75. ChDir "X:\SANDRINE\ECHEANCIERS"
  76. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", _
  77. Origin:=xlWindows
  78. Sheets.Add After:=Sheets(Sheets.Count)
  79. Range("A1").Select
  80. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  81. :=False, Transpose:=False
  82. Columns("G:G").Select
  83. Application.CutCopyMode = False
  84. Selection.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
  85. Columns("E:E").Select
  86. Selection.NumberFormat = "dd/mm/yy;@"
  87. Columns("B:F").Select
  88. Range("F1").Activate
  89. With Selection
  90. .HorizontalAlignment = xlCenter
  91. .VerticalAlignment = xlBottom
  92. .WrapText = False
  93. .Orientation = 0
  94. .AddIndent = False
  95. .IndentLevel = 0
  96. .ShrinkToFit = False
  97. .ReadingOrder = xlContext
  98. .MergeCells = False
  99. End With
  100. End Sub


Voilà la tête qu'il a maintenant, mais il faut que je trouve d'abord la solution à mon premier problème avant de continuer.

Non je ne veux pas la valeur max de la colonne D, ça aurait été simple sinon, je veux qu'il aille me chercher la valeur max des factures saisie dans le fichier de destination, en colonne A( ligne 75 du dernier code). Pour l'instant je suis obligée de retourner et modifier la valeur du filtre manuellement dans la macro.

Merci encore pour ton aide.
Elvan
Expert Programmation

Citation :
Mais bon, j'essaye de me former en parallèle.
Je me propose de t'aider sur cet exemple. Mais d'abord, trouvons la solution à ton problème.

Ah, ben c'est quand même plus clair. La valeur est la valeur max à chercher dans la colonne A de tel classeur. Mon exemple reste pertinent, sauf qu'il faut changer le numéro de colonne. [:spamafote]

Comme dans ton code on jongle avec plusieurs classeurs, je t'invite à préciser sur quel classeur tu travailles, sans faire confiance à celui qui est actif à un moment donné. De la même façon, ne te fis pas à la cellule active. C'est toujours une mauvaise idée. En plus ton code est très lourd. Tu sélectionnes un objet, puis tu appliques une action sur la sélection. Tu ferais bien mieux d'appliquer l'action directement sur l'objet.

Première chose, on va aller chercher la valeur max dans la colonne A du classeur de destination.
  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3.  
  4. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  5. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(1).Columns(1))
  6. MsgBox "Le dernier dossier est le n°" & dernier_dossier


C'était facile, non ? Si oui, on continue. Si non, étudie bien ce que j'ai fait. Dès que ça te semble facile, on continue ;) 

Bon, maintenant, on ouvre le classeur suivant :
  1. Dim classeur_source As Workbook
  2.  
  3. Set classeur_source = Workbooks.OpenText(Filename:="U:\ELGI.CO", _
  4. Origin:=xlMSDOS, _
  5. DataType:=xlDelimited, _
  6. Tab:=True, _
  7. TrailingMinusNumbers:=True)
As-tu remarqué ? J'ai viré pleins de paramètres. En fait, j'ai retiré tous ceux qui étaient à leur valeur par défaut. C'est juste pour que ce soit lisible.

On continue.
  1. ' // Beurk, c'est moche.
  2. Rows("1:1").Select
  3. Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  4.  
  5. '// Bien. Aucune sélection inutile, en en plus, c'est lisible
  6. Rows(1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
N'ai-je pas dit qu'on devait préciser le classeur, et t'en qu'à faire, la feuille ?
  1. '// Encore mieux
  2. classeur_source.Worksheets(1).Rows(1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Pour ton propre confort, et si tu n'utilises qu'une feuille par classeur, on peut faire comme ceci :
  1. Dim classeur_destination As Workbook
  2. Dim classeur_source As Workbook
  3. Dim feuille_destination As Worksheet
  4. Dim feuille_source As Worksheet
  5.  
  6. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  7. Set feuille_destination = classeur_destination.Worksheets(1)
  8. dernier_dossier = WorksheetFunction.Max(feuille_destination.Columns(1))
  9.  
  10. Set classeur_source = Workbooks.OpenText(Filename:="U:\ELGI.CO", Origin:=xlMSDOS, DataType:=xlDelimited, Tab:=True, TrailingMinusNumbers:=True)
  11. Set feuille_source = classeur_source.Worksheets(1)
  12.  
  13. feuille_source.Rows(1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Ça va encore ?

  1. Rows("1:1" ).AutoFilter
T'es sûr que tu veux les 256 colonnes de la ligne 1
Mais non. A te lire plus bas, tu ne veux que la zone A1:0400.
  1. feuille_source.Range("A1:O440").AutoFilter
  2. feuille_source.Range("A1:O440").AutoFilter Field:=3, Criteria1:="=9*"
  3. feuille_source.Range("A1:O440").AutoFilter Field:=4, Criteria1:=">" & dernier_dossier, Operator:=xlAnd
  4. feuille_source.Range("A1:O440").AutoFilter Field:=7, Criteria1:="C"
Yeahhhhhhh :sol:  On l'a la soluce !!!!
Mais j'ai encore mal au doigts d'avoir taper tout ça. On factorise !
  1. With feuille_source.Range("A1:O440")
  2. .AutoFilter
  3. .AutoFilter Field:=3, Criteria1:="=9*"
  4. .AutoFilter Field:=4, Criteria1:=">" & dernier_dossier, Operator:=xlAnd
  5. .AutoFilter Field:=7, Criteria1:="C"
  6. End With


La suite :
  1. Range("A2:M438").Select
  2. Selection.Copy
  3. Sheets.Add After:=Sheets(Sheets.Count)
  4. Range("A2").Select
  5. ActiveSheet.Paste
Mais quelle honte. Ce générateur de macro devrait être pendu haut et court. Comment se permettre d'utiliser le presse-papier de l'utilisateur. Et si pendant que ta macro s'exécutait, tu faisais autre chose, pour laquelle l'usage du presse-papier t'était utile. Eh hop, bug ! Par principe, on s'interdit toute utilisation du presse-papier, réservé à l'usage exclusif de l'utilisateur !

Tiens, j'ai bien fait de préciser les feuilles, voilà qu'on en utilise d'autres maintenant.
  1. ' // D'abord, on prépare la feuille
  2. Dim feuille_source_filtree As Worksheet
  3. Set feuille_source_filtree = classeur_source.Sheets.Add(After:=classeur_source.Sheets(classeur_source.Sheets.Count))
  4.  
  5. ' // Ensuite, on copie, sans passer par le presse-papier
  6. feuille_source.Range("A2:M438").Copy Destination:=feuille_source_filtree.Range("A2")


T'as tout compris ?
Alors reposte-nous ton code, avec les "améliorations" proposées.
J'ai encore des tas de choses à te montrer. ;) 

Bonjour Zeb,

Je vais aimer les macro si ça continue ;) 

Je viens de passer une bonne partie de ma matinée sur cette macro :pfff: 

En résumé le code 1 (j'ai pas réussi à citer, à vrai dire pas trop le temps non plus de trop chercher car mon boss attend avec impatience le résultat) fonctionne parfaitement mais il me met une erreur en fin de parcours sur la méthode Pastespecial de la classe range a échoué.

Ensuite quand je mets le code 2 concernant le classeur source, il me surligne opentext et s'arrête là. po compris pourquoi :pfff: 

Ensuite le code 3, erreur 1004 la méthode autofilter de la classe range a échoué.

Code 6, non je ne veux pas les 256 colonnes mais jusque O, et seulement les lignes saisie, c'est pourquoi j'avais mis 440, mais ça peut être plus, je voulais d'abord résoudre les gros problèmes avant de m'ataquer aux autres :sarcastic:  .

code 7 Tu es un génie!

Je te montre ce que ça donne pour le moment avec le pastespecial qui ne fonctionne pas.
  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3.  
  4. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  5. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(10).Columns(1))
  6. MsgBox "Le dernier dossier est le n°" & dernier_dossier
  7. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, _
  8. DataType:=xlDelimited, _
  9. Tab:=True, _
  10. TrailingMinusNumbers:=True
  11. Columns("a:a").Delete
  12. Columns("a:a").Delete
  13. Columns("b:b").Delete
  14. Columns("d:d").Delete
  15. Range("A1:M2000").Copy
  16. Sheets.Add After:=Sheets(Sheets.Count)
  17. Range("A2").Select
  18. ActiveSheet.Paste
  19. Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  20. Columns("e:e").Cut
  21. Columns("A:A").Select
  22. ActiveSheet.Paste
  23. Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  24. Columns("D:D").Cut
  25. Columns("B:B").Select
  26. ActiveSheet.Paste
  27. Columns("e:e").Cut
  28. Columns("D:D").Select
  29. ActiveSheet.Paste
  30. Columns("j:j").Cut
  31. Columns("e:e").Select
  32. ActiveSheet.Paste
  33. Columns("G:G").Delete Shift:=xlToLeft
  34. Rows("1:1").Delete
  35. Rows("1:1").Select
  36. Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  37. Selection.AutoFilter
  38. ActiveSheet.Range("$A$1:$O$1000").AutoFilter Field:=4, Criteria1:="=9*"
  39. ActiveSheet.Range("$A$1:$O$1000").AutoFilter Field:=1, Criteria1:=">" & dernier_dossier, _
  40. Operator:=xlAnd
  41. Range("A1:M2000").Copy
  42. Sheets.Add After:=Sheets(Sheets.Count)
  43. Range("A1").Select
  44. ActiveSheet.Paste
  45. Range("F2").Formula = _
  46. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""" )))))))))"
  47. Range("F2").Select
  48. Selection.AutoFill Destination:=Range("F2:F438"), Type:=xlFillDefault
  49. Range("F2:F438").Select
  50. Range("A2:G125").Select
  51. Selection.Copy
  52. ChDir "X:\SANDRINE\ECHEANCIERS"
  53. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", _
  54. Origin:=xlWindows
  55. Sheets.Add After:=Sheets(Sheets.Count)
  56. Range("A1").Select
  57. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  58. :=False, Transpose:=False
  59. Columns("G:G").Select
  60. Application.CutCopyMode = False
  61. Selection.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
  62. Columns("E:E").Select
  63. Selection.NumberFormat = "dd/mm/yy;@"
  64. Columns("B:F").Select
  65. Range("F1").Activate
  66. With Selection
  67. .HorizontalAlignment = xlCenter
  68. .VerticalAlignment = xlBottom
  69. .WrapText = False
  70. .Orientation = 0
  71. .AddIndent = False
  72. .IndentLevel = 0
  73. .ShrinkToFit = False
  74. .ReadingOrder = xlContext
  75. .MergeCells = False
  76. End With
  77. End Sub
Expert Programmation

Arf, je n'ai pas vérifié le code que te te proposais. Le modèle objet d'Excel est incomplet : la méthode OpenText ne renvoie pas le classeur qu'elle ouvre, c'est une hérésie ! Messieurs de chez Microsoft, vous êtes des branques :kaola: 

Que cela ne nous perturbe pas.
  1. Dim classeur_source As Workbook
  2. Workbooks.OpenText Filename:="U:\ELGI.CO", Origin:=xlMSDOS, DataType:=xlDelimited, Tab:=True, TrailingMinusNumbers:=True
  3. Set classeur_source = Workbooks("ELGI.CO")


Ton code reste bourré de copier/coller. Or justement, je t'ai expliqué que c'est une source énorme de problème d'une part, et que ne pas s'en servir est plus simple, d'autre part.

Zeb,

Voici la macro après les modifications que j'ai pu faire, je comprend mieux comment ça fonctionne mais quelques trucs restent flou encore, je vais bosser dessus.
  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3. Dim classeur_source As Workbook
  4. Dim feuille_destination As Worksheet
  5. Dim feuille_source As Worksheet
  6. Dim feuille_source1 As Worksheet
  7. Dim feuille_source2 As Worksheet
  8.  
  9. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  10. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(10).Columns(1))
  11. Set feuille_destination = classeur_destination.Worksheets(10)
  12. MsgBox "Le dernier dossier est le n°" & dernier_dossier
  13.  
  14. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, _
  15. DataType:=xlDelimited, _
  16. Tab:=True, _
  17. TrailingMinusNumbers:=True
  18. Set classeur_source = Workbooks.Open("X:\ELGI.co")
  19. Set feuille_source = classeur_source.Worksheets(1)
  20. Columns("a:a").Delete
  21. Columns("a:a").Delete
  22. Columns("b:b").Delete
  23. Columns("d:d").Delete
  24. Range("A1:M2000").Copy
  25. Sheets.Add After:=Sheets(Sheets.Count)
  26. Set feuille_source1 = classeur_source.Worksheets(2)
  27. Range("A2").Select
  28. ActiveSheet.Paste
  29. Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  30. Columns("e:e").Cut
  31. Columns("A:A").Select
  32. ActiveSheet.Paste
  33. Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  34. Columns("D:D").Cut
  35. Columns("B:B").Select
  36. ActiveSheet.Paste
  37. Columns("e:e").Cut
  38. Columns("D:D").Select
  39. ActiveSheet.Paste
  40. Columns("j:j").Cut
  41. Columns("e:e").Select
  42. ActiveSheet.Paste
  43. Columns("G:G").Delete Shift:=xlToLeft
  44. Rows("1:1").Delete
  45. With feuille_source1.Range("A1:O440")
  46. .AutoFilter
  47. .AutoFilter Field:=3, Criteria1:="=9*"
  48. .AutoFilter Field:=4, Criteria1:=">" & dernier_dossier, Operator:=xlAnd
  49. End With
  50. Range("A1:M2000").Copy
  51. Sheets.Add After:=Sheets(Sheets.Count)
  52. Set feuille_source2 = classeur_source.Worksheets(3)
  53. Range("A1").Select
  54. ActiveSheet.Paste
  55. Range("F2").Formula = _
  56. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""" )))))))))"
  57. Range("F2").Select
  58. Selection.AutoFill Destination:=Range("F2:F438"), Type:=xlFillDefault
  59. Range("F2:F438").Select
  60. Range("A2:G125").Select
  61. Selection.Copy
  62. ChDir "X:\SANDRINE\ECHEANCIERS"
  63. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", _
  64. Origin:=xlWindows
  65. Sheets.Add After:=Sheets(Sheets.Count)
  66. Range("A1").Select
  67. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  68. :=False, Transpose:=False
  69. Columns("G:G").Select
  70. Application.CutCopyMode = False
  71. Selection.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
  72. Columns("E:E").Select
  73. Selection.NumberFormat = "dd/mm/yy;@"
  74. Columns("B:F").Select
  75. Range("F1").Activate
  76. With Selection
  77. .HorizontalAlignment = xlCenter
  78. .VerticalAlignment = xlBottom
  79. .WrapText = False
  80. .Orientation = 0
  81. .AddIndent = False
  82. .IndentLevel = 0
  83. .ShrinkToFit = False
  84. .ReadingOrder = xlContext
  85. .MergeCells = False
  86. End With
  87. End Sub

La méthode paste spécial ne fonctionne toujours pas. Je lui ai demandé de me rajouter une nouvelle feuille dans le classeur de destination, car je ne sais pas comment faire pour qu'il me colle le résultat final à la fin de la feuille destination, à la dernière ligne de saisie.

Merci encore pour ton aide si précieuse.

Elvan
Expert Programmation

Bon. Ton code n'est pas beau. On va le rendre beau. Et quand ce sera fait, la solution sautera aux yeux. Ben oui, c'est pour ça qu'il faut faire l'effort de faire les choses bien.

  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3. Dim classeur_source As Workbook
  4. Dim feuille_destination As Worksheet
  5. Dim feuille_source1 As Worksheet
  6. Dim feuille_source2 As Worksheet
  7.  
  8. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  9. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(10).Columns(1))
  10.  
  11. Set feuille_destination = classeur_destination.Worksheets(10)
  12. ' // Faudra virer cette ligne à la fin
  13. MsgBox "Le dernier dossier est le n°" & dernier_dossier
  14.  
  15. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, _
  16. DataType:=xlDelimited, _
  17. Tab:=True, _
  18. TrailingMinusNumbers:=True
  19.  
  20. ' // Il est déjà ouvert !
  21. 'xxxx Set classeur_source = Workbooks.Open("X:\ELGI.co")
  22. Set classeur_source = Workbooks("X:\ELGI.co")
  23.  
  24. Set feuille_source1 = classeur_source.Worksheets(1)
  25.  
  26. ' // Eh, tu ne précises pas sur quel classeur ni sur quelle feuille tu travailles.
  27. ' // C'est mal.
  28. ' // Un conseil : pars toujouts du bas vers le haut
  29. ' // et de la droite vers la gauche
  30. ' // pour supprimer dans un tableau
  31. 'xxxx Columns("a:a").Delete
  32. 'xxxx Columns("a:a").Delete
  33. 'xxxx Columns("b:b").Delete
  34. 'xxxx Columns("d:d").Delete
  35.  
  36. ' // Solution 1 - Quatre actions
  37. feuille_source1.Columns("G").Delete
  38. feuille_source1.Columns("D").Delete
  39. feuille_source1.Columns("B").Delete
  40. feuille_source1.Columns("A").Delete
  41. ' // Solution 2 - Une seule action
  42. feuille_source1.Range(feuille_source1.Columns("A"), _
  43. feuille_source1.Columns("B"), _
  44. feuille_source1.Columns("D"), _
  45. feuille_source1.Columns("G")).Delete
  46. ' // Solution 3 - Une seule action
  47. feuille_source1.Range("A:A,B:B,D:D,G:G").Delete
  48.  
  49. ' // GRRRRRR J'ai dit, plus de copier/coller
  50. ' // Et puis, il n'y a toujours pas de référence au classeur !
  51. 'xxxx Range("A1:M2000").Copy
  52. 'xxxx Sheets.Add After:=Sheets(Sheets.Count)
  53. 'xxxx Set feuille_source1 = classeur_source.Worksheets(2)
  54. 'xxxx Range("A2").Select
  55. 'xxxx ActiveSheet.Paste
  56. Set feuille_source2 = classeur_source.Sheets.Add(After:=Sheets(Sheets.Count))
  57. feuille_source1.Range("A1:M2000").Copy Destination:=feuille_source1.Range("A2")
  58.  
  59. ' // GRRRRRR Des couper/coller maintenant et toujours pas de référence au classeur/feuille !
  60. ' // Et pourquoi s'est-on emmerder à tout copier ?
  61. ' // On vire la ligne précédente, et on copie ce qu'on veut, là où on veut
  62.  
  63. 'xxxx Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  64. 'xxxx Columns("e:e").Cut
  65. 'xxxx Columns("A:A").Select
  66. 'xxxx ActiveSheet.Paste
  67.  
  68. feuille_source1.Columns("F").Copy Destination:=feuille_source1.Columns("A")
  69. feuille_source1.Columns("G").Copy Destination:=feuille_source1.Columns("B")
  70. feuille_source1.Columns("H").Copy Destination:=feuille_source1.Columns("C")
  71. ....
  72. ' // ( à toi de vérifier quelles sont les colonnes que tu veux copier )
  73.  
  74.  
  75. ' // Correct, mais je te propose d'autres écritures
  76. ' Ta soluce
  77. Rows("1:1").Delete
  78. ' Autre solution
  79. Rows("1").Delete
  80. ' Autre solution
  81. Rows(1).Delete


Continues comme ça.. En attendant, je regarde tes problèmes....
;) 

Bonjour Zeb,

J'ai modifié en fonction de ton aide, voilà le résultat. Je vois que l'on peut faire assez simple quand on se penche vraiment dessus. Merci beaucoup!!!!!!
  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3. Dim classeur_source As Workbook
  4. Dim feuille_destination As Worksheet
  5. Dim feuille_source As Worksheet
  6. Dim feuille_source1 As Worksheet
  7. Dim feuille_source2 As Worksheet
  8. Dim feuille_destination1 As Worksheet
  9.  
  10. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  11. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(10).Columns(1))
  12.  
  13. Set feuille_destination = classeur_destination.Worksheets(10)
  14. MsgBox "Le dernier dossier est le n°" & dernier_dossier
  15.  
  16. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, _
  17. DataType:=xlDelimited, _
  18. Tab:=True, _
  19. TrailingMinusNumbers:=True
  20. Set classeur_source = Workbooks.Open("X:\ELGI.co")
  21. Set feuille_source = classeur_source.Worksheets(1)
  22. feuille_source.Range("A:A,B:B,D:D,G:G").Delete
  23. Set feuille_source1 = classeur_source.Sheets.Add(after:=Sheets(Sheets.Count))
  24. feuille_source.Range("A1:M2000").Copy Destination:=feuille_source1.Range("A2")
  25. feuille_source1.Columns("a").Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
  26. feuille_source1.Columns("e").Cut Destination:=feuille_source1.Columns("A")
  27. feuille_source1.Columns("b").Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
  28. feuille_source1.Columns("d").Cut Destination:=feuille_source1.Columns("B")
  29. feuille_source1.Columns("e").Cut Destination:=feuille_source1.Columns("d")
  30. feuille_source1.Columns("j").Cut Destination:=feuille_source1.Columns("e")
  31. feuille_source1.Columns("g").Delete
  32. Rows(1).Delete
  33. With feuille_source1.Range("A1:O440")
  34. .AutoFilter
  35. .AutoFilter Field:=3, Criteria1:="=9*"
  36. .AutoFilter Field:=4, Criteria1:=">" & dernier_dossier, Operator:=xlAnd
  37. End With
  38. Set feuille_source2 = classeur_source.Sheets.Add(after:=Sheets(Sheets.Count))
  39. feuille_source1.Range("a1:m2000").Copy Destination:=feuille_source2.Range("a2")
  40. Range("F2").Formula = _
  41. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""" )))))))))"
  42. Range("F2").Select
  43. Selection.AutoFill Destination:=Range("F2:F438"), Type:=xlFillDefault
  44. Range("F2:F438").Select
  45. feuille_source2.Range("A2:G125").Copy
  46. ChDir "X:\SANDRINE\ECHEANCIERS"
  47. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", _
  48. Origin:=xlWindows
  49. Sheets.Add after:=Sheets(Sheets.Count)
  50. Range("A1").Select
  51. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  52. :=False, Transpose:=False
  53. Columns("G:G").Select
  54. Application.CutCopyMode = False
  55. Selection.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
  56. Columns("E:E").Select
  57. Selection.NumberFormat = "dd/mm/yy;@"
  58. Columns("B:F").Select
  59. Range("F1").Activate
  60. With Selection
  61. .HorizontalAlignment = xlCenter
  62. .VerticalAlignment = xlBottom
  63. .WrapText = False
  64. .Orientation = 0
  65. .AddIndent = False
  66. .IndentLevel = 0
  67. .ShrinkToFit = False
  68. .ReadingOrder = xlContext
  69. .MergeCells = False
  70. End With
  71. End Sub


Il est plus beau maintenant? :ange: 
Expert Programmation

C'est mieux. Mais...

Lignes 32, 40, 42, 44, 50, 53, 56, 58, 59, tu n'indiques pas la feuille concernée.
Lignes 42/43, 44/45, 50/51, 53/55, 56/57, 58/60, tu as encore du Select/Selection.
Ligne 45/51, tu passes par le presse-papier.

Ligne 47, tu ouvres un classeur. Mets-le dans une variable Workbook. Utilise cette variable pour faire une autre variable de type Worksheet qui pointera sur la nouvelle feuille (ligne 49).

Règle tous ces petits problèmes, et ton gros problème devrait disparaître ;) 

Est-ce clair pour toi ?

Bonjour Zeb,

J'ai fais les modifications nécessaires, mais le résultat du paste special est toujours pas bon.

  1. Dim classeur_destination As Workbook
  2. Dim dernier_dossier As Long
  3. Dim classeur_source As Workbook
  4. Dim feuille_destination As Worksheet
  5. Dim feuille_source As Worksheet
  6. Dim feuille_source1 As Worksheet
  7. Dim feuille_source2 As Worksheet
  8. Dim feuille_destination1 As Worksheet
  9.  
  10. Set classeur_destination = Workbooks.Open("X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls")
  11. dernier_dossier = WorksheetFunction.Max(classeur_destination.Worksheets(10).Columns(1))
  12.  
  13. Set feuille_destination = classeur_destination.Worksheets(10)
  14. MsgBox "Le dernier dossier est le n°" & dernier_dossier
  15.  
  16. Workbooks.OpenText Filename:="X:\ELGI.CO", Origin:=xlMSDOS, _
  17. DataType:=xlDelimited, _
  18. Tab:=True, _
  19. TrailingMinusNumbers:=True
  20. Set classeur_source = Workbooks.Open("X:\ELGI.co")
  21. Set feuille_source = classeur_source.Worksheets(1)
  22. feuille_source.Range("A:A,B:B,D:D,G:G").Delete
  23. Set feuille_source1 = classeur_source.Sheets.Add(after:=Sheets(Sheets.Count))
  24. feuille_source.Range("A1:M2000").Copy Destination:=feuille_source1.Range("A2")
  25. feuille_source1.Columns("a").Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
  26. feuille_source1.Columns("e").Cut Destination:=feuille_source1.Columns("A")
  27. feuille_source1.Columns("b").Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
  28. feuille_source1.Columns("d").Cut Destination:=feuille_source1.Columns("B")
  29. feuille_source1.Columns("e").Cut Destination:=feuille_source1.Columns("d")
  30. feuille_source1.Columns("j").Cut Destination:=feuille_source1.Columns("e")
  31. feuille_source1.Columns("g").Delete
  32. feuille_source1.Rows(1).Delete
  33. With feuille_source1.Range("A1:O440")
  34. .AutoFilter
  35. .AutoFilter Field:=3, Criteria1:="=9*"
  36. .AutoFilter Field:=4, Criteria1:=">" & dernier_dossier, Operator:=xlAnd
  37. End With
  38. Set feuille_source2 = classeur_source.Sheets.Add(after:=Sheets(Sheets.Count))
  39. feuille_source1.Range("a1:m2000").Copy Destination:=feuille_source2.Range("a2")
  40. feuille_source2.Range("F2").Formula = _
  41. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""" )))))))))"
  42. feuille_source2.Range("F2").AutoFill Destination:=Range("F2:F438"), Type:=xlFillDefault
  43. Set feuille_destination1 = classeur_destination.Sheets.Add(after:=Sheets(Sheets.Count))
  44. feuille_source2.Range("A2:G125").Copy Destination:=feuille_destination1.Range("a1")
  45. feuille_destination1.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  46. :=False, Transpose:=False
  47. feuille_destination1.Columns("G:G").Application.CutCopyMode = False
  48. Selection.NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
  49. feuille_destination1.Columns("E:E").NumberFormat = "dd/mm/yy;@"
  50. With feuille_destination1.Columns("a:g")
  51. .HorizontalAlignment = xlCenter
  52. .VerticalAlignment = xlBottom
  53. .WrapText = False
  54. .Orientation = 0
  55. .AddIndent = False
  56. .IndentLevel = 0
  57. .ShrinkToFit = False
  58. .ReadingOrder = xlContext
  59. .MergeCells = False
  60. End With
  61. End Sub


Ce qui est bien avec ton aide, c'est que tu donnes pas la solution, mais cherche à faire comprendre le fonctionnement. J'y vois plus clair déjà.
Merci
Expert Programmation

Citation :
Ce qui est bien avec ton aide, c'est que tu donnes pas la solution, mais cherche à faire comprendre le fonctionnement. J'y vois plus clair déjà.
Merci
Merci d'accepter mon aide. Certains viennent chercher ici des solutions, pas des leçons, ni des exercices.
:jap: 

Bon, je vois que tu arrives au bout de tes compétences. Je peux maintenant apporter une plus-value qui te soit vraiment profitable.
:sol: 

Ligne 38, 42 et 43
  1. Set feuille_source2 = classeur_source.Sheets.Add(after:=Sheets(Sheets.Count))
  2. feuille_source2.Range("F2" ).AutoFill Destination:=Range("F2:F438" ), Type:=xlFillDefault
  3. Set feuille_destination1 = classeur_destination.Sheets.Add(after:=Sheets(Sheets.Count))
Et non. :/ 
Il faut préciser le classeur, la feuille partout !
  1. Set feuille_source2 = classeur_source.Sheets.Add(after:=classeur_source.Sheets(classeur_source.Sheets.Count))
  2. feuille_source2.Range("F2" ).AutoFill Destination:=feuille_source2.Range("F2:F438" ), Type:=xlFillDefault
  3. Set feuille_destination1 = classeur_destination.Sheets.Add(after:=classeur_destination.Sheets(classeur_destination.Sheets.Count))
Comment ça c'est lourd-dingue ?
Ben c'est pour ça qu'on a inventer la clause With :
  1. With classeur_source
  2. Set feuille_source2 = .Sheets.Add(after:=.Sheets(.Sheets.Count))
  3. End With
  4.  
  5. With feuille_source2
  6. .Range("F2" ).AutoFill Destination:=.Range("F2:F438" ), Type:=xlFillDefault
  7. End With
  8.  
  9. With classeur_destination
  10. Set feuille_destination1 = .Sheets.Add(after:=.Sheets(Sheets.Count))
  11. End With


Personnellement, j'utilise peu les clauses With. Le code résultat devient trop difficile à lire. En revanche, j'utilise des noms de variable plus courts.
Par exemple, wbTarget ou wsSourcewb signifie Workbook (classeur), ws signifie Worksheet (feuille).
J'utilise des mots anglais pour leur concision, et l'absence d'accent. Parfois j'abrège les mots évident.
Quand j'ai plusieurs sources et cibles, je définit mes variables comme ça :
  1. Dim wbS As Workbook
  2. Dim wsS1 As Worksheet
  3. Dim wsS2 As Worksheet
  4. Dim wbT As Workbook
  5. Dim wsT1 As Workbook
  6. Dim wsT2 As Workbook
Le code lourd-dingue devient :
  1. Set wsS2 = wsS.Sheets.Add(after:=wsS.Sheets(wsS.Sheets.Count))
Ca devient raisonnable.
Il n'y a pas une meilleure façon de définir les variables. Il s'agit du style de l'auteur.
:) 

Revenons à ton (ou plutôt celui de l'enregistreur de macro) code pas beau d'autrefois :
  1. feuille_source2.Range("A2:G125" ).Copy
  2. ChDir "X:\SANDRINE\ECHEANCIERS"
  3. Workbooks.Open Filename:="X:\SANDRINE\ECHEANCIERS\2010 ech fournisseur.xls", Origin:=xlWindows
  4. Sheets.Add after:=Sheets(Sheets.Count)
  5. Range("A1" ).Select
  6. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  7. feuille_destination1.Columns("G:G" ).Application.CutCopyMode = False


En français, tu veux copier les données de la feuille source 2 vers une nouvelle page du fichier de Sandrine, mais sans formule, juste les valeurs.
Comme je ne veux pas voir de passage par le presse-papier, tu aurais dû m'écrire :
  1. Set feuille_destination1 = classeur_destination.Sheets.Add(after:=classeur_destination.Sheets(classeur_destination.Sheets.Count))
  2. feuille_source2.Range("A2:G125" ).Copy Destination:=feuille_destination1.Range("A1" )
Et c'est tout. Pas de PasteSpecial, ni de CutCopyMode = False.
Et surtout pas avec la syntaxe proposée :
  1. feuille_destination1.Columns("G:G" ).Application.CutCopyMode = False
Le mode couper/copier dépend de l'application (Excel), pas d'une cellule.
Mais bref, on s'en fout, on ne veut plus de cette ligne.

Seulement, voilà, avec cette façon de faire, ce ne sont pas les valeurs mais les formules qui sont copiées. :/ 
Comment faire ?
Solution crade : passer par le presse-papier. Comme je suis un intégriste de la programmation (*), il n'en est pas question.
Solution admissible : copier chaque valeur une à une. C'est parti.

  1. Dim colonne As Integer
  2. Dim ligne As Long
  3.  
  4. For colonne = 1 To 7 ' // De A à G
  5. For ligne = 2 To 125
  6. feuille_destination1.Cells(ligne - 1, colonne).Value = feuille_source2.Cells(ligne, colonne).Value
  7. Next
  8. Next
EDIT: Manquait la propriété Value à la ligne 5

Autre façons de faire :
  1. Dim cell As Range
  2.  
  3. For Each cellule In Feuil1.Range("A7:B8")
  4. Feuil2.Cells(cellule.Row - 1, cellule.Column).Value = cellule.Value
  5. Next


PS: Vire-moi le Selection de la ligne 48. :o 

Tout ça t'aide-t-il ?
:) 
______________
(*) Sorte de religion avec plusieurs mouvances.
Les ultra-orthodoxes-intégristes y programment en C/shell, les dévôts en VB, les séminaristes en Pascal, les observateurs de la Sainte Programmation en Lisp, ....
[:ange] [:nyghost]
:lol: 

Zeb,

ci dessous les modification rapportées. Tout ça m'aide et je me baserais sur cette macro pour en faire d'autres derrière.
  1. With classeur_source
  2. Set feuille_source2 = .Sheets.Add(after:=.Sheets(.Sheets.Count))
  3. End With
  4. feuille_source1.Range("a1:m2000").Copy Destination:=feuille_source2.Range("a2")
  5. feuille_source2.Range("F2").Formula = _
  6. "=IF(RC[4]=3,""CHQ"",IF(RC[4]=12,""LCR"",IF(RC[4]=13,""LCR"",IF(RC[4]=""PRE"",""PRE"",IF(RC[4]=""LCM"",""LCM"",IF(RC[4]=""CHQ"",""CHQ"",IF(RC[4]=""VIR"",""VIR"",IF(RC[4]=""TRA"",""TRA"",IF(RC[4]=7,""LCR"","""" )))))))))"
  7. With feuille_source2
  8. .Range("F2").AutoFill Destination:=.Range("F2:F438"), Type:=xlFillDefault
  9. End With
  10. With classeur_destination
  11. Set feuille_destination1 = .Sheets.Add(after:=.Sheets(.Sheets.Count))
  12. End With
  13. Dim columns As Integer
  14. Dim ligne As Long
  15. For columns = 1 To 7
  16. For ligne = 2 To 125
  17. feuille_destination1.Cells(ligne - 1, columns).Value = feuille_source2.Cells(ligne, columns)
  18. Next
  19. Next


Cependant j'ai deux quesions à te poser :

* quand je récupère mon fichier de l'extraction comptable je n'ai plus les montants des factures. Ils ne s'affichent pas correctement
(avant je n'avais pas ce problème). Le montant s'affiche comme celà "000000001139,19", en cliquant dessus je peux les convertir en nombre et là le résultat est correct.
* Au lieu de coller la dernière sélection dans une nouvelle feuille dans le classeur de destination, j'aimerais qu'il aille me coller ça à la suite de la feuille_destination, en dessous des autres lignes saisies. (donnes moi un exemple comme ça ça me fait de l'exercice).

Merci
Lassé par la pub ? Créez un compte