Supprimer contenue de la case du dessous.

Résolu
Florian -  
 Florian -
Bonjour,

Je me tourne vers vous car j'ai un tableau excel à nettoyer.

J'ai un tableau d'environ 20.000 lignes, dans ce tableau j'ai une colonne (F) contenant des quantités, toute sont sous une case dont le contenue est le mot : "QTE:"

J'aimerais supprimer toute ces quantités (donc le contenue des cases, sous les cases "QTE:" de cette dite colonne.)

Je suis un peu larguer, mes bases en VBA sont très très loin.

Merci par avance pour votre aide !

Cordialement !
Florian
A voir également:

4 réponses

Florian
 
http://www.cjoint.com/c/ELkhLB1wMzJ

Voilà l'exemple de fichier.
1
Florian
 
Mais le vrai fichier fais 20.000 lignes environ.....
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
En version "tout cuit tombée du camion", ça donne :
Sub SupprLignes()
Dim Num_Lignes(), DL As Long, i As Long, Flag As Boolean, Wsh As Worksheet, PlageDeRecherche As String

'--------------------A ADAPTER
Const Col As Byte = 3 'numéro de la colonne concernée (ici C)
Const LignDeb As Byte = 2 'numéro de la première ligne colonne C
Const Texte As String = "Commencé le"
Set Wsh = Sheets("Feuil1") ' A ADAPTER le nom de la feuille concernée
'-----------------------------------------------------------------

With Wsh
   DL = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
   PlageDeRecherche = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Address
   
   Flag = FindAll(Texte, Wsh, PlageDeRecherche, Num_Lignes())
   
   If Flag Then
      For i = 1 To UBound(Num_Lignes)
         .Cells(Num_Lignes(i) + 1, Col) = ""
      Next i
   End If
End With
End Sub

Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches()) As Boolean
On Error GoTo Err_Trap
Dim rFnd As Range, iArr As Integer, rFirstAddress
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)
If Not rFnd Is Nothing Then
   rFirstAddress = rFnd.Address
   Do Until rFnd Is Nothing
      iArr = iArr + 1
      ReDim Preserve arMatches(iArr)
      arMatches(iArr) = rFnd.Row
      Set rFnd = oSht.Range(sRange).FindNext(rFnd)
      If rFnd.Address = rFirstAddress Then Exit Do
   Loop
   FindAll = True
Else
   FindAll = False
End If
Err_Trap:
If Err <> 0 Then
   MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
   Err.Clear
   FindAll = False
   Exit Function
End If
End Function


Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
1
Florian
 
Merci c'est super.
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,


[ ANCIENNE REPONSE SUPPRIMEE ]

Oupss..
EDIT : Je viens de relire ta question....

En fait il va falloir trouver à quelle ligne se trouve le mot "QTE:"
Puis déterminer à quelle ligne s'arrête cette liste de quantité
Et enfin.. sélectionner cette plage de cellule et en faire un clear.


Cordialement, 
Jordane                                                                 
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Dans l'idéal.. il serait bien de fournir un fichier d'exemple pour que nous puissions regarder.
Tu peux utiliser ceci : https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Bonjour Florian,
Mes salutations Jordane45,

Voici un exemple commentés pour adapter...
Sub Suppr_Qttes()
Dim Tabl(), DL As Long, i As Long

'--------------------A ADAPTER
Const Col As Byte = 6 'numéro de la colonne concernée (ici F)
Const LignDeb As Byte = 2 'numéro de la première ligne colonne F
With Sheets("Feuil1") ' A ADAPTER le nom de la feuille concernée
'-----------------------------------------------------------------

   DL = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
   Tabl = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Value
   For i = 1 To UBound(Tabl)
      If Tabl(i, 1) <> "Qté:" Then Tabl(i, 1) = ""
      'variante si erreur de saisie (exemple Qté : au lieu de Qté:)
      'If Not Tabl(i, 1) Like "*Qté*" Then Tabl(i, 1) = ""
   Next i
   .Cells(LignDeb, Col).Resize(UBound(Tabl), 1) = Tabl
End With
End Sub

0
Florian
 
Super !
Ca marche !

Peut tu me décrire un peu ce que fais la partie :

DL = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
Tabl = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Value
For i = 1 To UBound(Tabl)
If Tabl(i, 1) <> "Qté:" Then Tabl(i, 1) = ""
'variante si erreur de saisie (exemple Qté : au lieu de Qté:)
'If Not Tabl(i, 1) Like "*Qté*" Then Tabl(i, 1) = ""
Next i
.Cells(LignDeb, Col).Resize(UBound(Tabl), 1) = Tabl

Merci en tous cas !
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > Florian
 
DL = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row 

Stocke le numéro de la dernière ligne non vide de la colonne numéro Col
------------------------------------------------
Tabl = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Value 

Stocke le contenu du Range (1ere cellule, dernière cellule) de la colonne numéro Col dans une variable tableau
------------------------------------------------
For i = 1 To UBound(Tabl) 

boucle sur toute la variable tableau
------------------------------------------------
If Tabl(i, 1) <> "Qté:" Then Tabl(i, 1) = "" 

Si le contenu de la variable tableau à l'indice i est différent Qté: alors on en suprime le contenu
------------------------------------------------
.Cells(LignDeb, Col).Resize(UBound(Tabl), 1) = Tabl 

Restitue dans la feuille le contenu de la variable tableau
0
Florian
 
Ok et si je veut adapter cette formule à la colonne C , pour les cases en dessous des cases "Commencé le:"

Comment je peu faire, car la si je comprend bien ça supprimera tous les contenus différent de "Commencé le" (si j'adapte)

EDIT :

La modif suivante, fonctionne à peu près:

Sub Suppr_date()
Dim Tabl(), DL As Long, i As Long


Const Col As Byte = 3 'numéro de la colonne concernée (ici C)
Const LignDeb As Byte = 2 'numéro de la première ligne colonne C
With Sheets("Feuil1")

DL = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
Tabl = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Value
For i = 1 To UBound(Tabl)
If Tabl(i, 1) = "Commencé le:" Then Tabl(i + 1, 1) = ""
Next i
.Cells(LignDeb, Col).Resize(UBound(Tabl), 1) = Tabl
End With
End Sub


Le problème c'est que du coup dans les cases en dessous de "Taux horaire:" et "Total Matière Unitaire", j'ai des formules et ces formules disparaissent quand je fais tourner ma macro.
Les valeurs ne bouge pas mais les formules se font supprimer.....
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > Florian
 
Les valeurs ne bouge pas mais les formules se font suppr
Oui, car lorsque tu stockes le contenu de la colonne dans la variable tableau , tu n'en stockes que les valeurs :
Tabl = .Range(.Cells(LignDeb, Col), .Cells(DL, Col)).Value 

Si tu as des formules à conserver, il te faut procéder de manière tout à fait différente.

Regarde du côté de la méthode find, et particulièrement de la fonction personnalisée FindAll disponible ICI
0
Florian
 
Ok j'ai rien compris :D

Mais merci de ton aide, je vais essayer de me débrouiller.
0