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 :

Décaler si cellules vides [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 465
    Par défaut Décaler si cellules vides
    Bonjour,
    C'est encore moi pour le dernier problème que j'ai dans mon projet.
    J'ai dans ma feuille 2 un nombre indéterminé de lignes et une plage allant de A à I.

    Les colonnes B,C et D sont des adresses (Adresse 1, Adresse2, Adresse 3).
    Le problème est qu'il arrive que B et C ne soient pas remplies mais que la cellule de la colonne D contiennent l'adresse. Il arrive également que B et D soient remplies et pas C.
    Ce que j'aimerai c'est que tout soit automatiquement décalé à gauche c'est à dire que B soit rempli puis C puis D.

    Merci d'avance!

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 465
    Par défaut
    Je viens par contre de trouver un cas ou ça ne fonctionne pas:
    Si B et C sont vides mais D rempli, le contenu de la colonne D ne se met pas dans B...

  3. #3
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    alors voila
    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
     
     
     
    Dim R as integer
    R=0
    do while range("A1").offset(r,0)<>""
        if range("B1").offset(r,0)="" then
            if range("C1").offset(r,0)="" then range("C1").offset(r,0)=range("D1").offset(r,0)
            range("B1").offset(r,0)=range("C1").offset(r,0)
            range("C1").offset(r,0)=""
            if range("D1").offset(r,0)<>"" then 
                range("C1").offset(r,0)=range("D1").offset(r,0)
                range("D1").offset(r,0)=""
            End if
        else
            if range("C1").offset(r,0)="" then 
                range("C1").offset(r,0)=range("D1").offset(r,0)
                range("D1").offset(r,0)=""
            end if
        end if
        r=r+1
    loop
    PS: je fait ça à chaud... sorry pour les petites coquilles

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    j'ai bien peur mayekeul qu'il y ait encore des loupés avec ton dernier code …

    Sinon voici une approche plus simple :
    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
    Sub Demo()
        Application.ScreenUpdating = False
     
        With [A1].CurrentRegion
            For R& = 1 To .Rows.Count
                N& = Application.CountA(.Rows(R).Columns("B:D"))
     
                If N = 1 And .Cells(R, 2).Value = "" Then
                    .Cells(R, 3 - (.Cells(R, 3).Value = "")).Cut .Cells(R, 2)
     
                ElseIf N = 2 And .Cells(R, 4).Value > "" Then
                    C& = 3 + (.Cells(R, 2).Value = "")
                    .Cells(R, C + 1).Resize(, 4 - C).Cut .Cells(R, C)
                End If
            Next
        End With
     
        Application.ScreenUpdating = True
    End Sub
    S'il y a une ligne de titre, commencer alors à 2 la boucle de la ligne n°5 …


    Voici un code plus véloce à l'aide d'une variable tableau :
    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
    Sub SpeedDemo()
        TS = [A1].CurrentRegion.Columns("B:D").Value
        N& = UBound(TS)
     
        For R& = 1 To N
            For C& = 2 To 1 Step -1
                If TS(R, C) = "" And TS(R, C + 1) > "" Then
                   TS(R, C) = TS(R, C + 1):  TS(R, C + 1) = ""
                   If C = 1 And TS(R, 3) > "" Then TS(R, 2) = TS(R, 3): TS(R, 3) = ""
                End If
            Next C
        Next R
     
        [B1:D1].Resize(N).Value = TS
        Erase TS
    End Sub

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  5. #5
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    oui effectivement

    on pourrait aussi faire comme ça
    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
     
    dim rng as range
    dim tmp as string
    dim addresses() as string
    dim c as integer
     
    for each rng in range("a1:a65000").specialcells(xlcelltypeconstants)
        with rng
            tmp = _
                trim(rng.text) & "|" & _
                trim(.offset(0, 1).text) & "|" & _
                trim(.offset(0, 2).text) & "|" & _
                trim(.offset(0, 3).text)
            tmp = replace(tmp, "||", "|")
            addresses = split(replace(tmp, "||", "|"), "|")
            rng.entirerow.range("a1:d1").clear
            for c = 0 to ubound(addresses)
                rng.offset(0, c) = addresses(c)
            next c
        end with
    next rng

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Ah non, là c'est l'usine !

    Du genre : Pourquoi faire simple quand on peut compliquer ? …


  7. #7
    Membre éclairé
    Inscrit en
    Avril 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 465
    Par défaut
    Encore une fois ça marche parfaitement!
    1000 mercis à vous 2!

  8. #8
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    tout de suite les grand mots

    sans savoir comment il importe les données, on pourrait aussi faire ça par exemple

    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
     
    with activesheet.querytables.add(connection:= _
            "text;c:\doc.txt", _
            destination:=range("$a$1"))
            .name = "doc"
            .fieldnames = true
            .rownumbers = false
            .preserveformatting = true
            .textfileparsetype = xldelimited
            .textfiletextqualifier = xltextqualifierdoublequote
            .textfileconsecutivedelimiter = true
            .textfilesemicolondelimiter = true
            .refresh backgroundquery:=false
    end with
    activeworkbook.connections("doc").delete
    plus ou moins quoi...

    bon ben si ça marche, je dis plus rien alors

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction Décaler - en cas de cellules vides
    Par krietj dans le forum Excel
    Réponses: 4
    Dernier message: 16/03/2015, 22h18
  2. [XL-2010] Supprimer les cellules vides d'une plage aléatoire et décaler à gauche
    Par ketum88 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/08/2011, 18h36
  3. Excel - Cellule vide en effectuant la somme
    Par spopo dans le forum Excel
    Réponses: 14
    Dernier message: 31/08/2005, 16h05
  4. Problemes avec des cellules vides
    Par arsgunner dans le forum ASP
    Réponses: 7
    Dernier message: 14/06/2004, 08h42
  5. [XSL-FO] Table avec cellule vide
    Par JustAGphy dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/05/2004, 14h11

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