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 :

Ecrire dans une feuille non active


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut Ecrire dans une feuille non active
    Est-il possible d'écrire dans une feuille non active?

    Parce que lorsque j'essaye ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30", Cells(30 + (DerLiTDC1 - PreLiTDC1), DerColTDC1 - 1)) = Donnees
    Sur une autre feuille que TDCPPA ça ne fonctionne pas et dès que je suis dessus ça marche.

    merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    rattache ton cells à sa feuille .... si tu ne le fais pas alors VBA va utiliser la feuille active par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("TDCPPA")
        .Range("A30", .Cells(30 + (DerLiTDC1 - PreLiTDC1), DerColTDC1 - 1)) = Donnees
    End With

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    ça ne change rien du tout. J'ai erreur d'exécution '1004': Erreur définie par l'application ou par l'objet.

    Exactement la même chose que quand je mets

    devant mon range

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    ma ligne de code fonctionne en l'état dans sa Structure
    passe en mode pas à pas, quand la macro plante met ta souris sur la ligne jaune et regarde les valeurs prises par :

    DerLiTDC1
    PreLiTDC1
    DerColTDC1

    histoire d'être sûr que tu ne vas pas sur une ligne et/ou colonne de numéro "0"

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    PreLiTDC1 =122
    DerColTDC1 =143
    DerLiTDC1 =6

    Mais je ne vois pas en quoi cela change quelque chose. Si mes valeurs étaient fausses ça ne marcherai pas non plus quand je me mets sur la feuille TDCPPA.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    ça ne te semble pas étrange d'avoir :

    - dernière ligne = 6
    - première ligne = 122

    ce qui donne dans ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30", Cells(30 + (DerLiTDC1 - PreLiTDC1), DerColTDC1 - 1)) = Donnees
    la plage suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30",Cells(30 + (6 - 122),143-21))
    Soit des lignes négatives ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    Pardon j'ai inversé c'est:

    PreLiTDC1 =122
    DerColTDC1 =6
    DerLiTDC1 =143

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    quel est le type de variable Donnees ?


    et plutôt que de faire un ping pong de questions/réponses ... ton code en entier nous aiderait à y voir un peu plus clair je pense

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    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
    27
    28
    29
    30
    31
    Sub test()
     
    Dim PreLiTDC1 As Long, DerLiTDC1 As Long, DerColTDC1 As Long, i As Long
    Dim Donnees()
    Dim Pvt1 As PivotTable
     
        Set Pvt1 = ActiveSheet.PivotTables("Tableau croisé dynamique1")
     
        PreLiTDC1 = Cells.Find("TOTAL LOTS").Row  'trouve la première ligne du TDC1
        DerColTDC1 = Pvt1.TableRange1.Columns.Count + 1 'trouve la Dernière colonne du TDC1
        DerLiTDC1 = Cells(PreLiTDC1 + 1, DerColTDC1 + 1).End(xlDown).Row 'trouve la dernière ligne du TDC1
     
        ReDim Donnees(DerLiTDC1 - PreLiTDC1, DerColTDC1 - 2) 'dimentionne la matrice qui récupèrera les données
     
        Donnees = Range("B122    ", Cells(DerLiTDC1, DerColTDC1))
     
        i = 1
        While Donnees(i, 1) <> "Total par année"
            If Donnees(i, 1) = "" Then Donnees(i, 1) = Donnees(i - 1, 1)
            i = i + 1
        Wend
     
        Sheets("TDCPPA").Range("A30", Cells(30 + (DerLiTDC1 - PreLiTDC1), DerColTDC1 - 1)) = Donnees
     
        Sheets("TDCPPA").PivotTables("TDC graph inter").SourceData = "TDCPPA!A30:" & Cells(30 + (DerLiTDC1 - PreLiTDC1) - 1, DerColTDC1 - 1).Address
     
        Sheets("TDCPPA").PivotTables("TDC graph inter").PivotCache.Refresh
     
     
     
    End Sub

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Si j'ai bien compris la finalité

    voici une légère retouche :

    - dans le calcul de tes lignes et colonnes
    - dans l'injection des données sur ton tableau
    - la restitution des données dans la feuille


    je te laisse :

    - modifier la "Feuil8" qui correspond à ma feuille de test, pour remettre ta feuille qui contient le TCD ==> c'est le fait de ne pas toujours rattacher ta feuille aux ranges que tu manipules qui posait ton problème
    - prendre en charge les deux dernières lignes du code, que je n'ai pas touché
    - tester et me dire si tu as encore des soucis

    j'ai crée un TCD basique (1 champs en ligne et 2 champs en colonnes)
    je récupère bien l'ensemble des données dans la feuille de destination ( à partir de la ligne 30) :

    - colonne A = la valeur du champs de ligne
    - colonne B = les données de ma seconde colonne de TCD
    - colonne C = les données de ma troisième colonne de TCD
    - etc...


    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
    27
    28
    Sub test()
     
    Dim PreLiTDC1 As Long, DerLiTDC1 As Long, DerColTDC1 As Long, i As Long
    Dim Donnees()
    Dim Pvt1 As PivotTable
     
        Set Pvt1 = Feuil8.PivotTables("Tableau croisé dynamique1")
     
        ' si c'est la ligne qui contient les étiquettes de ligne que tu cherche :
        PreLiTDC1 = Pvt1.RowRange.Row
        ' si c'est le nombre de colonnes qui composent le TCD (axe de lignes inclus)
        nbcoltdc1 = Pvt1.ColumnRange.Count + 1
        ' nombre total de lignes occupées par le TCD
        nbligtcd = Pvt1.TableRange1.Rows.Count - 1
        ' toutes les données du TCD dans ton tableau donnees
        Donnees = Feuil8.Cells(PreLiTDC1 + 1, 1).Resize(nbligtcd - 1, nbcoltdc1).Value
     
        i = 1
     
        While Donnees(i, 1) <> "Total par année"
            If Donnees(i, 1) = "" Then Donnees(i, 1) = Donnees(i - 1, 1)
            i = i + 1
        Wend
     
        Sheets("TDCPPA").Range("A30").Resize(UBound(Donnees, 1), UBound(Donnees, 2)).Value = Donnees
        'Sheets("TDCPPA").PivotTables("TDC graph inter").SourceData = "TDCPPA!A30:" & Cells(30 + (DerLiTDC1 - PreLiTDC1) - 1, DerColTDC1 - 1).Address
        'Sheets("TDCPPA").PivotTables("TDC graph inter").PivotCache.Refresh
    End Sub

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    Merci beaucoup j'ai juste utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30").Resize(UBound(Donnees, 1), UBound(Donnees, 2)).Value = Donnees
    et ça marche nickel. je connais pas du tout cette syntaxe.

  12. #12
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Resize permet de modifier un Range

    regarde l'aide à ce sujet

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Plage = Cells(1,1) ' la plage contient 1 cellule : A1
    Set Plage = Cells(1,1).Resize(2,1) ' la plage A1 est redimensionnée pour faire 2 lignes et une colonne soit : A1:A2
    Set Plage = Cells(1,1).Resize(2,2) ' la plage A1 est redimensionnée pour faire 2 lignes et deux colonnes soit : A1:B2
    Donc, comme tu dois injecter les données d'un tableau sur une plage :

    - on part de la première cellule d'écriture : Range("A30")
    - on la redimensionne avec le nombre de lignes du tableau (Ubound(Donnees,1)) et le nombre de colonnes du tableau (Ubound(Donnees,2))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30").Resize(UBound(Donnees, 1), UBound(Donnees, 2)).Value = Donnees

    dans ton propre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Donnees = Range("B122    ", Cells(DerLiTDC1, DerColTDC1))
    Outre les espaces après "B122" que je ne comprend pas ... ton B122 et le Cells(....) ne sont pas rattachés à une feuille ==> ta plage est donc située sur la feuille active (celle qui contient le TCD) et pas la feuille TDCPPA

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    dans ton propre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Donnees = Range("B122    ", Cells(DerLiTDC1, DerColTDC1))
    Outre les espaces après "B122" que je ne comprend pas ... ton B122 et le Cells(....) ne sont pas rattachés à une feuille ==> ta plage est donc située sur la feuille active (celle qui contient le TCD) et pas la feuille TDCPPA
    C'est juste un problème de copier coller.

    Merci beaucoup pour ces explications.



    Aujourd’hui j'ai un autre problème, qui est semblable, c'est de "cleanner" une plage pour pouvoir par la suite y remettre des données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("TDCPPA").Range("A30", Cells.SpecialCells(xlCellTypeLastCell)).Clear
    Je suis dans un autre onglet que TDCPPA. Mais du coup je ne peux pas utiliser la technique avec ubound et resize

  14. #14
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    les mêmes causes produiront toujours les mêmes effets

    j'ai à plusieurs reprises dans cette discussion alerté sur le fait que tu ne rattaches pas tes cells à leur feuille


    si tu dois Supprimer dans la feuille "TDCPPA" la plage débutant en A30, alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("TDCPPA")
        .Range(.Cells(30, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Clear
    End With

  15. #15
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    J'ai trouvé une solution à force de me retourner la tête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        y = Sheets("TDCPPA").Cells.SpecialCells(xlCellTypeLastCell).Row - 30
        z = Sheets("TDCPPA").Cells.SpecialCells(xlCellTypeLastCell).Column
        Sheets("TDCPPA").Range("A30").Resize(y, z).Clear
    Y a-t-il plus propre comme méthodes?

    Merci d'avance

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 277
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    les mêmes causes produiront toujours les mêmes effets

    j'ai à plusieurs reprises dans cette discussion alerté sur le fait que tu ne rattaches pas tes cells à leur feuille


    si tu dois Supprimer dans la feuille "TDCPPA" la plage débutant en A30, alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("TDCPPA")
        .Range(.Cells(30, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Clear
    End With

    Je pensais que mettre sheets("TDCPPA") devant mon range "incluait" cela dans le range.

    Merci encore pour tes réponses.

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

Discussions similaires

  1. Utilisation du solver dans une feuille non active
    Par JonSnow dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/05/2010, 14h27
  2. test sur une checkbox dans une feuille non active
    Par diude54 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/08/2009, 22h29
  3. ecrire dans une feuille non active d'excel
    Par baboo50 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/08/2007, 11h37
  4. [VBA-PP]Ecrire dans une feuille Excel
    Par alpking dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 27/04/2006, 18h18
  5. [VBA - E2003] Ecrire dans une feuille deplacement ?
    Par Slumpy dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/04/2006, 19h19

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