Déplacer des valeurs d'une feuille à l'autre selon caractère

Bonjour à toutes et à tous,

EDIT : Je remet ici le dernier message que j'ai posté avec le fichier car à mon avis il est plus clair que mon explication du début

alors j'ai recréé un fichier simplifié avec seulement les deux feuilles impliquées et beaucoup moins de données dedans. J'y ai intégré deux ou trois explications sur chaque feuille mais si ce n'est pas compréhensible n'hésitez surtout pas !

Vu que je ne suis pas sur que les macros ont été correctement transférées dans ce classeur, je vous colle le code de mes deux macros ici :

Pour le bouton d'archivage, je veux qu'il ouvre un nouveau classeur d'archives de données créé au préalable (dans cette macro, c'est Consommation Mars 2017), puis qu'il copie les infos de la feuille Tableau Conso MP pour ensuite les coller vers Consommation Mars 2017, et ce, tout en effaçant derrière de la feuille Tableau Conso MP les données une fois copiées. Jusqu'ici tout va bien.

Ce qui serait un plus, ce serait qu'il mette les données à la suite et pas par-dessus.

En gros, si j'ai un 01/03/17 ABCD.... et que je clique sur le bouton, pas de soucis, je retrouverai cette ligne dans mon nouveau classeur.

Par contre, si le lendemain je reclique avec un 01/03/17 EFGH...., ben il va m'effacer le 01/03/17 ABCD du classeur de destination pour mettre le EFGH à la place. (Je ne sais pas si vous voyez ce que je veux dire car ça peut sembler assez abstrait vu que j'utilise des exemples fictifs, désolé)

Donc, actuellement pour mon bouton, j'ai ceci :

Private Sub Archivage()
Dim Tablo

With Application
 .Calculation = xlCalculationManual
 .StatusBar = "Transfert données en cours..."
 .EnableCancelKey = xlErrorHandler
End With

With ThisWorkbook.Worksheets("Tableau Conso MP")

    Tablo = .Range(.Cells(1, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 11))
End With

Set classeurDestination = Workbooks.Open(Filename:=ThisWorkbook.Path & "\Consommation Mars 2017.xlsm")
With Workbooks("Consommation Mars 2017").Worksheets("Consommation TOTALE")
    For i = LBound(Tablo, 1) To UBound(Tablo, 1)
        For j = LBound(Tablo, 2) To UBound(Tablo, 2)
            If Tablo(i, j) <> "" Then .Cells(i, j) = Tablo(i, j)
        Next j
    Next i
End With
Cells.Clear
Application.StatusBar = False
End Sub

Celle-ci je l'ai faite en prenant des morceaux de macros par-ci par-là

Pour l'autre, je vais essayer de synthétiser.

Je souhaiterais que dans la feuille "Tableau Conv MP", les valeurs de la colonne "O" soient automatiquement transposées vers la colonne "I" de la feuille "Tableau Conso MP", mais il faut que la référence d'article corresponde (je les ai masquées mais il y a une colonne N°Lot pour distinguer chaque produit)

Donc, qu'en face d'AB48GX, je retrouve la valeur de la colonne O pour cette référence, date et N°Lot, vu que dans la feuille Tableau Conv MP, les lignes présentes sont un copier/coller issus de la feuille Tableau Conso MP à l'origine.

La macro :

Sub macroextraction()
Dim i%, o%, v$
'La colonne O et toutes ses lignes utilisées
 o = Range("O" & Rows.Count).End(xlUp).Row
 'Dans la colonne O à partir de la ligne 3
 For i = 3 To o
 'Les valeurs de toutes les lignes utilisées de la colonne 15 ou O sont sélectionnées
 v = Cells(i, 15)
 'Sélection de la feuille "Tableau Conso MP"
 Set Sheet = Sheets("Tableau Conso MP")
 'Si dans la colonne D on a une ref commençant par AB**
 If Sheet.Cells(i, 4) Like "AB*" Then
 'Alors les valeurs de la colonne I de cette feuille correspondent aux valeurs de la colonne O de la première feuille
 Sheet.Cells(i, 9).Value = v
 'Pareil mais si NP au début de la référence etc.
 ElseIf Sheet.Cells(i, 4) Like "NP*" Then
 Sheet.Cells(i, 9).Value = v
 End If
 'Ligne suivante
 Next i
