Archivage en colonne - double critères
Bonjour à tous,
Je viens vous solliciter aujourd'hui pour une problématique d'archivage en colonne (en ligne ça marche, mais en colonne je n'y parviens pas).
Le fichier se compose de plusieurs onglets, or ceux qui nous intéresse se nomme "Nouveau Devis" & "Base Devis".
Le besoin :
Lors de la création d'un nouveau devis, je renseigne l'onglet correspondant.
A la fin de celui-ci, je souhaite qu'une macro
-> Incrémente à +1 la référence pour le prochain devis (Ok, voir code "Ajouter")
-> Efface les données après enregistrements pour le prochain devis(Ok, voir code "Effacer")
-> Enregistre dans la colonne correspondante à la valeur en H4 de l'onglet "Nouveau devis", dans l'onglet "Base devis", les différentes cellules correspondantes à l'adressage suivant (exemple pour devis N°0001) :
- F13 ("Nouveau devis") = B2 ("Base devis")
- D:E16 = B8
- H:I16 = B4
- H5 = B3
- D39:D40 = B7
- H42 = B5
- H43 = B6
- H39 = B9
Et enfin, pour chaque code en P0XXX, identifier la ligne correspondante dans l'onglet "Base devis" et y inscrire la quantité (ex : Si code P0001 qty 3 sur onglet "Nouveau devis", inscrire dans l'onglet "Base devis" en colonne B10 la valeur 3).
Mon code pour les deux premières fonctions ainsi que l'appelle de la fonction "Enregistrer" qu'il faut donc compléter :
Je ne peux vous partager le fichier source car celui-ci contient toutes mes données personnelles et ceux de mes clients.
J'espère que les photos vous permettront de visualiser mon besoin... :)
Je vous remercie de votre aide et Bonne année à tous !! :)
Bonjour
Je ne peux vous partager le fichier source car celui-ci contient toutes mes données personnelles et ceux de mes clients.
Pour éviter de tout refaire, vous pouvez mettre une fichier anonimysé --> https://forum.excel-pratique.com/forum/anonymiser-les-donnees-confidentielles-des-fichiers-excel-107...
Cordialement
Super, Dan ! Merci :)
Je vous partage donc mon fichier test vous permettant de mieux comprendre mon besoin (je pense).
Bonjour
Votre code à tester
Sub Enregistrer()
Dim col As Integer, lig As Integer
Dim i As Byte
With Sheets("Base Devis")
On Error Resume Next
col = .Rows("1:1").Find(Format(Sheets("Nouveau Devis").Range("H4").Value, "00000"), LookIn:=xlValues, lookat:=xlWhole).Column
If col = 0 Then col = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
On Error GoTo 0
.Cells(1, col).Value = Sheets("Nouveau Devis").Range("H4").Value 'num
.Cells(2, col) = Sheets("Nouveau Devis").Range("F13").Value 'client
.Cells(3, col) = Sheets("Nouveau Devis").Range("H5").Value 'Date devis
.Cells(4, col) = Sheets("Nouveau Devis").Range("H16").Value 'Date valid
.Cells(5, col) = Sheets("Nouveau Devis").Range("H42").Value 'Acompte
.Cells(6, col) = Sheets("Nouveau Devis").Range("H43").Value 'Mi chantier
.Cells(7, col) = Sheets("Nouveau Devis").Range("D39").Value 'Mi chantier
.Cells(8, col) = Sheets("Nouveau Devis").Range("D16").Value 'Adresse travaux
.Cells(9, col) = Sheets("Nouveau Devis").Range("H39").Value 'total HT
For i = 1 To 18
If Sheets("Nouveau Devis").Range("C" & i + 18).Value = "" Then Exit Sub
On Error Resume Next
lig = .Range("A:A").Find(Sheets("Nouveau Devis").Cells(i + 18, 3).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then MsgBox "le code article n'existe pas en feuille Base devis"
.Cells(lig, col) = Sheets("Nouveau Devis").Range("F" & i + 18).Value
Next i
End With
End SubQuelques remarques au sujet de vos autres codes
- Si vous utilisez l'instruction Application.ScreenUpdating = False, pensez à remettre la valeur FALSE à TRUE à la fin de votre code
- dans la sub ajouter, l'instruction Application.ScreenUpdating doit être à FALSE au début du code et non à TRUE
- Dans cette partie de code :
With ThisWorkbook
With Sheets("Nouveau Devis")Il manque le point devant --> Sheets("nouveau devis"). Toutefois faites plutot ceci
With ThisWorkbook.Sheets("Nouveau Devis")Puis enlevez 1 END WITH de trop plus bas
- Je vous conseille aussi d'éviter les espaces et/ou accents dans le nom des feuilles surtout si vous faites appel à VBA. Vous risquez d'avoir parfois des bug sans trop savoir d'où cela vient. utilisez le souligné ou le tiret -- > Nouveau_devis, ou Base_devis
Cordialement
Dan,
Super, ça tourne parfaitement.
Merci pour tes conseils, j'aurai tout de même une question. Peux-tu, comme tu l'as fais pour l'adressage, m'indiquer en vert comment tu as construit le code sur les conditions de recherches (colonne + P00XX) stp ?
Je dois réaliser la même gymnastique pour créer un module Facture et je veux comprendre pour le faire moi-même :) .
Merci.
Merci pour tes conseils, j'aurai tout de même une question. Peux-tu, comme tu l'as fais pour l'adressage, m'indiquer en vert comment tu as construit le code sur les conditions de recherches (colonne + P00XX) stp ?
Voici les explications du code
Sub Enregistrer()
Dim col As Integer, lig As Integer
Dim i As Byte
With Sheets("Base Devis")
'gestion erreur au cas au col = 0
On Error Resume Next
'variable col : verifier si colonne existe dans feuille Base devis par rapport au numéro de devis en feuille Nouveau Devis
col = .Rows("1:1").Find(Format(Sheets("Nouveau Devis").Range("H4").Value, "00000"), LookIn:=xlValues, lookat:=xlWhole).Column
'si col = 0 on cherche la dernière colonne vide en ligne 1
If col = 0 Then col = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
'annule la gestion d'erreur
On Error GoTo 0
'on remplit les cellules dans chaque ligne sur base de la valeur Col trouvée --> cells(Ligne, col)
.Cells(1, col).Value = Sheets("Nouveau Devis").Range("H4").Value 'num
.Cells(1, col).NumberFormat = "00000" 'format de la cellule numero devis dans feuille base devis
.Cells(2, col) = Sheets("Nouveau Devis").Range("F13").Value 'client
.Cells(3, col) = Sheets("Nouveau Devis").Range("H5").Value 'Date devis
.Cells(4, col) = Sheets("Nouveau Devis").Range("H16").Value 'Date valid
.Cells(5, col) = Sheets("Nouveau Devis").Range("H42").Value 'Acompte
.Cells(6, col) = Sheets("Nouveau Devis").Range("H43").Value 'Mi chantier
.Cells(7, col) = Sheets("Nouveau Devis").Range("D39").Value 'Mi chantier
.Cells(8, col) = Sheets("Nouveau Devis").Range("D16").Value 'Adresse travaux
.Cells(9, col) = Sheets("Nouveau Devis").Range("H39").Value 'total HT
'boucle pour completer les valeurs Pxxxx dans feuille Base devis
For i = 1 To 18
'vérifier si une valeur Pxxxxx existe dans la colonne C. Si pas de valeur on sort de la macro
If Sheets("Nouveau Devis").Range("C" & i + 18).Value = "" Then Exit Sub
'gestion d'erreur en cas de lig = 0
On Error Resume Next
'variable lig : trouver lig dans feuille Base devis en fonction de valeur Pxxxx trouvée dans feuille Nouveau Devis
lig = .Range("A:A").Find(Sheets("Nouveau Devis").Cells(i + 18, 3).Value, LookIn:=xlValues, lookat:=xlWhole).Row
'si Pxxx n'est pas trouvée --> lig = 0. on reçoit un message que le code n'est pas trouvé en feuille Base devis
If lig = 0 Then MsgBox "le code article n'existe pas en feuille Base devis"
'remplir la cellule dans la ligne trouvée des quantités mentionnées en F de la feuille Nouveau devis
.Cells(lig, col) = Sheets("Nouveau Devis").Range("F" & i + 18).Value
' valeur i suivante
Next i
End With
End SubNB : j'ai ajouté une ligne dans le code pour le format du numéro de devis dans la feuille Base devis
Si besoin n'hésitez pas.
Si ok
Merci Dan.
Je clos ce sujet mais je viens en MP sur une problématique de la fonction Index Equiv liée au même tableau.