Problème lors de la creation d'une nouvelle page excel (4eme page) [Résolu]

Signaler
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour à tous,

J'ai realisé un prog qui gère un classeur excel, il permet d'ouvrir un classeur et de créer des pages afin d'écrire dessus.
Mon problème est que lors de la création du fichier excel, il y a 3 feuilles (par défaut) qui sont présentes mais lorsque je veut écrire sur la 4 eme feuille qui n'existe pas encore, mon programme me dit "Erreur d'execution '9' indice en dehors de la plage ??

Pourtant j'utilise une fonction qui permet de creer des nouvelles pages qui est :

VariablePage = VariablePage + 1
        MsgBox (VariablePage)
        a.Workbooks.Add
        With a.ActiveWorkbook.Worksheets(VariablePage)
        End With

Quelqu'un aurait une idée ?
Jack.

16 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Dans ton bout de code, tu fais 2 Add
        Set oSh = Sheets.Add                                        
        Sheets.Add.Name = VariablePage

Essaie plutôt comme ceci
oWk.Sheets.Add After:=Sheets(Sheets.Count) 'partie en bleu pour la placer à la fin
Set oSh = ActiveSheet
oSh.Name = "NomDeBase" & VariablePage

Et quand tu as besoin
oSh.Activate
ou
Sheets(oSh.Name).Activate
ou
Sheets("NomDeBase" & VariablePage).Activate

Bien sûr, si tu crées plusieurs pages, oSh va équivaloir à la dernière feuille créée.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
salut,

        With a.ActiveWorkbook.ActiveSheet

là tu ne devrais plus avoir de problème.
Le mieux, serait parès insertion de cette nouvelle feuille, de la renommer, comme ça pour la reselectionner au besoin, tu gères avec le nom de la feuille et non plus l'indice

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Re salut,

J'ai testé la manière que tu m'indiquait mais j'ai toujours le message d'erreur qui revient.

Voilà ce que j'ai fait :

 VariablePage = VariablePage + 1
        MsgBox (VariablePage)
        a.Workbooks.Add
        With a.ActiveWorkbook.ActiveSheet
        End With
        LigneVide = oWk.Sheets(VariablePage).Cells(Rows.Count, "A").End(xlUp).Row + 1
        oWk.Sheets(VariablePage).Range("A" & LigneVide) = Text2
       
Le débogage m'indique la ligne :

LigneVide = oWk.Sheets(VariablePage).Cells(Rows.Count, "A").End(xlUp).Row + 1

Je ne comprend vraiment pas pourquoi ??
Jack.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
C'est quoi a ? et oWk ?
Si tu donnais tout le code avec les DIM et la façon dont tu crée le lien avec Excel, ce serait plus facile.

De plus, tu écris ceci qui ne sert absolument à rien
        With a.ActiveWorkbook.ActiveSheet
        End With

Lorsque tu as un message d'erreur, donne le numéro et la description de cette erreur. Ce sera aussi plus facile de t'aider, éventuellement...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Bonjour MPI,

Effectivement : (With a.ActiveWorkbook.ActiveSheet End With) ne sert à rien

Je te met le code en entier à partir des dim :

Dim oExcel As Excel.Application
Dim oWk As Workbook
Dim LigneVide As Variant
Dim a As New Excel.Application


Set oExcel = CreateObject("Excel.Application")
Set oWk = ActiveWorkbook


If Dir(App.Path & "\application3.xls") = "" Then
    oExcel.Visible = True
    a.Workbooks.Add
    VariablePage = 1
Else
    oExcel.Visible = True
    Workbooks.Open App.Path & "\application3.xls"
End If
   
Set oWk = ActiveWorkbook
LigneVide = oWk.Sheets(VariablePage).Cells(Rows.Count, "A").End(xlUp).Row + 1




        If LigneVide <= 5 Then
        oWk.Sheets(VariablePage).Range("A" & LigneVide) = Text2
        ElseIf LigneVide >= 5 Then
        VariablePage = VariablePage + 1
        MsgBox (VariablePage)
        a.Workbooks.Add
        oWk.Sheets(VariablePage).Range("A2") = Text2   
        End If




Text4 = ("A" & LigneVide)
oExcel.DisplayAlerts = False
oWk.SaveAs App.Path & "\application3.xls"
oWk.Close False
oExcel.Quit
Set oWk = Nothing
Set oExcel = Nothing


End If
End Sub

L'erreur qui me revient est celle que j'ai décrite plus haut ("Erreur d'execution '9' indice en dehors de la plage")

Si quelqu'un a une idée ?
Merci
Jack.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu n'as pas besoin de déclarer 2 Application (oExcel et a)
Laisse tomber le "a" qui, de toutes façons, n'est pas très explicite...

Si tu veux utiliser les références, utilise New et laisse tomber CreateObject.
Si tu ne veux pas utiliser les références, déclare tes objets As Object et utilise CreateObject

