Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2011, 10h27   #1
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Par défaut Problème de copie ligne dans tableau excel

Bonjour,


J'ai un petit soucis sur un code pour fichier excel.
L'exportation se passe bien mais je voudrais copier mes entêtes sur chaque nouvelle page.
Connaissant le nombre de lignes avant chaque nouvelle page. J'ai mis ce code, mais il ne me copie pas la ligne 2. Sachant que les codes de fermeture de page et fichier se font après.
L'erreur de déboggage se trouve sur la ligne selection....

Code :
1
2
3
4
5
6
xlSheet1.Rows("32:32").Select
                    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                    xlSheet1.Rows("2:2").Select
                    Selection.Copy
                    xlSheet1.Rows("52:52").Select
                    xlSheet1.Paste
Merci de votre aide.

Marcopololo
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 19h04   #2
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Bon cela fonctionne un peu mieux, mais j'ai une erreur aléatoire.
Une fois, la ligne est bien copiée et la seconde fois j'ai une erreur indiquant qu'une variable de type with (erreur 91)n'est pas définie et le déboggage s'arrête sur la ligne
Code :
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
avec les valeurs de xldown=-4121 et leftorabove=0

Merci de votre aide

Marcopololo
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 20h06   #3
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Dans le même temps je veux recopier toutes les 32 lignes mon entête.

voilà le bout de code que j'ai fait, mais il ne fonctionne pas.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'Recopie de la ligne des entêtes sur chaque page si le nombre d'enregistrement est sup à 32 et ses multiples
        If nbrerec >= 32 Then
 
          For R = 1 To Int(nbrerec / 32)
          MsgBox R, vbOKOnly
 
          S = (R * 32) - 1
          MsgBox S, vbOKOnly
                    xlSheet1.Rows("1:1").Offset(S, S).Select
                    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                    xlSheet1.Rows("2:2").Select
                    Selection.Copy
                    xlSheet1.Rows("32:32").Offset(S, S).Select
                    xlSheet1.Paste
          Next R
        Else
        End If
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 07h59   #4
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Voila, j'ai corrigé mes erreurs et mon code fonctionne à un problème près.

Si mon fichier n'existe pas, pas de soucis ma procédure fonctionne sans soucis, sinon elle plante à la ligne selection.copy

Si quelqu'un avait une idée.
Pourtant ma feuille est bien activée, et j'ai essayé en mettant l'activation avant selection.copy, c'est pareil.

Merci d'avance


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'Recopie de la ligne des entêtes sur chaque page si le nombre d'enregistrement est sup à 32 et ses multiples
        If nbrerec >= 32 Then
 
          For R = 1 To Int(nbrerec / 32)
          MsgBox R, vbOKOnly
 
          S = (R * 32)
          MsgBox S, vbOKOnly
                    'xlSheet1.Rows ("1:1")
                    'xlSheet1.Rows("1:1").Offset(S, S).Select
                    'Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                    xlSheet1.Rows("2:2").Select
                    Selection.Copy
                    xlSheet1.Activate
                    xlSheet1.Rows("" & S & ":" & S).Select '.Offset(S, S).Select
                    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                    xlSheet1.Paste
          Next R
        Else
        End If
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 14h48   #5
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

Je ne sais pas si je te l'avais déjà dit ou pas.
Lorsqu'on pilote Excel en dehors d'Excel (Automation), il faut éviter d'utiliser des expressions dans lesquelles on utilise des membres du modèle objet Excel, sans que l'expression commence par une de tes variables.

Voici une méthode pour éviter d'utiliser Selection :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'Recopie de la ligne des entêtes sur chaque page si le nombre d'enregistrement est sup à 32 et ses multiples
        If nbrerec >= 32 Then
 
            For R = 1 To Int(nbrerec / 32)
                MsgBox R, vbOKOnly
 
                S = (R * 32)
                MsgBox S, vbOKOnly
                ' Copier Ligne 2
                xlSheet1.Rows(2).Copy 
                ' L'insérer en ligne S
                xlSheet1.Rows(S).Insert xlShiftDown
                ' Annuler le mode Copie
                xlSheet1.Application.CutCopyMode = 0
            Next R
        Else
        End If
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 15h07   #6
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Merci Ledzepp2.
Je ne crois pas que tu me l'avais dis. Si je comprends bien l'utilisation des fonctions de la bibliothèque excel donne des soucis d'instyabilité ?

En tout cas cela marche super.

Par contre un petit soucis qu'il faut que je traite.
J'ai un message d'information qui apparait et qui m'indique que le format n'est pas le même que le standard (j'imagine xlsx). Y at-il une solution pour empêcher ce message. J'ai lu sur les problèmes de mode compatibilité mais cela est un peu confus.
Images attachées
Type de fichier : png erreur excel.png (21,9 Ko, 2 affichages)
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 16h05   #7
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Citation:
Si je comprends bien l'utilisation des fonctions de la bibliothèque excel donne des soucis d'instyabilité
Oui, si on ne fait pas attention à comment on les écrit.
Par exemple le code créé par l'enregistreur de macro Excel n'est pas directment réutilisable dans Acces pour piloter Excel.
Par exemple
Code :
1
2
    Range("A1:F1").Select
    Selection.Font.Bold = True
Ce code est valable dans un module de code Excel parce qu'on est dans Excel.
Si je fais de l'automation depuis Access, je ferai en sorte d'avoir une variable (xlSheet par exemple) Workseet sur ma feuille, et j'écrirai
Code :
xlSheet.Range("A1:F1").Font.Bold = True
Citation:
J'ai un message d'information qui apparait et qui m'indique que le format n'est pas le même que le standard (j'imagine xlsx). Y at-il une solution pour empêcher ce message
Ce message d'avertissement est affiché lorsque l'extension du fichier Excel ne correspond pas au contenu réel du fichier.
Exemple : j'exporte dans un fichier Excel au format acSpreadsheetTypeExcel12Xml mais j'utilise l'extension .xls au lieu de .xlsx.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 16h53   #8
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
Ok, il faut donc que je rajoute l'option acSpreadsheetTypeExcel11 pour ne pas avoir le message d'alerte si je comprends bien dans ma fonction de transfert ?

J'ai tenté de l'écrire mais j'ai un soucis de syntaxe :

Code :
xlBook.SaveAs FileName:=strxlfile, FileFormat:=acSpreadsheetTypeExcel11
Et il ne veut pas de celle ci non plus il me demande un =

Code :
xlBook.SaveAs (strxlfile,acSpreadsheetTypeExcel11)
Encore merci
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 17h09   #9
Nouveau Membre du Club
 
Avatar de Marcopololo
 
Inscription : juillet 2008
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 166
Points : 34
Points : 34
A priori il faut prendre l'option excel8

Voilà ce que j'ai mis

Code :
xlBook.SaveAs strxlfile, acSpreadsheetTypeExcel8
mais toujours une erreur de syntaxe, erreur 1004, je crois que j'utilise encore la collection excel pour sauvegarder. Je creuse

Voila j'ai trouvé...

Code :
xlBook.SaveAs strxlfile, xlExcel8
encore merci LedzeppII
Marcopololo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h13.


 
 
 
 
Partenaires

Hébergement Web