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

4 réponses

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

    Voilà l'exemple de fichier.
    1
    1. Florian
       
      Mais le vrai fichier fais 20.000 lignes environ.....
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    1. Florian
       
      Merci c'est super.
      0
  3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    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
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    1. 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
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > 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
    2. 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
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > 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
    3. Florian
       
      Ok j'ai rien compris :D

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