![]() |
| 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é. | |||||||
|
|||||||
| VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Candidat au titre de Membre du Club
![]() Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
|
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 |
|
|
|
|
|
#2 (permalink) |
|
Expert Confirmé Sénior
![]() |
Salut,
si mettre bout à bout signifie "les unes en dessous des autres" : - voir Code :
Range("A65000").End(xlUp).Row - 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 |
|
|
|
|
|
#3 (permalink) |
|
Candidat au titre de Membre du Club
![]() Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
|
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 S'il vous plait j'ai besoinde comprendre ce code mais j'ai un peu de mal. |
|
|
|
|
|
#4 (permalink) |
![]() |
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 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. |
|
|
|
|
|
#5 (permalink) |
|
Candidat au titre de Membre du Club
![]() Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
|
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 D'autre part pour la suppression des feuilless, ca ne fonctionne pas avec ce code: Code :
Worksheets("Z").Delete |
|
|
|
|
|
#6 (permalink) |
|
Candidat au titre de Membre du Club
![]() Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
|
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!!!!! |
|
|
|
|
|
#7 (permalink) |
|
Expert Confirmé Sénior
![]() |
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 |
|
|
|
|
|
#8 (permalink) |
![]() |
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 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
__________________
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. |
|
|
|
|
|
#9 (permalink) |
|
Candidat au titre de Membre du Club
![]() Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
|
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 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 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!) |
|
|
|
|
![]() |
![]() |
||
Modification fichier Excel via Access VBA: Un vrai casse-tete
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|