Avec référence à Excel
Dim oExcel As New Excel.Application
Dim oWk As Workbook
Dim oSh As Worksheet
Dim LigneVide As Variant
Set oWk = oExcel.Workbooks.Open("le fichier")

Set oSh = oWk.Sheets("Feuil1")

Sans références

Dim oExcel As Object

Dim oWk As Object

Dim oSh As Object

Set oExcel = CreateObject("Excel.Application")
Set oWk = oExcel.Workbooks.Open("le fichier")
Set oSh = oWk.Sheets("Feuil1")

Et n'oublie pas de bien fermer ces objets et de les mettre à Nothing avant de quitter pour éviter que la session Excel ne demeure active dans les "process"

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Bonjour MPI,

J'ai testé les differentes solutions que tu me proposait mais en vain j'ai toujours le même message d'erreur qui apparait ("Erreur d'execution '9' indice en dehors de la plage") ??

Voila le code que j'ai fait :

Public LigneVide As Integer
Public VariablePage As Integer

Dim oExcel As New Excel.Application
Dim oWk As Workbook
Dim oSh As Worksheet

Set oExcel = CreateObject("Excel.Application")
Set oWk = ActiveWorkbook


If Dir(App.Path & "\application13.xls") = "" Then
    oExcel.Visible = True
    oExcel.Workbooks.Add
    VariablePage = 1
Else
    oExcel.Visible = True
    Workbooks.Open App.Path & "\application13.xls"
End If
   
Set oWk = ActiveWorkbook
LigneVide = oWk.Sheets(VariablePage).Cells(Rows.Count, "A").End(xlUp).Row + 1




        If LigneVide <= 5 Then
        oWk.Sheets(VariablePage).Range("A" & LigneVide) = Text2
       
        ElseIf LigneVide >= 5 Then
        VariablePage = VariablePage + 1
        Set oSh = oWk.Sheets(VariablePage)
        MsgBox (VariablePage)
        oExcel.Workbooks.Add
        Set oSh = oWk.Sheets(VariablePage)
        oWk.Sheets(VariablePage).Range("A2") = Text2
       
        End If




Text4 = ("A" & LigneVide)
oExcel.DisplayAlerts = False
oWk.SaveAs App.Path & "\application13.xls"
oWk.Close False
oExcel.Quit
Set oWk = Nothing
Set oExcel = Nothing
Set oSh = Nothing


End If
End Sub




Peut être ai-je mal écrit ou oublier quelque chose ?
Si quelqu'un aurait une idée
Merci
Jack.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
salut,

