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 :

Numéro de page [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Numéro de page
    Bonjour à tous!

    Ceci est mon premier post sur ce forum. Je l'ai découvert il y a deux semaines, quand je cherchais des infos sur quelques méthodes et sources VBA. Donc déjà, merci pour les posts et autres fiches qui m'ont bien aidé.

    Je suis en train de faire une macro pour parcourir les sous-dossiers d'un dossier, puis les fichier, puis les ouvrir et copier des champs spécifiés au préalable par l'utilisateur. Ca avance, j'en vois bientôt le bout, mais là en phase de test j'ai eu un résultat étrange:
    la copie d'une valeur nulle (enfin, ça a copié "rien", comme si le champ ne contenait rien dans le fichier "n" ouvert).

    Alors bon, vu le nombre de fichiers, il se peut qu'un fichier source ne contienne rien dans le champ spécifié, et donc que ça colle en effet "rien" dans le fichier récap.
    Cependant, je soupçonne une autre source du problème:

    Quand je demande à l'utilisateur de sélectionner un champ à relever sur un fichier exemple, je sauvegarde l'adresse du champ et l'index de sa Sheet.
    Quand j'ouvre un fichier du lot de fichiers à explorer, je vais dans chaque Sheet associée à chaque champ, je copie le contenu du champ associé, puis je le colle dans le Workbook recap.
    MAIS!
    Il se trouve que certains fichiers sources commencent avec le focus sur une page différente: une fois ce sera la n°1 (PRODUIT), l'autre la n°2 (PROCESS).


    Ma question est la suivante:
    Quand je relève l'index de page quand l'utilisateur clique sur un champ de cette page, l'index dépend-il de la page en focus à l'ouverture?
    Petite image pour illustrer (la page en focus est celle à l'ouverture)
    Nom : index.png
Affichages : 100
Taille : 6,6 Ko

    Ca expliquerait qu'il aille chercher le contenu d'une cellule effectivement vide dans l'autre page.

    (Question bonus: le focus à l'ouverture dépend de quoi? de la dernière page en focus quand on a fermé ledit fichier? De l'ordre de création des pages (si on a bougé la position de la première page créée par exemple)?)

    Merci d'avance pour vos réponses et suggestions.

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,

    Je répond de suite à ta question bonus : cela dépend du dernier onglet lors de la dernière sauvegarde de ton fichier Excel (sauf erreur de ma part).

    Pourquoi te baser sur le focus et non sur le nom de tes onglets, plutôt ? Ce ne serait pas plus fiable ?

    Après, tu as aussi l'option que comparé les en-têtes de colonnes de tes sheets mais cela ralentit un peu le code...

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Tout d'abord merci de ta réponse.

    Voilà le bout de code lors de la saisie:

    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
     
    Dim NouveauChamp As New champ
    Dim FichierChamp As FileDialog
    Dim RangeTemp As Range
    Dim wsTemp As Worksheet
     
    MsgBox "Veuillez sélectionner le fichier dans lequel relever le champ à copier", vbOKOnly
    Set FichierChamp = Application.FileDialog(msoFileDialogFilePicker) 'demande de sélectionner un fichier à ouvrir
    FichierChamp.Show
     
    Workbooks.Open FichierChamp.SelectedItems(1) 'Ouvre le fichier sélectionné
     
    Set RangeTemp = Application.InputBox("Sélectionnez une cellule à relever", Type:=8) 'demande de sélectionner une cellule à copier
    Set wsTemp = ActiveWorkbook.ActiveSheet
     
    'Créer un objet champ et l'ajoute à la liste
    NouveauChamp.champ = RangeTemp.Address
    NouveauChamp.pageOrigine = wsTemp.Index
     
    Champs.Add NouveauChamp
     
    Workbooks(ActiveWorkbook.name).Close
     
    Set RangeTemp = Nothing
    Set wsTemp = Nothing
    Pour que Set wsTemp = ActiveWorkbook.ActiveSheet ne se base pas sur le focus, y a-t-il une méthode pour avoir la Sheet (ou l'index de la Sheet) du Range renvoyé par l'InputBox?
    Car c'est vrai que si c'est possible, ça m'éviterait des ennuis (voir même ça m'éviterait la classe champ).

    Oui je suis assez prompt à créer des classes à cause de mes bases en java

  4. #4
    Membre régulier
    Homme Profil pro
    Apprenti GEII
    Inscrit en
    Janvier 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti GEII
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2014
    Messages : 83
    Points : 109
    Points
    109
    Par défaut Bonjour
    La méthode WorkBooks("NomTonWorkbook").Sheets("PRODUIT") te permet de t’aiguiller systématiquement sur la fiche "PRODUITS"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WorkBooks("NomTonWorkbook").Sheets("PRODUIT").'range, cells, ect
    En plus si tu te bases sur l'ActiveSheet c'est incertain... A moins de la sélectionner juste avant mais ça alourdirait ton code pour rien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WorkBooks("NomTonWorkbook").Sheets("PRODUIT").Select
    WorkBooks("NomTonWorkbook").ActiveSheet

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Soit, mais si le champ est dans PROCESS, ou même dans un autre nouvel onglet, je ne le saurais pas. Je ne peux donc pas déclarer explicitement la Sheet associée au Range relevé, il faut que ce soit lié à cette opération de sélection par l'utilisateur.

    En résumé, c'est pour récupérer la Sheet dans laquelle l'utilisateur clique que j'utilise ActiveSheet.
    Le soucis c'est que je ne peux pas utiliser le résultat de l'InputBox car c'est un Range qui est retourné, et qu'a priori je n'ai pas de méthode Range("LeRange").LaPageD'OùIlVient.

    Je vais faire du test et si je retrouve cette erreur je ferais un .Activate lors de la saisie...

    Merci en tout cas de vos réponses

    Edit: en fait je pourrais même pas faire de .Activate car ça revient au même problème: .Activate de quelle sheet?

  6. #6
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Hello !

    Si tu récupère une range, tu récupère pleins d'informations (cf. la touche F1) :
    • L'addresse : $A$1:$B$2
    • Le worksheet : range.worksheet
    • Le workbook : via le worksheet => worksheet.parent


    Je n'ai relu ton topic mais je pense qu'avec cela, tu devrais pouvoir faire quelque chose.
    Sinon, il te faudrait revoir, à mon avis, la structure de tes tableaux pour avoir, le nom de la worksheet dans lequel tu dois aller dans une cellule, puis le nom du de l'en-tête de colonne.
    Ou alors, faire un contrôle des en-têtes de colonnes que tu as, dans chaque worksheets du workbook ouvert mais, comme indiqué précédemment, cela peut prendre un peu de temps sur le traitement, selon la quantité de colonnes.

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Ah effectivement il y a une méthode .worksheet! Je vais m'empresser de l'utiliser ça me sera assez utile.
    Pour ce qui est de la colonne, en effet, je m'en suis rendu compte en voulant implémenter le collage. A la base je voulais juste reprendre la même adresse, puis coller vers le bas à la première cellule disponible, mais en fait ça n'allait pas être très lisible...

    Du coup je me baserait sur une Collection d'objets Range (et plus Champ, classe d'objet devenue assez inutile), et à chaque Range je demanderait sa Sheet puis son Address.
    Je copie la Value, puis la colle dans une colonne C à la première cellule disponible.

    Il faut "juste" maintenant que je mette un bout de code pour que l'utilisateur définisse dans quelle colonne C il veut coller quand il définit un champ à copier. Ca doit se baser aussi sur un InputBox de type 8, je pense a priori ne pas avoir de problème pour ça.

    Merci de vos réponses!


    Edit: Eh ben en fait je garde ma classe Champ, mais elle a comme attribut le Range, auquel on demande la Sheet et l'Address, une autre propriété dont j'ai besoin pour différencier les données (une variable prenant deux valeurs, selon le type de fichier), et ladite colonne spécifiée par l'utilisateur

    A priori c'est résolu, enfin, sur le papier, il faut encore que je teste.

    Edit 2:
    Résolu, la méthode Range.Worksheet est plutôt sympa. Il y a juste un truc dommage, c'est que si je veux écrire UnWorkbook.UneWorksheet.UnRange.Copy, l'expression d'UneWorksheet ne peut pas être [RangeDonné.Worksheet] (ce qui est assez intuitif à comprendre), mais ça doit être Worksheets(RangeDonné.Worksheet.name). Ca fait un peu lourd comme syntaxe, mais ça marche.

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

Discussions similaires

  1. [VBA-W]Récupérer le numéro de page
    Par perdix dans le forum VBA Word
    Réponses: 4
    Dernier message: 31/07/2007, 09h54
  2. [VBA-W]Numéro de page des titres d'un document Word
    Par bonigo dans le forum VBA Word
    Réponses: 9
    Dernier message: 07/04/2006, 18h22
  3. [VBA-E] Numéro de page
    Par franckh99 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/03/2006, 18h04
  4. Pas de numéro de page sur la première page (titre)
    Par szdavid dans le forum Mise en forme
    Réponses: 3
    Dernier message: 12/08/2005, 11h29
  5. Quickreport et numéro de page
    Par Tsimplice dans le forum Bases de données
    Réponses: 3
    Dernier message: 30/06/2005, 17h48

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