Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et 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.

Réponse
 
Outils de la discussion
Vieux 09/10/2008, 10h32   #1 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
Par défaut Modification fichier Excel via Access VBA: Un vrai casse-tete

Salut a tous,

Bon pour info j'ai bien regarder le tuto access concernant le pilotage d'Excel mais je ne sais pas comment faire pour creer ma fonction.

Alors en fait je dispose d'un classeur excel qui lors de ma requete de mise a jour est copie afin d'effectuer les modifications necessaires avant son importation sous access.

Ce classeur est compose de 21 feuilles qu'il faudrait que je reussisse a mettre bout a bout avec la presentation de ma table access de destination.

Sur chaque feuille il faut que je supprime les 2 premieres lignes ainsi qu'un certain nombre de colonnes avant d'assembler mon fichier.

La suppression ca je m'en sors mais la ou je galere vraiment, c'est pour mettre chaque feuille bout a bout sachant que le nombre de ligne par feuille ne peut etre defini!

J'ai vraiment besoin de votre aide car je suis en plein casse tete!

Merci d'avance

Dernière modification par damfury ; 09/10/2008 à 10h46 Motif: titre peu precis
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 11h43   #2 (permalink)
Expert Confirmé Sénior
 
Avatar de jpcheck
 
Date d'inscription: juillet 2007
Localisation: RP
Âge: 24
Messages: 2 925
Envoyer un message via MSN à jpcheck
Par défaut

Salut,
si mettre bout à bout signifie "les unes en dessous des autres" :
- voir
Code :
Range("A65000").End(xlUp).Row
si mettre bout à bout signifie "les unes à côté des autres" :
- voir
Code :
Range("IV1").End(xlToLeft).Column
__________________
Piou-Piou
Poussin Developpeur

Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 11h56   #3 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
Par défaut

Merci pour ta reponse mais malheureusement je ne sais pas comment la mettre en oeuvre.

En fait apres avoir bien regarder tout ca ce qu'il faudrait que je fasse c'est que je puisse creer ma fonction de sorte qu'en partant de la derniere feuille de mon classeur, elle commence par supprimer les 3 premieres lignes puis que les lignes restantes soient ramenees sur la feuille precedente et ainsi de suite jusqu'a tout ramener sur la 1ere feuille.

J'ai ce code qui fonctionne pour supprimer la feuille:
Code :
' Entries : strBook <- Book path.
'          strSheet  <- Name of the sheet to delete.
 
Function UpdatePrepare( _
  ByVal strClasseur As String, _
  ByVal strFeuille As String)
Dim xlApp As Excel.Application
Dim wbk As Excel.Workbook
 
' Open the book
Set xlApp = CreateObject("Excel.Application")
Set wbk = xlApp.Workbooks.Open(strClasseur)
 
' Desactivate Excel messages
xlApp.DisplayAlerts = False
 
 
' Delete selected sheet
On Error Resume Next
wbk.Worksheets(strSheet).Delete
If err.Number > 0 Then
  
  MsgBox "Deletion impossible for sheet [" & strFeuille & _
  "] from book [" & strClasseur & "]", vbExclamation
    
  ' Close book without saving changes
  wbk.Close False
Else
  ' Close the book with saving changes
  wbk.Close True
End If
Set wbk = Nothing
 
' Close Excel
xlApp.Quit
Set xlApp = Nothing
End Function
Reste a creer la suppression des lignes et le rappatriement des lignes dans la feuille precedente.

S'il vous plait j'ai besoinde comprendre ce code mais j'ai un peu de mal.
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 12h28   #4 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Bonjour

En considérant que tu as pu faire le nettoyage des colonnes qui ne seront pas transférées, voici un code qui transfère les données de toutes les autres feuilles sur la feuille nommée Feuil1. Dans l'exemple, j'ai considéré qu'il fallait transféré deux colonnes, mais tu adaptes PlageSource à ton cas.