ton problème est que tu appelles une feuille (par l'index numérique) qui n'existe pas.
Appelle là par son nom (Sheets("Feuil2").Select, par exemple)

sinon :

<strike>Set oExcel = CreateObject("Excel.Application")</strike>
' inutile, le New dans ta déclaration fait créer une instance de l'appli dès utilisation de la variable

<strike>Set oWk = ActiveWorkbook</strike>

If Dir(App.Path & "\application13.xls") = "" Then
    oExcel.Visible = True
    Set oWk = oExcel.Workbooks.Add
    VariablePage = 1
Else
    oExcel.Visible = True
    Set oWk = Workbooks.Open App.Path & "\application13.xls"
End If

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Salut mortalino,

Mon problème est que je ne connait pas le numero de la feuille à appeller pour écrire dessus, c'est pour cela que j'ai utilisé une variable qui permet a mon prog de creer une nouvelle feuille et de l'appeller quand il en a besoin en incrementant cette variable (VariablePage)
Je ne comprend pas car j'arrive à creer, ouvrir, ecrire, sauvegarder sur les 3 premières pages sans aucun souci avant que l'erreur n'apparaisse ?

Jack.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
As-tu tenu compte des recommandations de Mortalino concernant CreateObject versus New ?

Je pense aussi que tu mélange Workbooks.Add (création d'un classeur) et Worksheets.Add (création d'une feuille)

Ensuite, après
Set oWk = ActiveWorkbook
tu pourrais tout de suite écrire
Set oSh = ActiveSheet

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Bonjour MPI,

Je pense avoir tenu compte des conseils de Mortalino (effectivement je me melange les pinceaux car je débute en VB6) voila comment j'ai fait :

Dim oExcel As Excel.Application
Dim oWk As Workbook
Dim oSh As Worksheet


Set oWk = ActiveWorkbook
Set oSh = ActiveSheet
Set oExcel = CreateObject("Excel.Application")    Par contre si je retire cette ligne comme me le conseille Mortalino mon programme ne fonctionne plus.


If Dir(App.Path & "\application18.xls") = "" Then
    oExcel.Visible = True
    Set oWh = oExcel.Workbooks.Add
    VariablePage = 1
Else
    oExcel.Visible = True
    Workbooks.Open App.Path & "\application18.xls"
End If
   
Set oWk = ActiveWorkbook
LigneVide = oWk.Sheets(VariablePage).Cells(Rows.Count, "A").End(xlUp).Row + 1




        If LigneVide <= 5 Then
        oWk.Sheets(VariablePage).Range("A" & LigneVide) = Text2
        ElseIf LigneVide >= 5 Then
        VariablePage = VariablePage + 1
        MsgBox (VariablePage)
        oExcel.Workbooks.Add
        Set oSh = oWk.Sheets(VariablePage)
        oWk.Sheets(VariablePage).Range("A2") = Text2
        End If




Text4 = ("A" & LigneVide)
oExcel.DisplayAlerts = False
oWk.SaveAs App.Path & "\application18.xls"
oWk.Close False
oExcel.Quit
Set oWk = Nothing
Set oExcel = Nothing
Set oSh = Nothing


End If
End Sub

Par contre je ne sais pas par quel moyen, j'ai reussi à écrire une fois sur la 4eme page et en fait elle apparait avant la page 1 
puis décale les pages (c'est à dire page 4,1,2,3 et ce qu'il y avait sur la page 1 a été decalé sur la 4 puis ce qu'il y avait sur la page 2 a été décalé sur la 1 et ainsi de suite pour écrire sur la dernière page qui est pour lui la 3eme ???).
Sinon dans le dernier des cas qu'il m'arrive le prog créer un nouveau classeur avec les 4 pages dans le meme ordre que ci dessus mais la elles sont vide et porte un autre nom que celui que je voulais par exemple classeur1 qui lui (Mon fichier : \application18) s'est enregistré mais avec seulement 3 pages ?

J'espère avoir été clair.
Est ce que quelqu'un pourrait m'aider svp ?
Merci
Jack.

 
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Salut Mortalino,

Je ne comprenais pas vraiment l'appel d'une page que tu m'as donné : (Sheets("Feuil2").Select, par exemple) mais je viens de découvrir l'enregistreur de macro d'Excel.
Effectivement un tel appel serait la solution, mais il faudrait que je remplace le "Feuil2" par ma VariablePage (par exemple Sheets("VariablePage").Select) mais je ne sais absolument pas comment l'écrire car cette façon ne fonctionne pas.

Est ce que quelqu'un sait si c'est possible d'utiliser une variable à la place du nom de la feuille ?

Merci
Jack.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Dans le cas de la variable, il suffit d'enlever les guillemets

MaVariable = "Feuil1"
Sheets(MaVariable).Activate  ' ici la feuille sera activée si elle se nomme bien "Feuil1"

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Pour la question que tu m'adresses, relis bien mon message concernant les références.

Si tu crées une référence, utilise NEW et déclare les variables As Excel.blabla
Si tu ne crées pas de référence, utilise CreateObject et déclare les variables As Object

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Dans le code que je viens de relire, tu écris
Set oWh = oExcel.Workbooks.Add

Cette variable n'existe pas, si je ne me trompe...

Tu ne dois pas utiliser Option Explicit en haut de chacune des pages de codes que tu crées... vilain garçon !

Va dans le menu Outils de l'IDE, puis Options
Dans le 1er onglet, décoche le premier item "Vérification automatique de la syntaxe"
et coche le suivant "Déclaration des variables obligatoires"

Dans le premier cas, ça ne popera plus de message irritant quand tu fais une erreur de syntaxe mais va simplement mettre la ligne en couleur, ce qui est suffisant quant à moi.
Dans le 2e cas, tu sauras si tu nommes une variable avec le mauvais nom comme dans le cas que j'ai décrit...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
63
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
22 juin 2011
3
Bonjour MPI,

Désolé je n'avais pas fait attention à l'erreur qui s'est glissé lors de mon copier coller.

Par contre j'ai réussi à me débloquer (enfin presque) voilà le morceau du code que j'ai modifié :

If LigneVide <= 5 Then
        oWk.Sheets(VariablePage).Range("A" & LigneVide) = Text2
       
        ElseIf LigneVide >= 5 Then
        VariablePage = VariablePage + 1
        MsgBox (VariablePage)
        Set oSh = Sheets.Add                                        
        Sheets.Add.Name = VariablePage       Je voudrais donner comme nom à chaque nouvelles pages crées le chiffre qui est présent à ce moment la dans VariablePage.
        Sheets(VariablePage).Select
        oWk.Sheets(VariablePage).Range("A2") = Text2
        End If

Le programme écrit sur des nouvelles pages dans l'ordre en sautant la page 2 et 3 (encore ce n'est pas très grave)? mais il me crée en plus des nouvelles pages avec simplement des numéros sur les onglets qui reste vide, le problème si j'enlève une des deux lignes rouges plus rien ne fonctionne correctement.
Je ne sait plus comment l'écrire...
Est ce que tu aurait une idée ?
Merci d'avance.
Jack.