XL 2010 [Résolu] Modifier lignes sous condition

  • Initiateur de la discussion Initiateur de la discussion Lone-wolf
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Lone-wolf

XLDnaute Barbatruc
Bonjour à toutes et à tous 🙂

Dans UsfModCommandes je n'arrive pas à modifier les lignes de commande dans la feuille Sauvegarde > Classeur Base.xls. Voici la dernière macro que j'ai essaié

VB:
Private Sub CmdFermer_Click()
Dim ligne&, j&, k&, Plage As Range, NC As Range, c As Range, Wf

With WsSav
Set Plage = .Range("b3:b65536")
For Each c In Plage
Set NC = WsFC.Range("g14")
If IsEmpty(c) Then Exit For
If IsNumeric(c) And c.Value Like "*" & NC.Value & "*" Then
For j = 18 To WsFC.Range("b40").End(xlUp).Row + 1
c.Offset(1, -1) = WsFC.Cells(j, 2)
c.Offset(1, 0) = WsFC.Cells(j, 3)
c.Offset(1, 1) = WsFC.Cells(j, 4)
c.Offset(1, 2) = WsFC.Cells(j, 5)
c.Offset(1, 3) = WsFC.Cells(j, 6)
c.Offset(1, 4) = WsFC.Cells(j, 7)
Next j
End If
Next c
End With


With WsStock
ligne = .Range("i65536").End(xlUp).Row
For k = 2 To ligne
.Cells(k, 9).ClearContents
Wf = WorksheetFunction.SumIf(WsDC.Range("c2:c65536"), .Cells(k, 3), WsDC.Range("d2:d65536"))
.Cells(k, 9).Value = Wf
If .Cells(k, 3) <> "" Then
.Cells(k, 11) = .Cells(k, 5) - .Cells(k, 9)
Else
Exit For
End If
Next k
End With

CmbCommandes = ""
CmbClients = ""
TxtDC = ""
TxtDL = ""
TxtDP = ""
TxtDLP = ""
CmbTP = ""
Unload Me
UsfCommandes.Show
End Sub

À vous relire
 

Pièces jointes

Bonjour ODVJ 🙂

Merci d'avoir répondu. Je n'ai pas bien saisi, mais voici ce que je cherche à faire.
Dans le classeur Base j'ai les feuilles "commandes - confirm.de commandes -bulletins de livraisons et factures". Une fois les modifications apportées à ces feuilles. Modifier les lignes de la feuille Sauvegarde suivant le numéro de commande correspondant.

J'épère que ce soit compréhensible.
 
Bonjour Lone-Wolf, Bonjour ODVJ.

Je te propose deux solutions.
La première dans l'idée que tu utilises au début, avec des boucles. J'en ai profité pour ajouter ou supprimer les lignes nécessaires dans la feuille Sauvegarde.

VB:
Private Sub CmdFermer_Click()
Dim ligne&, j&, k&, NC$, Wf
'Ajout de nouvelles variables.
Dim i&, l%

NC = WsFC.[g14].Value

With WsSav
    For i = 3 To .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        If .Cells(i, "B").Value Like "*" & NC & "*" Then
            j = 18: k = 1
            Do While WsFC.Cells(j, "B").Value <> ""
                    If .Cells(i + k, "A").Value = "" Then .Rows(i + k).EntireRow.Insert xlShiftDown
                    .Cells(i + k, "A").Resize(, 6).Value = WsFC.Cells(j, "B").Resize(, 6).Value
                    j = j + 1: k = k + 1
            Loop
                Do While .Cells(i + k, "A").Value <> ""
                    .Rows(i + k).EntireRow.Delete
                Loop
            GoTo Suite
        End If
    Next i
End With

Suite:

With WsStock
ligne = .Range("i65536").End(xlUp).Row
For k = 2 To ligne
.Cells(k, 9).ClearContents
Wf = WorksheetFunction.SumIf(WsDC.Range("c2:c65536"), .Cells(k, 3), WsDC.Range("d2:d65536"))
.Cells(k, 9).Value = Wf
If .Cells(k, 3) <> "" Then
.Cells(k, 11) = .Cells(k, 5) - .Cells(k, 9)
Else
Exit For
End If
Next k
End With

TxtDC = ""
TxtDL = ""
TxtDP = ""
TxtDLP = ""
CmbTP = ""

Application.Wait (Now + TimeValue("00:00:01"))

WsC.Activate
Application.Goto [A1]
Unload Me
UsfCommandes.Show
End Sub

La seconde solution, plus rapide. Nous supprimons les anciennes lignes de la sauvegarde, insérons le nombre de lignes nécessaires et copions directement la totalité des articles.

VB:
Private Sub CmdFermer_Click()
Dim ligne&, j&, k&, NC&, Wf
'Ajout des variables.
Dim i&, ii%, jj%

NC = WsFC.[g14].Value

With WsSav
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    ii = .Cells(i, "A").CurrentRegion.Rows.Count - 1
    jj = WsFC.[b18].CurrentRegion.Rows.Count - 1
    .Cells(i + 1, "A").Resize(ii).EntireRow.Delete
    .Cells(i + 1, "A").Resize(jj).EntireRow.Insert
    .Cells(i + 1, "A").Resize(jj, 6).Value = WsFC.[b18].Resize(jj, 6).Value
End With

