HELP! VB excel : lire le contenue d'une colonne [Résolu]

Signaler
Messages postés
20
Date d'inscription
vendredi 17 mars 2006
Statut
Membre
Dernière intervention
21 mai 2008
-
Messages postés
20
Date d'inscription
vendredi 17 mars 2006
Statut
Membre
Dernière intervention
21 mai 2008
-
Bonjour à tous.
Dans une feuille j'ai tous les chiffres classés par semaine (chaque colonne correspond à une semaine). Dans une seconde feuille, je veux récupérer certain chiffres qui ne correspondent qu'a une semaine. Manuellement, pour mettre à jours les chiffres qui m'intéressent, je me mets sur la seconde feuille, je fais un "Remplace" puis je change dans mes formules "!J" par "!K" par exemple. Tous les chiffres se mettent alors à jours.

Maintenant j'aimerais créer une macro pour ça. Enfin 2 pour être exacte : une pour passer à la semaine suivant et l'autre pour revenir à la semaine précédente.
Il y a 13 semaine. La 1 correspond à la colonne D et la 13 à P.

Je ne sais pas si cela est difficile à faire. Merci pour votre aide!

4 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Salut,


Voici 2 méthodes.

La première consiste à copier une formule. Ça peut toujours servir...

La deuxième consiste à copier directement les données en valeur.


Tu places 2 boutons sur la feuille où tu veux récupérer les données. Ça
va modifier le numéro de semaine inscrit en B1. Donc un bouton Suivant
et un Précédent auxquels tu affectes les macros relatives.


Option Explicit


Sub Suivant()

    If Range("B1") > 12 Then

        Range("B1") = 1

    Else

        Range("B1") = Range("B1") + 1

    End If

   

    Call Formules

End Sub


Sub Précédent()

    If Range("B1") < 2 Then

        Range("B1") = 13

    Else

        Range("B1") = Range("B1") - 1

    End If


    Call Formules

End Sub


Sub Formules()

    Dim nbLignes As Long 'Nombre de lignes de données à lire

    Dim Colonne As Integer 'Colonne qu'on veut lire

    Dim Adresse

   

    Columns("A").ClearContents ' vider les données précédentes au préalable

    Colonne = Range("B1") + 3 '1ere semaine équivaut à la colonne 4 (D)

   

    'Adresse non-absolue pour la formule (sans $)

    Adresse = Cells(1, Colonne).AddressLocal(False, False)

   

    'Nombre de lignes de données à lire

    nbLignes = Sheets("Feuil1").Cells.Find("*", Sheets("Feuil1").Range("A1"), , , xlByRows, xlPrevious).Row

   

    Range("A1:A" & nbLignes).Formula = "=Feuil1!" & Adresse

End Sub


Une autre méthode plus simple serait de copier les données de la Feuil1 et de les coller en valeur dans la Feuil2

Sheets("Feuil1").columns(Colonne).select

Selection.copy

Range("A1").pastespecial

MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Pourrais-tu écrire la formule que tu utilises pour récupérer les données qui t'intéressent.

Ce serait plus simple que de te donner un bout de code qui ne servirait à rien...


Le principe que je vois, tu as 2 boutons "Suivante" et "Précédente".

Sur Click, tu incrémentes une valeur (indice de semaine) dans une cellule, disons B1

Si ça dépasse 13, ça devient 1

Même principe pour l'autre bouton pour s'assurer que la valeur soit de 1 à 13.


Il reste à implémenter ta formule avec cette valeur directement dans la macro

Range("A2:A" & nbLignes).Formula = "TaFormuleEnAnglais"
Et là, tu remplaces l'index de colonne de "TaFormuleEnAnglais" par

" & Range("B1") & "


Pour utiliser ta formule en français tout comme dans la cellule, tu peux utiliser FormulaLocal plutôt que Formula

Tu ne pourras pas, cependant, la faire fonctionner sur un système anglais.

MPi
Messages postés
20
Date d'inscription
vendredi 17 mars 2006
Statut
Membre
Dernière intervention
21 mai 2008

Alors pour récupérer les données qui m'intéressent, je l'ai fait manuellement : je me suis mis sur la feuille récapitulatif, je me suis placé sur la bonne cellule, puis "=", puis je suis allé cliquer sur la cellule correspondante dans l'autre feuille (du même workbook), validation par enter.

Lorsque que j'enregistre la macro qui consiste à cliquer sur Edit/remplace puis valider sur "remplace all", voila la ligne de commande que j'ai :

Cells.Replace What:="!P", Replacement:="!D"

Je crois que je suis parti un peu sur la même idée que toi MPi, et voila ce que j'ai tapé :

If Worksheets("recapitulatif SSL call").Range("H3").Value = "D" Then
    Cells.Replace What:="!D", Replacement:="!E"
    Worksheets("recapitulatif SSL call").Range("H3").Value = "E"
    Worksheets("recapitulatif SSL call").Range("H2").Value = "2"
End If

If Worksheets("recapitulatif SSL call").Range("H3").Value = "E" Then
    Cells.Replace What:="!E", Replacement:="!F"
    Worksheets("recapitulatif SSL call").Range("H3").Value = "F"
    Worksheets("recapitulatif SSL call").Range("H2").Value = "3"
End If

Et ainsi de suite pour toutes les 13 lettres. En cellule H3 il y la lettre qui correspond à la colonne et en  H2, le numéro de la semaine qui correspond.

Le gros souci, ce qui est évident en fait, c'est que tout le code s'execute d'un seul coup, puisque D est remplacé par E qui est immédiatement remplacé par F etc... Moi je voudrais que chaque "bloc" qui commence à If et se termine à End if soit exécuté au moment du click sur le bouton. Il faudrait donc faire des pauses à chaque End if, puis que l'exécution du code reprenne seulement au prochain click sur le bouton.
Est-ce possible ? Si vous avez d'autres idées de codes, je suis ouvert...

Encore merci de l'aide.
Messages postés
20
Date d'inscription
vendredi 17 mars 2006
Statut
Membre
Dernière intervention
21 mai 2008

Yes!! Ca marche!
Merci beaucoup MPi

Je me suis servi de tes sub Suivant et Précédent par contre j'ai gardé la formule Cells.Replace What:="!P", Replacement:="!D"  pour la suite du code. Au final le code est bien long, il y avait sans doute plus simple, mais bon, ça marche donc c'est good.