Plutôt que de rapatrier les données de la dernière feuille sur l'avant-dernière et de remonter, j'ai préféré partir de la deuxième et d'aller jusqu'à la dernière...
Code :
Sub Transfert()
    Dim Feuille As Worksheet
    Dim PlageSource As Range ' définit la plage source dans les feuilles qui seront transférées
    Dim CelluleCible As Range ' définit la première cellule en A de la feuille 1 disponible
    
    For Each Feuille In Worksheets
        If Feuille.Name <> "Feuil1" Then
            Set CelluleCible = Worksheets("feuil1").Cells(Rows.Count, 1).End(xlUp)(2)
            Feuille.Rows("1:3").Delete
            Set PlageSource = Feuille.Range("a1:b" & Feuille.Cells(Rows.Count, 1).End(xlUp).Row)
            PlageSource.Copy Destination:=CelluleCible
        End If
    Next Feuille
End Sub
A jpcheck: Attention qu'avec 2007, les codes que tu proposes ne sont pas valables, car il y a plus de 65536 lignes (pq proposer 65000, fainéantise? ) et plus de 256 colonnes.
Des codes universels pour toutes les versions d'Excel sont
Code :
cells(rows.count,1).End(xlup)
cells(1,columns.count).end(xltoleft)
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 13h37   #5 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
Par défaut

Merci beaucoup ca marche nikel enfin a un detail pres, suite a ma mise a jour et l'importation sous access puis destruction du fichier, si j'essaie de relancer la mise a jour (l'ancien fichier n'existe plus), il me met une erreur de ce type:
Code :
Run-Time error '1004'
 
Method 'Worksheets' of object '_Global' failed
En fermant completement Excel et en stoppant le debuggeur ca repart mais si je pouvais regler ca ce serait mieux!

D'autre part pour la suppression des feuilless, ca ne fonctionne pas avec ce code:
Code :
Worksheets("Z").Delete
Merci beaucoup encore
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 14h50   #6 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
Par défaut

Bon je viens de me rendre compte d'un autre souci il se trouve que 2 des colonnes que j'importe contiennent des formules hors avant de les importer, il faut que je supprime les colonnes dont ces formules dependent et resultat je me retrouve avec deux colonnes vides.

J'ai alors 2 solutions:
-soit copier ces colonnes et les coller sous excel avant l'importation en ne collant que les valeurs
-soit supprimer les colonnes inutiles directement sous access mais dans ce cas il n'accepte pas mes noms de champs.

Dans les 2 cas je suis bloque car je ne sais pas comment programmer ma fonction pour m'en sortir.

S'il vous plait aidez moi!!!!!
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 15h54   #7 (permalink)
Expert Confirmé Sénior
 
Avatar de jpcheck
 
Date d'inscription: juillet 2007
Localisation: RP
Âge: 24
Messages: 2 925
Envoyer un message via MSN à jpcheck
Par défaut

essaye de voir ce que te propose le macro recorder, et raisonne sur l'algorithme général avant de passer au code
__________________
Piou-Piou
Poussin Developpeur

Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 16h05   #8 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Pas certain d'avoir tout compris...

Si, dans une procédure, tu détruis un fichier puis que tu fais référence à ce fichier, il y a 100% de chances que cela plante...

Il est certain également qu'en relançant la procédure sur un fichier sur lequel tu viens de la lancer, tu vas avoir des gros soucis, puisque la procédure:
- supprime les trois premières lignes de chaque feuille
- importe les données à la suite dans la première feuille.

Donc, au premier import, tout baigne
Au deuxième, tu vas importer, à la suite du premier import, les feuilles suivantes en supprimant chaque fois les trois premières lignes (qui avaient été importées précédemment)... Bref, un grosse merd* en perspective.

Une précaution serait d'enregistrer une copie du classeur en début de procédure pour pouvoir le retrouver comme à l'origine par la suite.

Tu dis
Code :
Worksheets("Z").Delete
ne fonctionne pas.

Ce code fonctionne pour autant qu'une feuille dont le nom d'onglet est Z existe dans le classeur.