With WsStock
ligne = .Range("i65536").End(xlUp).Row
For k = 2 To ligne
.Cells(k, 9).ClearContents
Wf = WorksheetFunction.SumIf(WsDC.Range("c2:c65536"), .Cells(k, 3), WsDC.Range("d2:d65536"))
.Cells(k, 9).Value = Wf
If .Cells(k, 3) <> "" Then
.Cells(k, 11) = .Cells(k, 5) - .Cells(k, 9)
Else
Exit For
End If
Next k
End With

TxtDC = ""
TxtDL = ""
TxtDP = ""
TxtDLP = ""
CmbTP = ""

Application.Wait (Now + TimeValue("00:00:01"))

WsC.Activate
Application.Goto [A1]
Unload Me
UsfCommandes.Show
End Sub
 
Bonjour thebenoit 🙂

merci pour ton intervention. J'ai adopté la 2ème solution (plus rapide 😉), impeccable !.

Si tu as regardé le formulaire, j'ai aussi le boutton supprimer. Est-ce que tu voudrais bien adapter le 2ème code pour pouvoir suppimer toute la commande? Merci encore.
 
Je me doutais que tu choisirais le second.

Voilà pour ce qui est de supprimer la sauvegarde :

VB:
Private Sub CmdSupprimer_Click()
Dim NC&, i&, ii%

NC = WsFC.[g14].Value

With WsSav
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    ii = .Cells(i, "A").CurrentRegion.Rows.Count + 1
    .Cells(i, "A").Resize(ii).EntireRow.Delete
End With

End Sub
 
Re thebenoit

Désolé d'avoir été trop vite en besogne. Il y a un souci avec les codes articles, c'est toujour le même pour des différents articles. Il faudrait ajouter la ligne Match, pour que la macro aille rechercher le code exacte de l'article.
 
J'ai adapté le code de suppression sur l'ensemble des feuilles Commandes, Details Commandes et Facturation.
Tu auras une idée si tu en as l'utilité.

VB:
Private Sub CmdSupprimer_Click()
Dim NC&, i&, ii%

NC = WsFC.[g14].Value

With WsC
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    .Rows(i).EntireRow.Delete
End With

With WsDC
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    ii = WorksheetFunction.CountIf(.Columns(2), NC)
    .Cells(i, "A").Resize(ii).EntireRow.Delete
End With

With WsFact
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    .Rows(i).EntireRow.Delete
End With

With WsSav
    i = WorksheetFunction.Match(NC, .Columns(2), 0)
    ii = .Cells(i, "A").CurrentRegion.Rows.Count + 1
    .Cells(i, "A").Resize(ii).EntireRow.Delete
End With

End Sub
 
Re thebenoit

Encore une fois désolé, ce n'est pas ta macro qui cause problème; c'est le code du bouton modifier qui cause problème.
k = Application.Match(CmbArticles.Value, WsProd.Columns(3), 0) 'Code Article
Sheets(j).Range("b" & x) = WsProd.Cells(k, 2)

VB:
Set cel = WsDC.Columns(2).Find(CmbCommandes, , xlValues)
x = 17
If Not cel Is Nothing Then
premaddress = cel.Address
Do
x = x + 1
For j = 1 To Sheets.Count
If Sheets(j).Name = "Bons de Commandes" Or Sheets(j).Name = "Confirmations de Commandes" _
Or Sheets(j).Name = "Bulletins de Livraisons" Or Sheets(j).Name = "Factures" Then
Sheets(j).Range("c" & x).Value = cel.Offset(0, 1).Value  'Article
k = Application.Match(CmbArticles.Value, WsProd.Columns(3), 0)
Sheets(j).Range("b" & x) = WsProd.Cells(k, 2)                 'Code Article
Sheets(j).Range("d" & x).Value = cel.Offset(0, 2).Value  'Quantité
Sheets(j).Range("e" & x).Value = cel.Offset(0, 3).Value  'Prix
Sheets(j).Range("f" & x).Value = cel.Offset(0, 5).Value  'Rabais
Sheets(j).Range("g" & x).Value = cel.Offset(0, 6).Value  'Total
Sheets(j).Range("g45") = WorksheetFunction.Sum(Sheets(j).Range("g18:g40"))
Sheets(j).Range("g46") = ((Sheets(j).Range("g45") * 0.08) * 100) / 100
ar1 = WorksheetFunction.RoundDown(Sheets(j).Range("g46"), 1)
Sheets(j).Range("g46") = ar1
Sheets(j).Range("g47") = Sheets(j).Range("g45") + Sheets(j).Range("g46")
ar2 = WorksheetFunction.RoundDown(Sheets(j).Range("g47"), 1)
Sheets(j).Range("g47") = ar2
End If
Next j
Set cel = WsDC.Columns(2).FindNext(cel)
Loop While Not cel Is Nothing And cel.Address <> premaddress
End If

Comme k s'applique à une seule ligne, comment faire en sorte pour qu'il recherche le code suivant?
 
Admettons que le client une fois pris sa première commande, le jour suivant ou quelques jours plus tard, il veux ajouter des quantités oubien il dit "Il faut m'enlever cet article, j'en ai plus besoin". Il faut bien que l'on puisse modifier la commande de départ. C'est ce que je cherche à faire avec le formulaire UsfModCommandes.
 
Oulaaa! La liste est longue 😉

Détails commandes
Facturation
Bons de Commandes
Confirmations de Commandes
Bulletins de Livraisons
Factures
Sauvegarde.

Les feuilles Ventes ainsi que la feuille Stock, se mettent à jour automatiquement suivant les données de Détails Commandes.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
8
Affichages
233
Réponses
4
Affichages
177
Réponses
3
Affichages
664
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
649
Réponses
10
Affichages
799
Retour