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écallage du pointeur de trois case


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut décallage du pointeur de trois case
    Bonjour,

    Je me met progressivement au VBA sur Excel et je n'arrive pas à faire en sorte que d'une position de cellule, ma macro recalcule une autre position.

    Exemple :

    J'ai une macro qui cherche dans la zone E11:E40 pour chaque ligne si le mot est "nouveau".
    Alors la condition doit me recopier les cellules Bx : Dx de la ligne où il a trouvé "nouveau". (x étant le numéro de la ligne où "nouveau" est trouvé)

    Je vous donne le code de ma macro sachant que j'ai essayé de créer une variable (va) qui serait la valeur -3 de la valeur v, mais cela ne fonctionne pas.

    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
    24
    25
    26
    Dim LastLig As Long
    Dim v As Range, c As Range
     
    'zone où l'information doit être copiée - pour la zone "nouveau"
    With Sheets("bdd liste")
    Dim va As Range
     
        ' zone ou l'information doit être prise (source de l'information)
        For Each v In Sheets("PARAMETRAGE").Range("e11:e40")
            If v.Value = "nouveau" Then
                ' zone où la modificaiton doit avoir lieu
                 Set c = .UsedRange.Range("A400")
                If Not c Is Nothing Then
                va = v - 3
                    'nombre de colonnes concernée par la modification
                   c.Resize(1, 3).Value = va.Resize(1, 3).Value
                    Set c = Nothing
                End If
     
     
            End If
        Next v
    End With
     
    '
    End Sub
    Il y a un onglet "PARAMETRAGE" et un onglet "bdd liste", le premier contient les informations à recopier et le second est la destination des informations recopiés.

    J'espère que c'est clair dans l'explication.

    Merci d'avance.

  2. #2
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    bonjour, un exemple à adapter à tes besoins:
    le code parcours chaque cellule du range E11:E40, si il trouve "nouveau" il copie dans la feuille bdd "liste" à partir de A1 les cellules B à D de la ligne correspondante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    j = 1
    For Each v In Sheets("PARAMETRAGE").Range("E11:E40")
        If v.Value = "nouveau" Then
            Sheets("PARAMETRAGE").Range(Cells(v.Row, v.Column - 3), Cells(v.Row, v.Column - 1)).Copy Sheets("bdd liste").Range("A" & j)
            j = j + 1
        End If
    Next v
    End Sub
    tester avec excel 2010 sur win XP pro.

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Une autre manière pour parvenir au même résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    Sub Test()
    Dim i As Long
    Dim v As Range
        For Each v In Sheets("PARAMETRAGE").Range("E11:E40")
            If v.Value = "nouveau" Then
                i = i + 1
                v.Offset(0, -3).Resize(1, 3).Copy Sheets("bdd liste").Range("A" & i)
            End If
        Next v
    End Sub

    Cordialement.

  4. #4
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut
    Merci à vous deux car les deux fonctionnent, j'ai modifié le script pour avoir des recopies en valeur en cellule A400.

    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim i As Long
     
        For Each v In Sheets("PARAMETRAGE").Range("E11:E40")
            If v.Value = "nouveau" Then
                i = i + 1
                v.Offset(0, -3).Resize(1, 3).Copy
                Sheets("bdd liste").Select
                Range("A400").Select
                Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
                       False, Transpose:=False
            End If
        Next v
    Merci à vous deux.

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Une remarque : si tu as plusieurs fois “nouveau” dans ta liste les valeurs en ligne 400 seront écrasées.
    Un conseil : évite les « select » inutiles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Long
        For Each v In Sheets("PARAMETRAGE").Range("E11:E40")
            If v.Value = "nouveau" Then
                i = i + 1
                v.Offset(0, -3).Resize(1, 3).Copy
                Sheets("bdd liste").Range("A400").PasteSpecial Paste:=xlValues
            End If
        Next v
    Cordialement.

  6. #6
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut
    Oui c'est pour cela que j'ai inclus un tri après la recopie pour que je n'ai pas de valeur écrasée.

    Par ailleurs, j'ai un autre petit souci sur un bout de code que me modifier les cellules qui change en fonction du code "modifier".

    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
    Dim LastLig As Long
    Dim v As Range, c As Range
     
    Application.ScreenUpdating = False
    'zone où l'information doit être copiée - pour la zone "modifier"
    With Sheets("bdd liste")
        ' zone ou l'information doit être prise (source de l'information)
        For Each v In Sheets("PARAMETRAGE").Range("e11:e40")
            If v.Value = "modifier" Then
                ' zone où la modificaiton doit avoir lieu
                Set c = .UsedRange.Range("A:A").Find(v.Value, LookIn:=xlValues, LookAt:=xlPart)
                If Not c Is Nothing Then
                    'nombre de colonnes concernée par la modification
                    c.Resize(1, 4).Value = v.Resize(1, 4).Value
                    Set c = Nothing
                End If
            End If
        Next v
    End With
    Ce code fonctionne bien si on a les quatre colonnes à la suite de la cellule "modifier" par contre, ce sont les cellules des trois colonnes précédentes que je veux prendre en compte, comment dois je faire ?

    Merci pour ce nouveau retour.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/11/2007, 17h59
  2. modifier pointeur de la souris au survol d'une case
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/06/2005, 17h54
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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