End Sub

Quand je l'exécute, pas d'erreur mais strictement rien ne se produit !

J'ai retenté de modifier des lignes par-ci par-là, mais soit ça me fait une erreur car j'ai rajouté un truc qui a embrouillé Excel, soit il n'y en a pas mais ça ne change rien, la macro s'exécute sans qu'il n'y ait le moindre résultat.

J'ai vraiment besoin de comprendre comment faire ça, car après je devrai utiliser la macro en question pour bouger tout un tas d'autres données différentes, donc même quelques pistes/axes de réflexion seraient vraiment top !

J'ai laissé les commentaires si par exemple vous remarquez que je comprend mal ce que j'ai écrit (car si je comprend le code de travers c'est sur que ça ne va pas fonctionner)

Voilà, encore une fois, n'hésitez pas si vous avez des questions ou un truc qui vous paraît bizarre et merci d'avance pour toute aide ou même tentative d'aide que vous pourriez m'apporter.

Cordialement,

VYCanisMajoris

Bonsoir VYCanisMajoris, bonsoir le forum,

Bravo pour le laïus ! Explications très claires mais... Je n'ai rien compris . Aussi je te propose la chose suivante :

• un petit fichier exemple

  • respectant la structure de ton fichiers original (nom des onglets, plage nommées, etc)
  • juste les quelques onglets nécessaire au problème
  • avec une poignée de données anonymisées
  • un onglet montrant ces données avant le traitement par la macro
  • un onglet montrant le résultat obtenu après traitement par la macro
  • les explications nécessaires pour l'exécution de la macro sans exagérer sur la prose...

Bonsoir ThauThème,

ThauThème a écrit :

Explications très claires mais... Je n'ai rien compris

Pas de problème pour le fichier, je m'en doutais un peu.

J'essaie de vous faire ça proprement demain !

Merci pour la réponse et bonne soirée !

Bonsoir, Salut ThauThème !

J'adore !

j'ai donc créé une macro (celle-ci fonctionne très bien, pas de soucis de ce côté là).

car actuellement, si par exemple j'exécute la macro après le 1er jour et une deuxième fois après 15 jours, les données du 1er jour vont disparaître

Ma question : Savez-vous si c'est faisable avec VBA ?

J'adore toujours... les macros qui fonctionnent très bien... mais qui ont des effets pervers... lesquels ne sont rien d'autre que ce à quoi on n'a pas pensé en les faisant...

Pour la dernière question, tout est faisable en VBA... tout ce qu'on se met en situation de pouvoir faire... mais VBA ne le pensera pas à ta place...

Je dirai que ton "gros" fichier me fait peur ! Moi qui en était resté à l'idée que le contrôle de gestion était essentiellement un outil au service du pilotage... soit un tableau de bord, qui ne doit jamais dépasser la taille d'un écran, avec des indicateurs... à partir des indicateurs on peut aller vers des feuilles fournissant pour chacun des éléments d'analyses plus pointus... et son utilisation doit être simple et rapide pour être efficace, et il doit être absolument fiable... En faire une usine à gaz, c'est tout ce qu'on veut mais plus un outil d'aide à la décision...

Enfin ! Je n'ai plus trop à m'inquiéter de ce type de problèmes, toutefois je dois dire que cela m'inquiète d'un point de vue social...

Cordialement.

Bonjour MFerrand,

MFerrand a écrit :

Pour la dernière question, tout est faisable en VBA...

Voilà qui me rassure, je vais joindre un fichier excel dans la journée ça sera probablement plus parlant que mon charabia

MFerrand a écrit :

Je dirai que ton "gros" fichier me fait peur ! Moi qui en était resté à l'idée que le contrôle de gestion était essentiellement un outil au service du pilotage... soit un tableau de bord, qui ne doit jamais dépasser la taille d'un écran, avec des indicateurs... à partir des indicateurs on peut aller vers des feuilles fournissant pour chacun des éléments d'analyses plus pointus... et son utilisation doit être simple et rapide pour être efficace, et il doit être absolument fiable... En faire une usine à gaz, c'est tout ce qu'on veut mais plus un outil d'aide à la décision...

C'est exactement ça.

J'ai un tableau de bord d'accueil avec les principaux indicateurs (les fondamentaux que j'aurai vu avec les chefs de service), puis des boutons sur ce tableau de bord qui orienteront vers des feuilles tableaux de bord plus complets par service, et aussi des feuilles contenant les tableaux de calcul de ces indicateurs avec des explications.

C'est dans certains de ces tableaux que j'ai pas mal de formules, quand je parle d'usine à gaz c'est d'un point de vu informatique uniquement, pour l'instant sur l'aspect gestion c'est pas encore catastrophique

C'est pour ça que j'ai besoin de VBA justement, essayer de simplifier ça niveau formules etc. pour pouvoir ranger facilement les infos dans mon fichier (je ne serai pas le seul à m'en servir donc des boutons qui exécutent l'action souhaitée automatiquement seraient top je pense), chose que je trouve difficile car j'ai beaucoup d'exceptions à gérer (plus de 300 références MP différentes par exemple, avec une quinzaine d'exceptions dans cette liste où je dois faire attention pour ne pas fausser mes calculs).

EDIT : J'ai remis le message présent ici dans mon poste de départ pour que ce soit plus clair et visible. (désolé pour le bazar sur le sujet )

Bonjour à tous,

j'ai pu "avancer" de mon côté et enregistrer des progrès, je pense que je me rapproche plus ou moins de mon objectif !

Pour le second cas, j'arrive à créer la copie de valeurs souhaitée en fonction de la chaîne de caractère présente dans la colonne D (chose que je n'arrivais même pas à faire au début), à l'aide de la macro suivante :

Sub Macro_Copie_test2()

Dim i As Integer
Dim Rng As Range

With ThisWorkbook
Set sh1 = Sheets("Tableau Conv MP")
Set sh2 = Sheets("Tableau Conso MP")
Set Rng = Range("A:Q")
End With

For i = 3 To 200
If Rng(i, 4) Like "AB*" Or Rng(i, 4) Like "NP*" Then
Rng(i, 17).Value = Rng(i, 15).Value
End If

Next i
End Sub

Après, le but, ce serait que ces valeurs copiées en fonction du texte de la colonne D puissent être automatiquement renvoyées dans la feuille "Tableau Conso MP", dans la colonne I sous les mêmes conditions (qu'il y ait soit un AB ou un NP au début, et dans le même ordre pour que les lignes correspondent ). Pour les conditions, normalement ça devrait le faire avec le Like "AB*" etc.

Voici ce que j'ai rajouté à la macro pour essayer d'effectuer cette manip :

Sub Macro_copie_test2()

Dim i As Integer
Dim WB As Workbooks
Dim Rng As Range
Dim sh2 As Worksheet
Dim sh1 As Worksheet

With ThisWorkbook
Set sh1 = Sheets("Tableau Conv MP")
Set sh2 = Sheets("Tableau Conso MP")
Set Rng = Range("A:Q")
End With

For i = 3 To 200
If Rng(i, 4) Like "AB*" Or Rng(i, 4) Like "NP*" Then
Rng(i, 17).Value = Rng(i, 15).Value
End If

Next i
Rng (i, 17).Select

For i = 2 to 5000
sh2.Select
If sh2.Rng(i, 4) Like "AB*" Then
sh2.Rng(i, 17).Value = sh1.Rng(i, 17).Value
End If
Next i

End Sub

Je bidouille un peu la chose (l'extraction vers la colonne Q qui reste assez superflue, ça me sert juste à voir qu'il comprend bien les conditions de la macro) et je fais étape par étape pour voir si déjà je comprend le fonctionnement de ce que j'ai fait.

J'essaie de dire à Excel que je veux qu'il sélectionne les données correctement extraites de la feuille 1 (Tableau Conv MP), colonne Q donc.

Puis, qu'il active la feuille "Tableau Conso MP".

Ensuite, qu'il regarde dans la colonne D de cette feuille, et si la chaîne de caractères commence par "AB", alors dans la colonne Q de la feuille "Tableau Conso MP", les valeurs doivent être celles précédemment extraites dans la feuille "Tableau Conv MP" dans la colonne Q également.

Le problème est que peu importe ce que je modifie, j'ai plusieurs messages d'erreurs différents :

"Membre de méthode ou données introuvable" avec le code présent ci-dessus

Quelqu'un aurait-il une idée svp (ou même un indice sur ce qui fait planter ma macro pour orienter mes recherches) ?

Merci d'avance

bonjour à tous

reprenons ton besoin à la base. Ton besoin n'est pas Excel ni VBA.

ton besoin est de "gérer" des quantités (en poids et en surface) et des mouvements de stock

on met Excel à ta disposition. Excel est une partie de la solution.

ensuite, il suffit vraisemblablement de créer une feuille de saisie des mouvements (entrées et sorties)

ajoute les formules pour convertir poids en surface ou inversement

c'est tout.

ah si ! faire un TCD pour visualiser les stocks

tu feras du VBA pour d'autres applications qui le méritent.

Bonjour jmd,

jmd a écrit :

ensuite, il suffit vraisemblablement de créer une feuille de saisie des mouvements (entrées et sorties)

ajoute les formules pour convertir poids en surface ou inversement

Que suggérez-vous dans ce cas pour convertir ces surfaces en poids ? la fonction SI ? Car si c'est ça, je l'ai déjà essayée cette méthode là.

jmd a écrit :

tu feras du VBA pour d'autres applications qui le méritent.

Ah je vois...

Merci pour votre réponse.

Edit : J'ajouterais que j'ai besoin que ce fichier soit automatisé au maximum (les futurs utilisateurs n'aimant pas beaucoup manipuler Excel ni prendre le temps de chercher, il faut qu'en un clic on ait ce qu'on veut, qu'on puisse ranger les données où on veut etc.). Je comprend bien que VBA c'est compliqué mais ça me paraît être la bonne solution pour manipuler facilement des données, notamment quand il y a pas mal d'exceptions ou de cas particuliers.

Après jmb, si vous avez une solution équivalente sans passer par VBA pour faire ça je suis preneur (sans forcément détailler, juste me dire où chercher si possible ou même le nom, le reste je vais me débrouiller).

Cdlt

Hello,

j'ai trouvé finalement.

Voici la macro pour ceux que ça pourrait éventuellement intéresser avec les commentaires

Private Sub CommandButton1_Click()

Dim i As Integer
Dim j As Integer
Dim sh1 As Worksheet
Dim sh2 As Worksheet

'Pour rendre la macro plus rapide à l'exécution
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set sh1 = Worksheets("Tableau Conv MP")
Set sh2 = Worksheets("Tableau Conso MP")

'Servira à aller chercher la valeur souhaitée à partir de la ligne 3
i = 3
'Avec la feuille 2 (tableau conso MP)
With sh2
'Pour les valeurs qui partent de la ligne 2 jusqu'à 4700
For j = 2 To 4700
'Cherche en colonne D sur cette plage ce qui commence par AB ou NP
If .Cells(j, 4).Value Like "AB*" Or .Cells(j, 4).Value Like "NP*" Then
'Si condition remplie, la valeur de la colonne O, ligne 3 car i = 3 de la feuille 1 ira dans la colonne I de la feuille 2
'à la ligne où la première occurrence (AB* ou NP*) aura été trouvée
.Cells(j, 9).Value = sh1.Cells(i, 15).Value
'Refait la même chose mais prendra la valeur de la ligne suivante à la prochaine occurrence (donc O4 au lieu de O3 etc.)
i = i + 1
End If
Next j
End With

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Merci quand même à ceux qui se sont penchés sur le problème ou qui ont essayé de m'orienter, et en espérant que ça aidera quelqu'un !

Cdlt.

Rechercher des sujets similaires à "deplacer valeurs feuille caractere"