VBA
Bonjour,
Etant débutant sur VBA, je me permet de poster cette demande. J'utilise la version 2016 d'Excel et j'essaie de créer une macro qui fonctionne sur différents classeurs.
Voici le texte de la macro enregistré qui ne marche pas encore et en commentaire le détail des actions qui fonctionnent et des action souhaitées:
'ajouter un filtre de la colonne A à P, le texte fonctionne
Range("$A$1").CurrentRegion.AutoFilter
'filtrer les lignes ayant pour critère en colonne 4 ( D ) isolé, quarantaine ou non conforme, le texte fonctionne
ActiveSheet.Range("$A$1").CurrentRegion.AutoFilter Field:=4, Criteria1:=Array( _
"Isolé", "Non conforme", "Quarantaine"), Operator:=xlFilterValues
'sélectionner la 1ère ligne sous le filtre non masquée, le texte ne fonctionne pas correctement car il ne prend pas la 1ère ligne non masquée mais celle sélectionnée lors de l'enregistrement. Comment résoudre ce problème?
Rows("4:4").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp
'retirer le filtre, le texte fonctionne
Range("$A$1").CurrentRegion.AutoFilter Field:=4
'supprimer les espaces vides en colonne B, le texte fonctionne
Columns("B:B").Select
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'copier les lignes restantes hormis l'entête, le texte fonctionne
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy 'copier les cellules restantes
J'ai essayé d'être le plus clair possible.
Merci pour votre aide,
Benjamin
Bonjour,
C'est toi qui dit de prendre la ligne 4 donc il ne prends pas la ligne 2 qui se trouve sous le filtre
'sélectionner la 1ère ligne sous le filtre non masquée, le texte ne fonctionne pas correctement car il ne prend pas la 1ère ligne non masquée mais celle sélectionnée lors de l'enregistrement. Comment résoudre ce problème?
Rows("2:2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp Bonjour Valc,
Merci pour ta réponse et ton aide.
Ce n'est pas non plus la ligne 2 que je souhaite sélectionner mais la première ligne non filtrée.
Bonjour,
As -tu la possibilité de joindre un fichier ?
Cdlt.
Bonjour Jean-Eric,
Ci joint un fichier type.
Entre temps, j'ai voulu trier la colonne D mais je ne comprends pas le code écrit par l'enregistreur macro.
Et en regardant des tuto, je pense qu'une solution pourrait être de créer une boucle.
Cordialement,
Benjamin
Bonjour, Salut à tous !
D'abord, pas de sélection, jamais s'il n'est pas question d'opérer sur l'affichage, c'est un boulet qu'on attache à VBA pour le ralentir... On a beau le répéter inlassablement, mais beaucoup font une véritable fixation sur les Select !
Ensuite ta première partie de code :
Dim crit
crit = Split("Isolé;Non conforme;Quarantaine", ";")
With ActiveSheet.Range("$A$1").CurrentRegion
.AutoFilter 4, crit, xlFilterValues
.Offset(1).SpecialCells(xlCellTypeVisible).Rows.Delete xlShiftUp
.Worksheet.ShowAllData
End Withque voilà écrite en VBA.
Commentaires ligne par ligne :
- on déclare une variable (de type Variant) parce que cela va faciliter l'écriture du code,
- on initialise la variable avec un tableau des critères de filtrage : la fonction Split permet d'obtenir un tel tableau en scindant une chaîne de texte en éléments selon un séparateur,
- on place avec With la plage courante utilisée en mémoire, elle y restera tant qu'on ne rencontrera pas End With, cela permet à VBA d'accéder à cet objet plus rapidement qu'avec toute autre commande, et cela simplifie le code par le fait que toute expression commençant par un point réfèrera à cette objet (moins d'écriture et plus de fiabilité),
- on filtre : généralement il suffirait de filtrer sur A1 seulement pour initialiser le filtre, je trouve plus sûr de cadrer le filtrage sur la première ligne, mais en prenant l'ensemble de la plage, du fait que l'en-tête est en ligne 1, même sans voir le fichier, des effets pervers sont peu probable... ; on n'est pas obligé d'imiter l'enregistreur en passant systématiquement les arguments par noms, sauf si on aime écrire beaucoup, et produire du code à rallonge (comme l'enregistreur) et forcément plus long à lire ; une courte ligne suffit ici,
- on est toujours dans le bloc With, on va donc décaler notre plage d'une ligne pour préserver l'en-tête et cibler dans cette plage décaler les cellules visibles, dont on supprime les lignes, sans sélection préalable ( et ce n'est pas parce que Microsoft a négligé de mettre à jour l'enregistreur sur ce point qu'on doit se dispenser d'utiliser les nouvelles constantes définies avec VBA7),
- on réaffiche tout.
Et je m'arrête ici, car le reste nécessite de voir le fichier : remplacer toutes les espaces par rien me paraît curieux, et copier pour ne pas coller, je m'abstiens (d'autant que j'essaie toujours d'éviter de copier-coller si l'on peut s'en passer...)
Cordialement.
un grand salut à tous
modifier des colonnes c'est un travail pour Power Pivot (dans Excel menu Données récupérer, et modifier)
voir les tutos sur youtube
il y a même possibilité de créer des colonnes en tapant des exemples, PQuery trouve tout seul la formule
il vaut mieux apprendre PQuery (module d'avenir) que VBA vénérable logiciel qui n'a pas d'avenir certain.
si tu mets un xlsx avec des donnéees de départ et un exemple des données de sortie que tu veux, on peut te montrer
je ne déchiffre pas le VBA pour deviner
bon travail à tous
Re,
Bonjour MFerrand,
Une proposition à étudier avec les éléments fournis.
Pas tout compris de l'objectif !...
Les données ont été mises sous forme de tableau.
A te relire.
Cdlt.
Public Sub Filter_data()
Dim lo As listobject, lCol As Long, Cell As Range, rng As Range
Application.ScreenUpdating = False
Set lo = ActiveSheet.ListObjects(1)
With lo
For Each Cell In .HeaderRowRange
Cell.Replace " ", ""
Next Cell
If .ShowAutoFilter Then .AutoFilter.ShowAllData
For lCol = 1 To 3
.ListColumns(lCol).DataBodyRange.Replace " ", ""
Next
.Range.AutoFilter field:=4, _
Criteria1:=Array("Isol?", "Non conforme", "Quarantaine"), _
Operator:=xlFilterValues
With .AutoFilter.Range
On Error Resume Next
Set rng = .Offset(1).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With
lo.Range.AutoFilter field:=4
If Not rng Is Nothing Then rng.Delete shift:=xlUp
End With
'lo.DataBodyRange.copy
End SubÇa mérite d'être testé !
Bon !
Bonjour,
Une mise à jour de la précédente procédure avec tableau (listobject) et une nouvelle plus traditionnelle avec plage (range).
Une fois l'objectif final connu, on pourra peut-être envisager l'utilisation de Récupérer et Transformer (Power Query ; Excel 2016). Et ainsi, se soustraire à VBA !...
Cdlt.
'Plage de cellules (Range)
Public Sub Filter_data()
Dim rng As Range
With ActiveSheet
If .FilterMode Then .ShowAllData
With .Cells(1).CurrentRegion
.Rows(1).Replace " ", ""
.Cells(1).Offset(1).Resize(.Rows.Count - 1, 3).Replace " ", ""
.AutoFilter 4, Array("Isol?", "Non conforme", "Quarantaine"), 7
End With
With .AutoFilter.Range
On Error Resume Next
Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(12)
On Error GoTo 0
End With
If Not rng Is Nothing Then rng.EntireRow.Delete
.AutoFilterMode = False
End With
End Sub'Tableau (Listobject)
Public Sub Filter_data()
Dim lo As listobject, rng As Range
Set lo = ActiveSheet.ListObjects(1)
With lo
If .ShowAutoFilter Then .AutoFilter.ShowAllData
.HeaderRowRange.Replace " ", ""
.ListColumns(1).DataBodyRange.Resize(, 3).Replace " ", ""
.Range.AutoFilter field:=4, _
Criteria1:=Array("Isol?", "Non conforme", "Quarantaine"), _
Operator:=7
With .AutoFilter.Range
On Error Resume Next
Set rng = .Offset(1).Resize(.Rows.Count - 1, 1).SpecialCells(12)
On Error GoTo 0
End With
lo.Range.AutoFilter field:=4
If Not rng Is Nothing Then rng.Delete shift:=xlUp
End With
End SubBonjour à tous,
Pour répondre à MFerrand, Jmd et Jean-Eric, voici en PJ mes 2 fichiers "type".
Mon but est d'obtenir sur le fichier Test 2 feuille "Suivi quotidien des stocks CSP" une mise à jour des stocks en colonne C. Pour l'obtenir, je pars du fichier test1 sur lequel je supprime toutes les lignes qui ne sont pas en Qualité vente, je supprime les espaces en colonne B qui plantent la future rechercheV et je colle les lignes dans le fichier Test 2 feuille source. Ensuite j'insère une colonne C sur la feuille ''suivi quotidien des stocks" et je fais la recherche V à partir des données feuille source. Dites-moi si c'est clair?
A aujourd'hui, j'ai une macro qui fonctionne (grace à MFerrand) pour supprimer les lignes qui ne sont pas en Qualité vente, supprimer les espaces de la colonne B du fichier Test 1 et copier les données. Et je me suis créé un bouton sur le fichier test2 pour insérer une colonne en C et supprimer les données de la colonne A à P dans Source. Je pensais donc créer un 2nd bouton pour coller les nouvelles données du fichier Test 1 dans Source, appliquer la formule rechercheV et mettre en forme.
Cette methode n'est sans doute pas la meilleure vu que je débute. Je suppose que vous connaissez des méthodes plus efficaces, avec PowerPivot ou PowerQuery que je ne connais pas peut-être.
Cordialement,
re à tous
j'ai pas suivi le raisonnement
pour gérer des stocks, faire simple, ultra-simple
une unique feuille en colonnes simples, avec en titres :
- date (au format jj/mm/aa ou aaaa)
- référence
- quantité entrante
- quantité sortante
- mouvement = qté entrante - qté sortante
c'est tout !
attention : cette feuille va te durer des années sans jamais en changer. La colonne Date assure la gestion des mois et des années, automatiquement
ensuite tu fais un bête TCD pour voir où en sont tes stocks
tu peux ajouter des colonnes, par ex :
- emplacement ou cote ( si tu gères par emplacement)
- niveau de qualité (0=à rebuter, 1=OK) Le TCD te fera des bilans OK et NC sans aucun calcul !
- colonnes pour simplifier les réf (=GAUCHE(réf; 5) ou autre formule basique
aucun VBA
aucun calcul complexe
Excel c'est le bonheur
note : ça ne ressemble pas un progiciel. Mais sache qu'aucun progiciel de gestion de données (stocks, ventes, factures... )ne fonctionne sous Excel. Les programmeurs ne prennent pas ce risque.
JMD, Ce n'est pas ce que je souhaite faire.
Je souhaite compiler tous les jours dans un fichier les données que je reçois d'un autre fichier. Avec le TCD, ce ne sera pas compilé.
Cordialement,
re
compiler des fichiers ? facile !
Excel menu Données (il FAUT que tu apprennes ce menu) Obtenir des données , à partir d'un dossier
tu peux "nettoyer" ou modifier les données (l'extraction d'une partie des noms des réf se fera grâce à un exemple que tu saisiras, l'intelligence artificielle fera le reste
ensuite tu fais ton TCD
VBA est inutile, comme dans 99,99% des questions sur ce forum
mais il faut apprendre Excel d'abord