Je penser que tu dois analyser à nouveau ton projet si tu veux écrire un code correct... et laisse tomber l'enregistreur de macros (merci jpcheck), ce truc écrit un code merdique qui ne t'aidera pas du tout, ou si peu...
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/10/2008, 16h28   #9 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
Par défaut

Tout d'abord merci encore de votre aide.

Ensuite le plus simple c'est que je vous poste l'integralite du code que j'ai produit.

Voila le code attache a mon formulaire:
Code :
Option Compare Database
Dim Update As String
 
Private Sub Command2_Click()
Update = OuvrirUnFichier(Me.hwnd, "File search", 1, "", "")
End Sub
 
Private Sub Command3_Click()
FileCopy Update, "C:\Documents and Settings\damien.mandon\Desktop\Technical document library\update.xls"
UpdatePrepare "C:\Documents and Settings\damien.mandon\Desktop\Technical document library\update.xls", "Z"
DoCmd.TransferSpreadsheet acImport, 8, "Update", "C:\Documents and Settings\damien.mandon\Desktop\Technical document library\update.xls", True, "a:g"
Kill "C:\Documents and Settings\damien.mandon\Desktop\Technical document library\update.xls"
MsgBox "Update complete"
End Sub
 
Private Sub Form_Load()
DoCmd.Maximize
End Sub
 
Private Sub Command5_Click()
    DoCmd.Close
End Sub
 
Private Sub Command4_Click()
    DoCmd.Close
End Sub
Et la c'est mon module:

Code :
Option Compare Database
 
' Entries : strBook <- Book path.
'          strSheet  <- Name of the sheet to delete.
 
Function UpdatePrepare( _
  ByVal strBook As String, _
  ByVal strSheet As String)
  
Dim xlApp As Excel.Application
Dim wbk As Excel.Workbook
Dim Feuille As Worksheet
Dim PlageSource As Range ' définit la plage source dans les feuilles qui seront transférées
Dim CelluleCible As Range ' définit la première cellule en A de la feuille 1 disponible
 
' Open the book
Set xlApp = CreateObject("Excel.Application")
Set wbk = xlApp.Workbooks.Open(strBook)
 
' Desactivate Excel messages
xlApp.DisplayAlerts = False
        
    For Each Feuille In Worksheets
        If Feuille.Name <> "A" Then
            Set CelluleCible = Worksheets("A").Cells(Rows.Count, 1).End(xlUp)(2)
            Feuille.Rows("1:3").Delete
            Set PlageSource = Feuille.Range("a1:ap" & Feuille.Cells(Rows.Count, 1).End(xlUp).Row)
            PlageSource.Copy Destination:=CelluleCible
        End If
    Next Feuille
 
Worksheets("A").Rows("1:2").Delete
Worksheets("A").Columns("g").Delete
wbk.Close True
 
' Close Excel
xlApp.Quit
Set xlApp = Nothing
End Function
Le tout fonctionne correctement sauf qu'il faut que je reussisse a effacer les lignes vide de ce fichier excel.

Juste comme ca si vous regardez dans le code du fornulaire, j'utilise une variable que j'appelle "Update" pour stocker le chemin de mon fichier d'update que j'essaie d'afficher dans une textBox mais je me retrouve avec une erreur #Name? alors que sur un autre formulaire rien qu'en mettant le code de ma variable dans la textbox ca fonctionne.

Et derniere chose, je pense que mes soucis d'erreur vienne directement de la facon dont je ferme excel a la fin de ma fonction mais je ne sais pas comment faire autrement.

PS: Merci de l'aide que vous m'apportez qui fait qu'il y a 3 jours je ne savais pas ou presque utiliser du code VB!!

(Suite de mes recherches demain car la journee est fini pour moi. J'espere trouver vos reponses en arrivant!)
damfury est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ACCESSF.A.Q AccessF.A.Q VBATutorielsSourcesOutilsLivresAccess TVAccess 2007

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide