IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Test cases vide + Effacement


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut Test cases vide + Effacement
    Bonjour la communauté !

    Je vous préviens je suis totalement débutant en la matière...Mais bon je m'adapte vite =p

    Bref...voici mon problème. J'ai besoin de formatter un fichier CSV que Trés mal organisé. J'ai trouver un moyen (en enregistrant une macro) de réaliser 90% du travail que je veux faire (Deux trois réglage, des suppressions de colonnes...). Dernier point de mon formatage serais de tester les case des colonne B et C de chaque ligne

    Exemple 1 : Si la Case B2 ou la case C2 est vide faire --> Récupérer les données de la case B2 et les écrire a la suite du contenu de la case B1 et supprimez cette ligne entière) etc ...

    Exemple 2 : Si la Case B3 ou la case C3 est vide faire --> Récupérer les données de la case B3 et les écrire a la suite du contenu de la case B2) etc ... etc etc...


    Si vous avec des piste pour que je puisse trouver la solution ou encore mieux un bout de code =p je suis preneur !

    Merci de vos futurs réponses.

  2. #2
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Points : 173
    Points
    173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i=2 to 65536
        if isempty(cells(i,2)) or isempty(cells(i,3)) then
            cells(i-1,2).text=cells(i-1,2).text & cells(i,2).text
            rows(i).delete
            i=i-i
        endif
    next

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut
    Ah ben merci

    Ce qu'il ya après le then correspond au remplacement du contenu c'est bien sa ? Il prend le contenu de la cellule qui est au dessus et concatene avec l'actuelle puis supprime la ligne avec "rows(i).delete"

    Great

    Bon j'ai essayer d'utiliser ce code, J'ai une erreurs qui se situe sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i - 1, 2).Text = Cells(i - 1, 2).Text & Cells(i, 2).Text
    il me dit :

    "Run-time error '450'
    Wrong number of arguments or invalid property assignment"

    Parle t'il du code ou de ce qu'il lit dans le tableau ?

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par blinkman04 Voir le message
    Bon j'ai essayer d'utiliser ce code, J'ai une erreurs qui se situe sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i - 1, 2).Text = Cells(i - 1, 2).Text & Cells(i, 2).Text
    il me dit :

    "Run-time error '450'
    Wrong number of arguments or invalid property assignment"

    Parle t'il du code ou de ce qu'il lit dans le tableau ?
    Essaie de modifier la propriété Value et non la propriété Text.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i - 1, 2).Value = Cells(i - 1, 2).Value & Cells(i, 2).Value
    Cordialement

    Docmarti.

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Points : 173
    Points
    173
    Par défaut
    Désolé d'avoir balancer du code comme ça, j'étais sur le départ.

    Donc oui, la formule Cells(i - 1, 2).Text = Cells(i - 1, 2).Text & Cells(i, 2).Text concatène les textes de chaques cellules dans la 1ere ( "chaine 1" & "chaine 2" devient "chaine 1chaine 2").

    Remplace text par value si ça ne fonctionne pas, normalement text fonctionne mais value fonctionne tout aussi bien (text renvoie le contenu de la cellule en texte tandis que value renvoie le contenu dans le type qui correspond, par ex les nombres sont renvoyés en nombre, les dates en date...).

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut
    Effectivement je n'est plus d'erreurs, mais sa me fait planter excel...

    Voila mon code entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub testEffacement1()
              Dim i As Integer
              i = 2
              for i=2 to 30
        if isempty(cells(i,2)) or isempty(cells(i,3)) then
            cells(i-1,2).Value=cells(i-1,2).Value & cells(i,2).Value
            rows(i).delete
            i=i-i
        endif
    next i
    End Sub
    Sa tourne dans le vide et quand je suis sur la fenêtre du tableau mon curseur switch entre souris et croix de tableur... Boucle infinie on dirais ?

    Ahah pas de soucis d'ailleurs il faudrait que je pense a partir manger un jour...

    S sa peux vous aider voici en gros (J'ai masqué les valeur hein ...) le début et le résultat recherché , si sa peut vous aider ^^

  7. #7
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Points : 173
    Points
    173
    Par défaut
    Alors, oui, ça peut boucler si les dernières lignes sont toutes vides. une correction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub testEffacement1()
        Dim i As Integer
        Dim Boucle as boolean
     
        Boucle=false
        'i = 2 inutile, tu le répètes après
        for i=2 to 30
        if (isempty(cells(i,2)) or isempty(cells(i,3))) and not Boucle then
            cells(i-1,2).Value=cells(i-1,2).Value & cells(i,2).Value
            rows(i).delete
            i=i-i
            Boucle=true
        Else
            Boucle=false
        endif
    next i
    End Sub
    En fait ce genre de boucle est pas adapté, si tu as plusieurs lignes de suite à traiter ça marchera mal, en en sautant une sur deux. Je refait un truc.

    Désolé je peux pas regarder ton fichier, politique de réseau de ma boite :p

    Ceci devrait être mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub Effacement()
     
        Dim i As Byte
        Dim j As Byte
        Dim tmp as Byte
        Dim listelignes() As Byte
     
        j = 0
        For i = 2 To 30
            If (IsEmpty(Cells(i, 2)) Or IsEmpty(Cells(i, 3))) And Not Boucle Then
                Cells(i - 1, 2).Value = Cells(i - 1, 2).Value & Cells(i, 2).Value 'on concatène les valeurs
                listelignes(j) = i
            End If 'on liste la ligne comme à supprimer
        Next
     
        tmp = 0
        For i = 0 To j
           Rows(listelignes(i) - tmp).Delete 'on supprime la ligne
           tmp = tmp + 1 'on décale de 1 à chaque suppression car les lignes remontent
        Next
     
    End Sub

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut


    Un screenshot peut être ? ^^ La premiere partie c'est avant le traitement et la deuxième partie c'est la forme a laquelle je voudrais arriver.

    La 1ere solution boucle encore, la 2e me met une erreur runtime 9 "Subscript out of range", c'est peut être moi qui est mal fait quelque chose ? Y'a t'il des choses avec lesquelles il faut faire attention avec VBA ?

    Erreur sur listelignes(j) = i , d'apres le débug..

    Ce qui m'embete c'est que je sert pas a grand chose la ! C'est vous qui travaillez ! Bon j'avoue que c'est peut la seul fois de ma vie que je vais avoir besoin de sa mais bon... Merci pour votre aide en tout cas !

  9. #9
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Points : 173
    Points
    173
    Par défaut
    Rajoute au tout début du module macro :

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut
    En dehors de la sub comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Base 0
    Sub Effacement()
     
        Dim i As Byte
        Dim j As Byte
        Dim tmp As Byte
        Dim listelignes() As Byte
     
        j = 0
        For i = 2 To 30
            If (IsEmpty(Cells(i, 2)) Or IsEmpty(Cells(i, 3))) And Not Boucle Then
                Cells(i - 1, 2).Value = Cells(i - 1, 2).Value & Cells(i, 2).Value 'on concatène les valeurs
                listelignes(j) = i
            End If 'on liste la ligne comme à supprimer
        Next
     
        tmp = 0
        For i = 0 To j
           Rows(listelignes(i) - tmp).Delete 'on supprime la ligne
           tmp = tmp + 1 'on décale de 1 à chaque suppression car les lignes remontent
        Next
     
    End Sub
    Ci c'est comme sa j'ai toujours l'erreur, mais je google ce que signifie vraiment cette erreur ^^

    e faisait des petits test pour comprendre et je suis tomber sur un truc étonnant.. Pourquoi quand je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub Effacement()
        Dim i As String
     
          i = Cells(3, 3).Select
     
        'Boîte de dialogue
       MsgBox i
    End Sub
    I = True ? Et pas le contenu de ma case ?|


    Autant pour moi c'est logique fallait que je mette un Value xD

    Bon j'ai trouvé comment enlever l'erreurs l'algo est pas bon mais j'ai une bonne base pour travailler merci !

  11. #11
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut test case vide + effacement
    bonsoir,

    il conviendrait de faire une boucle décrementé du fait de la suppression de lignes.

    il semble que cela fonctionne avec le premier code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub testEffacement1()
    Dim i As Integer
    Dim longueur As Long
    longueur = 30
    For i = longueur To 1 Step -1
        If IsEmpty(Cells(i, 2)) Or IsEmpty(Cells(i, 3)) Then
            Cells(i - 1, 2).Value = Cells(i - 1, 2).Value & Cells(i, 2).Value
            Rows(i).Delete
        End If
    Next i
    End Sub
    bien entendu longueur doit être déterminé avec l'instruction classique

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut
    Effectivement, l'algo n'est pas bon mais je suis déjà bien avancé car c'est la premiere fois que je touche a du VBA...

    Je vais essayer de coucher tout ça sur le papier pour commencer

    EDIT : J'ai testé ton code c'est presque ca ! (Tu ensoleille mon Lundi la ! ahah)
    Je vais m'y pencher mais il manque juste a rajouter quelque chose pour que il efface aussi les lignes où les colonnes avec B vide et C avec un montant soit effacé et laje suis aux anges Merci les gars vraiment !

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 67
    Points : 38
    Points
    38
    Par défaut
    Bon j'ai avancé un peu mais je vien de découvrir que les ligne qu'il ne m'effacais pas c'était normal ! Elle ne sont pas vide mais pleine d'espace...

    Donc simple je voudrais juste trouver une fonction qui me récupère par exemple les 5 premiers caracteres et si ces 5 premiers sont différents de " " alors hop je delete !

    J'ai bien trouvé la fonction Mid mais je n'arrive pas inclure correctement..

    Je voulais un truc comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mid(Cells(j, 2)), 1, 5)
    Mais ce n'est pas accepté apparement...Connaissez vous une alternative ? Merci

Discussions similaires

  1. Réponses: 15
    Dernier message: 03/12/2019, 11h42
  2. Test d'une case vide
    Par WarZonX dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 11/03/2010, 19h34
  3. Case vide dans un tableau
    Par argon dans le forum C
    Réponses: 12
    Dernier message: 17/09/2006, 17h18
  4. [VBA]Test cellule vide base access
    Par ALAMARQU dans le forum VBA Access
    Réponses: 4
    Dernier message: 17/03/2006, 16h14
  5. [XSL -PHP] Test si vide... et première valeur inférieure
    Par mamat- dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 06/08/2005, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo