Importer textes cellules sans cellules vides
Bonjour à toutes et tous, bonjour Dan,
Je constate un petit souci, si un article qui se trouve dans la partie Ajout commande et dans commande, l’addition des articles fonctionne bien et en même temps en cas de prix différent d’un même article, l’ensemble n’est plus exact, éventualité auquel je n’avais pas songé, sry.
Bien que cette situation soit peu probable (vu que c’est le même fournisseur) j’aurais aimé que dans ce cas il considère comme deux articles différents dans la feuille retour. En même temps si cela demande du temps pour vous, au vu de cette éventualité peu probable, cela n’en vaut pas vraiment la peine. Quoi qu’il en soi encore une fois un grand merci à toutes et tous, merci Dan !
Dans le fichier joint j’ai refait différemment, je pense devoir changer un peu la conception de base.
Pour info, j'ai un tout petit peu changé le script : Le nom, , la plage Autofill destination "D2:L2", et de reprendre les infos à +3 après la dernière ligne de Com Fournisseur 1.
Sub Importer2()
Dim dlg As Integer
Dim rng As Range
Dim lig As Byte
Dim i As Integer
Sheets("Retour").Range("A:B").ClearContents 'effacer colonne A et B dans la feuille Retour
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A1:B" & dlg)
End With
rng.Copy
With Sheets("Retour")
.Range("A1").PasteSpecial Paste:=xlPasteValues
On Error Resume Next
Set rng = .Range("A1:A" & dlg).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rng Is Nothing Then
rng.EntireRow.Delete 'Shift:=xlUp
End If
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & dlg)
On Error Resume Next
lig = rng.Find("*Fournisseur*", LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then Exit Sub
.Range("A" & lig & ":B" & lig + 3).Delete Shift:=xlUp
Set rng = .Range("A2:A" & lig) 'définir la plage de recherche pour articles ajoutés dans Com1-Fournisseur
Dim lg As Integer
For i = dlg To lig Step -1
If .Range("A" & i) = "" Or .Range("A" & i) Like "*Fournisseur*" Then
.Range("A" & i).EntireRow.Delete
Else
On Error Resume Next
lg = rng.Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lg > 0 Then
.Range("B" & lg) = .Range("B" & i) + .Range("B" & lg)
.Range("A" & i).EntireRow.Delete
lg = 0
End If
End If
Next i
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range("E2:L2").AutoFill Destination:=.Range("E2:L" & dlg), Type:=xlFillDefault
End With
End SubBien à vous
Vincent
Bonjour,
Dans votre dernier fichier --> Vous avez sauté une étape https://forum.excel-pratique.com/s/goto/1149347, dans le point 5, je vous ai écrit de créer un module. Là votre code doit se trouver dans le module et pas dans votre feuille. Veillez à cela !
De plus le code dans votre fichier n'est pas le même que celui que vous postez
si un article qui se trouve dans la partie Ajout commande et dans commande, l’addition des articles fonctionne bien et en même temps en cas de prix différent d’un même article, l’ensemble n’est plus exact, éventualité auquel je n’avais pas songé, sry.
Lorsque vous dites le "prix différent", vous faites référence au "Prix unitaire" dans la feuille Com colonne C ?
En gros si je comprends vous voulez que pour un même article en "Com fournisseur 1" et "Com fournisseur 1 ajout", si le prix unitaire est différent on conserve l'article dans la feuille Retour (donc doublon d'article car prix unitaire différent)
Dans le fichier joint j’ai refait différemment, je pense devoir changer un peu la conception de base.
c'est à dire ? Si vous n'avez pas finaliser votre fichier, cela ne sert à rien de faire le code sans quoi on risque de tout recommencer.
Ne me repostez pas de fichier. Je regarde sur votre premier fichier posté car le dernier comporte des liaisons et moins d'informations
Bonjour Dan,
Merci encore pour vos intervention, et SRY pour les erreurs d’attention de ma part.
En effet sur ce fichier j’ai oublié de créer un module, pour le code posté, je me suis trompé, je pensais sincèrement avoir corrigé les différences, sry.
« vous faites référence au "Prix unitaire" dans la feuille Com colonne C ? »
Oui c’est bien cela.
« donc doublon d'article car prix unitaire différent »
Oui, et je pensais mettre une alerte, peut-être qu’en cas de doublon que la cellule de ceux-ci ce colorisent avec la même couleur, ou autre, je n’ai pas d’idée précise.
« Si vous n'avez pas finaliser votre fichier, cela ne sert à rien de faire le code sans quoi on risque de tout recommencer. »
Ce n’est pas la base que je change, cependant au fil de l’évolution je constate qu’il est préférable de changer certain aspect. J’ai surtout scindé en deux feuilles, les commandes fournisseurs et ceux du Colruyt et autre. C’est plus clair ainsi.
J’ai corrigé le tir, le module est fait, tout fonctionne bien excepté si même article avec un prix différent. Comme dit précédemment, il est fort peu probable que cela se produise, et en même temps, le risque est là, moindre avec les fournisseurs, par contre avec Colruyt et autre oui, nous faisons des achats en promotions et souvent quelques ajouts plus tard, qui ne sont plus en promo à ce moment-là, je viens de penser à cela... donc finalement c'est important.
Merci en pour tout ! je ne poste pas le fichier, je vous propose le code du fichier du Module1 et non de la feuille 😉
Option Explicit
Sub Importer2()
Dim dlg As Integer
Dim rng As Range
Dim lig As Byte
Dim i As Integer
Sheets("Retour").Range("A:B").ClearContents 'effacer colonne A et B dans la feuille Retour
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A1:B" & dlg)
End With
rng.Copy
With Sheets("Retour")
.Range("A1").PasteSpecial Paste:=xlPasteValues
On Error Resume Next
Set rng = .Range("A1:A" & dlg).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rng Is Nothing Then
rng.EntireRow.Delete 'Shift:=xlUp
End If
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & dlg)
On Error Resume Next
lig = rng.Find("*Fournisseur*", LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then Exit Sub
.Range("A" & lig & ":B" & lig + 3).Delete Shift:=xlUp
Set rng = .Range("A2:A" & lig) 'définir la plage de recherche pour articles ajoutés dans Com1-Fournisseur
Dim lg As Integer
For i = dlg To lig Step -1
If .Range("A" & i) = "" Or .Range("A" & i) Like "*Fournisseur*" Then
.Range("A" & i).EntireRow.Delete
Else
On Error Resume Next
lg = rng.Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lg > 0 Then
.Range("B" & lg) = .Range("B" & i) + .Range("B" & lg)
.Range("A" & i).EntireRow.Delete
lg = 0
End If
End If
Next i
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range("D2:L2").AutoFill Destination:=.Range("D2:L" & dlg), Type:=xlFillDefault
End With
End SubBien à vous, bon dimanche à toutes et tous.
Vincent
Oups j'oubliais, dans la feuille retour, j’aimerais aussi intégrer le retour des commandes de l’onglet « Colruyt1 » de la même manière que les commandes fournisseurs, mais en partant (de la feuille Retour)de la colonne N à V, juste après les colonnes occupées par les commandes fournisseurs, la colonne M servant de séparation. Le reste est identique aux commande fournisseur.
J’essaie de comprendre et d’adapter le script mais je n’y arrive pas. Voulez-vous bien encore m’aider en adaptant le code si dessous ?
Ensuite avec les deux codes je pourrais comprendre les différences et ne plus vous importuner par rapport à cela. Merci à vous.
Pour info, J’ai déjà changé ces lignes afin de me faire comprendre au mieux :
Sheets("Retour").Range("N:O").ClearContents 'effacer colonne N et O dans la feuille Retour
.Range("Q2:V2").AutoFill Destination:=.Range("Q2:V" & dlg), Type:=xlFillDefault
Sub Importer3()
Dim dlg As Integer
Dim rng As Range
Dim lig As Byte
Dim i As Integer
Sheets("Retour").Range("N:O").ClearContents 'effacer colonne N et O dans la feuille Retour
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A1:B" & dlg)
End With
rng.Copy
With Sheets("Retour")
.Range("A1").PasteSpecial Paste:=xlPasteValues
On Error Resume Next
Set rng = .Range("A1:A" & dlg).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rng Is Nothing Then
rng.EntireRow.Delete 'Shift:=xlUp
End If
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & dlg)
On Error Resume Next
lig = rng.Find("*Fournisseur*", LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then Exit Sub
.Range("A" & lig & ":B" & lig + 3).Delete Shift:=xlUp
Set rng = .Range("A2:A" & lig) 'définir la plage de recherche pour articles ajoutés dans Com1-Fournisseur
Dim lg As Integer
For i = dlg To lig Step -1
If .Range("A" & i) = "" Or .Range("A" & i) Like "*Fournisseur*" Then
.Range("A" & i).EntireRow.Delete
Else
On Error Resume Next
lg = rng.Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lg > 0 Then
.Range("B" & lg) = .Range("B" & i) + .Range("B" & lg)
.Range("A" & i).EntireRow.Delete
lg = 0
End If
End If
Next i
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range("Q2:V2").AutoFill Destination:=.Range("Q2:V" & dlg), Type:=xlFillDefault
End With
End SubBien à vous
Vincent
Bonjour,
Par rapport à votre message ici --> https://forum.excel-pratique.com/s/goto/1149775, voici le code adapté. J'ai testé sur votre fichier "comptaokVba" qui est mon fichier de travail.
1."prix unitaire différent"
Le code tient compte du doublon de désignation mais prix unitaire différent.
2. "..... mettre une alerte, peut-être qu’en cas de doublon que la cellule de ceux-ci ce colorisent avec la même couleur, ou autre, je n’ai pas d’idée précise".
Le code ajoute la couleur de fond si le doublon trouvé avec prix unitaire différent.
Sub Importer()
Dim dlg As Integer
Dim rng As Range
Dim lig As Byte
With Sheets("Retour")
.Range("A:B").ClearContents 'effacer colonne A et B dans la feuille Retour
.Range("A:A").Interior.Color = xlNone 'supprimer couleur de fond
End With
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A1:B" & dlg)
End With
rng.Copy
With Sheets("Retour")
.Range("A1").PasteSpecial Paste:=xlPasteValues
On Error Resume Next
Set rng = .Range("A1:A" & dlg).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rng Is Nothing Then
rng.EntireRow.Delete 'Shift:=xlUp
End If
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & dlg)
On Error Resume Next
lig = rng.Find("*Fournisseur*", LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then Exit Sub
On Error GoTo 0
.Range("A" & lig & ":B" & lig + 4).EntireRow.Delete 'Supprimer lignes
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range("E2:N2").AutoFill Destination:=.Range("E2:N" & dlg), Type:=xlFillDefault 'recopier formule entre colonne E et N
Set rng = .Range("A2:A" & lig) 'définir la plage de recherche pour articles ajoutés dans Com1-Fournisseur
Dim lg As Integer, i As Integer
For i = dlg To lig Step -1
If .Range("A" & i) = "" Or .Range("A" & i) Like "*Fournisseur*" Then
.Range("A" & i).EntireRow.Delete
Else
On Error Resume Next
lg = rng.Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lg > 0 Then
If CDbl(.Range("E" & i)) = CDbl(.Range("E" & lg)) Then 'verifier si prix identique
.Range("B" & lg) = .Range("B" & i) + .Range("B" & lg) 'ajouter quantite
.Range("A" & i).EntireRow.Delete
lg = 0
End If
Else: .Range("A" & i).Interior.Color = 8696052 'couleur marron
End If
End If
Next i
End With
End SubRemarque :
- changez votre formule en E2 qui est imitée à la ligne 39. Mettez-la à 100 par exemple comme dans les colonnes G et I. Même chose pour les colonnes K et L. Le cas échéant le code ne va pas pouvoir recopier vos formules.
- il y a une formule dans la colonne O qui n'est pas recopiée par le code. Est-ce le code doit prendre cette colonne en considération ?
Oups j'oubliais, dans la feuille retour, j’aimerais aussi intégrer le retour des commandes de l’onglet « Colruyt1 » de la même manière que les commandes fournisseurs, mais en partant (de la feuille Retour)de la colonne N à V, juste après les colonnes occupées par les commandes fournisseurs, la colonne M servant de séparation. Le reste est identique aux commande fournisseur.
Je n'ai pas compris ce que vous voulez faire. Si je prends votre fichier "Comtaokvba" et votre feuille "Com1&Colr", vous voudriez faire la même chose mais pour les infos de la colonne M à U ?
Bonjour Dan,
Les formules ont été changées tout est mis à 100. Pour la colonne O le code ne doit pas en tenir compte.
Avec le même fichier, pour être sûr j’ai retéléchargé le fichier original, celui sur lequel vous travaillez et malheureusement je n’obtiens pas le résultat voulu
« Je n'ai pas compris ce que vous voulez faire. Si je prends votre fichier "Comtaokvba" et votre feuille "Com1&Colr", vous voudriez faire la même chose mais pour les infos de la colonne M à U ? »
C’est bien cela ! Sauf qu’il faut aller jusqu’à W (de M a W) sur la feuille COM1&Colr, et sur la feuille Retour, de N a Z.
Dan, je tiens encore une fois à vous remercier, pour votre temps et votre patience, et m’excuser pour mes maladresses. Merci à vous !
Bien à vous
Vincent
Bonjour,
Avec le même fichier, pour être sûr j’ai retéléchargé le fichier original, celui sur lequel vous travaillez et malheureusement je n’obtiens pas le résultat voulu . La coloration se fait sur tous les articles ce situant dans ajout commande et qui ne sont pas repris dans la commande principale. Le code ne tient pas compte du doublon de désignation avec prix unitaire différent.
Ok effectivement. Je n'y avais pas fait attention. C'est juste une petite adaptation à faire.
Mais avant il y a un autre souci. Votre formule RechercheV ne convient pas en colonne E de la feuille retour.
Si vous regardez bien en cas de doublons, la formule ne vous renverra pas le prix reprit sur la ligne du doublon mais bien le prix de la première ligne trouvée en colonne A.
Pour être correct dans votre feuille Retour il va falloir aussi importer les prix de la colonne C de la feuille Com1 plutôt que d'utiliser une formule RechercheV
Bien entendu, on peut faire en sorte que le code agisse aussi sur la colonne E de la feuille Retour mais est-il possible pour vous de modifier la feuille Retour pour que la colonne C reprenne le prix unitaire de la colonne C de la feuille Com1.
En gros vous auriez les colonnes A, B et C de la feuille Retour identiques à cella de la feuille Com1.
Je regarderai après pour les colonnes M à W
Cordialement
Bonjour Dan,
Pas de souci, pour faire ainsi. En attendant, j'ai changé la colonne E (Retour) et mis à la place de C.
Merci.
Bien à vous
Bonjour
En considérant que le PU est en colonne C au lieu de la colonne E dans la feuille Retour, essayez le code comme ceci :
Sub Importer()
Dim dlg As Integer
Dim rng As Range
Dim lig As Byte
With Sheets("Retour")
.Range("A:B").ClearContents 'effacer colonne A et B dans la feuille Retour
.Range("A:A").Interior.Color = xlNone
End With
With ActiveSheet
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A1:C" & dlg)
End With
rng.Copy
With Sheets("Retour")
.Range("A1").PasteSpecial Paste:=xlPasteValues
On Error Resume Next
Set rng = .Range("A1:A" & dlg).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rng Is Nothing Then
rng.EntireRow.Delete 'Shift:=xlUp
End If
dlg = .Range("A" & Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & dlg)
On Error Resume Next
lig = rng.Find("*Fournisseur*", LookIn:=xlValues, lookat:=xlWhole).Row
If lig = 0 Then Exit Sub
On Error GoTo 0
.Range("A" & lig & ":B" & lig + 4).EntireRow.Delete 'Supprimer lignes
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range("E2:N2").AutoFill Destination:=.Range("E2:N" & dlg), Type:=xlFillDefault 'recopier formule entre colonne E et N
Set rng = .Range("A2:A" & lig) 'définir la plage de recherche pour articles ajoutés dans Com1-Fournisseur
Dim lg As Integer, i As Integer
For i = dlg To lig Step -1
If .Range("A" & i) = "" Or .Range("A" & i) Like "*Fournisseur*" Then
.Range("A" & i).EntireRow.Delete
Else
On Error Resume Next
lg = rng.Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole).Row
If lg > 0 Then
If .Range("C" & i) = .Range("C" & lg) Then 'verifier si prix identique
.Range("B" & lg) = .Range("B" & i) + .Range("B" & lg) 'ajouter quantite
.Range("A" & i).EntireRow.Delete
lg = 0
ElseIf .Range("C" & i) <> .Range("C" & lg) Then 'verifier si prix différent
.Range("A" & i).Interior.Color = 8696052 'couleur marron
End If
End If
End If
Next i
End With
End SubFaites un test et dites moi.
Si ok, je regarderai pour votre demande au sujet des autres colonnes et de colryt1. Vu les changements de la feuille Retour , pouvez-vous confirmer que les colonnes concernées restent comme précisé dans votre message --> C’est bien cela ! Sauf qu’il faut aller jusqu’à W (de M a W) sur la feuille COM1&Colr, et sur la feuille Retour, de N a Z.
Je confirme pour les colonnes elles restent ainsi, encore une fois, merci !
Bien à vous
Vincent
Je confirme pour les colonnes elles restent ainsi,
Ok mais dans le fichier les colonnes vont de M à U et pas de M à W et dans la feuille retour si on fait de N à Z on écrase les données en N venant du code que je viens de vous donner
Oui Dan, merci pour votre attention, j'ai un second fichier identique, excepté les colonnes dont nous parlons. J'ai recopier votre code dans ce fichier il fonctionne parfaitement. Cependant j'aurai aimé aussi avoir cette possibilité, ainsi avec deux boutons je pourrais sur la feuille retour placer la commande fournisseur 1 et 2 dans sa globalité (cote à cote).
Bien à vous
Cependant j'aurai aimé aussi avoir cette possibilité, ainsi avec deux boutons je pourrais sur la feuille retour placer la commande fournisseur 1 et 2 dans sa globalité (cote à cote).
Heu fournisseur 1 et fournisseur 2 ? Je ne suis plus là. Vous parliez de colruyt donc Com 1 Colruyt & Autres (colonnes M à U)
Si oui on met les données à partir de la colonne P ?
Dans le nouveau fichier, j’ai créer deux feuilles Commande1 et Commande2, et deux autres feuilles Colruyt1 et Colruyt2, pour plus de clarté et simplicité.
Dans la feuille Commande1, il y à un bouton qui exécute votre script qui fonctionne parfaitement, dans la feuille Commande2, j’aimerais faire de même et placer l’importation des articles commandés toujours dans la même feuille « Retour » et ce juste à coté de l’importation des articles de la feuille Commande1.
Dans ce fichier, l’importation de Commande1 est de la colonne A jusqu’à L. et dans le code fourni j’ai changé ce bout de code :
.Range("E2:N2").AutoFill Destination:=.Range("E2:N" & dlg)
Par :
.Range("D2:L2").AutoFill Destination:=.Range("D2:L" & dlg)
L’importation de la commande2 commencerait de M et finirait à X (j’avais oublié un changement). Pour Colruyt je vous ai induit en erreur, sry, normalement pour ces deux feuilles je devrais m’en sortir avec la comparaison des feuilles des commandes1 et 2.
Bien à vous
Petite correction à faire dans le code que je vous ai donné avant à la ligne
.Range("A:B").ClearContents 'effacer colonne A et B dans la feuille RetourRemplacez le B par C. Il faut supprimer les 3 colonnes
L’importation de la commande2 commencerait de M et finirait à X (j’avais oublié un changement). Pour Colruyt je vous ai induit en erreur, sry, normalement pour ces deux feuilles je devrais m’en sortir avec la comparaison des feuilles des commandes1 et 2.
Pour résumer :
Feuille COm1 : on part de la colonne M. Donc les données importées de vont des colonnes M à O au lieu de A à C dans le code précédent
Feuille Retour : on met les données en colonne N à P
Correction faite !
"Feuille COm1 : on part de la colonne M. Donc les données importées de vont des colonnes M à O au lieu de A à C dans le code précédent
Feuille Retour : on met les données en colonne N à P "
Parfaitement Exact ! Merci ;-)
Bien à vous
Pouvez vous me dire ce que l'on trouve en M40 à M44
Dans votre fichier il n' y a rien de renseigné
Nom du fournisseur, Acompte. Idem que la colonne A
Bien à vous
Il y a quelque chose que je ne comprends pas.
La colonne M est consacrée a Colruyt, donc on doit trouver :
- M40, vous avez "Nom du fournisseur" ?
- M41 --> Colruyt ou autre ?
- M47 "Com1 colruyt"
Autre question importante : vu que vous voulez mettre les deux informations sur la feuille Retour (en colonne A à L et colonnes N à X), est-ce que vous -allez toujours exécuter le code 1 avant le code pour Colruyt (donc code 2) ?
Si vous exécutez soit l'un soit l'autre dans n'importe quel ordre, alors il faudra aussi refaire le code 1 que je vous ai proposé avant.
Bonjour Dan,
- M40, vous avez "Nom du fournisseur" ? M41 --> Colruyt ou autre ? M47 "Com1 colruyt".
C’est bien ça et en M43 "Acompte" et M45 est le montant de l’acompte.
Pour l’exécution du code je crois comprendre le problème, la suppression des lignes lors de l’exécution des codes, l’un effacera l’autre et inversement, miel je n’y avait pensé… Il est en effet préférable de pouvoir exécuter dans n’importe quel ordre.
Encore une fois merci pour votre attention !
Bien à vous
Vincent