Encore et toujours du VBA
enark78
Messages postés
417
Date d'inscription
Statut
Membre
Dernière intervention
-
garion28 Messages postés 1545 Date d'inscription Statut Membre Dernière intervention -
garion28 Messages postés 1545 Date d'inscription Statut Membre Dernière intervention -
Bonjour, je poste pour le enième fois une requête sur le VBA. Je souhaite récupérer les données d'un feuille d'un classuer excel fermée sur un autre classeur (ouvert lui, bien évidemment) en passant par une macro mais je ne trouve rien qui m'interresse.
Je soughaite plus particulièrement copier toutes les lignes des colonnes A à H.
Merci d'avance pour votre aide eventuelle.
Je soughaite plus particulièrement copier toutes les lignes des colonnes A à H.
Merci d'avance pour votre aide eventuelle.
A voir également:
- Encore et toujours du VBA
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
21 réponses
Bonjour enark78,
Si tu n'as pas eu de réponse.... c'est que tu n'as pas été clair et/ou c'est impossible....
Dans ce que tu demandes je ne vois pas de difficulté....mais soyons prudent.
Peux-tu préciser:
- le nom et le chemin de ton classeur est-il toujours le même ( je parle des données qui sont importées)?
- souhaites-tu choisir le fichier manuellement ( click-click - ouvrir)?
tu dis :
Je soughaite plus particulièrement copier toutes les lignes des colonnes A à H.
Merci d'avance pour votre aide eventuelle.
ça c'est la source.... et le but c'est quoi ???
Tu as oublié quelque chose?
C'est pas grave tu peux préciser le reste maintenant avec tes attentes ou tes contraintes.
A+
Si tu n'as pas eu de réponse.... c'est que tu n'as pas été clair et/ou c'est impossible....
Dans ce que tu demandes je ne vois pas de difficulté....mais soyons prudent.
Peux-tu préciser:
- le nom et le chemin de ton classeur est-il toujours le même ( je parle des données qui sont importées)?
- souhaites-tu choisir le fichier manuellement ( click-click - ouvrir)?
tu dis :
Je soughaite plus particulièrement copier toutes les lignes des colonnes A à H.
Merci d'avance pour votre aide eventuelle.
ça c'est la source.... et le but c'est quoi ???
Tu as oublié quelque chose?
C'est pas grave tu peux préciser le reste maintenant avec tes attentes ou tes contraintes.
A+
Désolé de ce manque de précision.
Le chemin de mon classeur reste effectivement toujours le même donc a priori je n'ai pas bersoin de le choisir manuellement. Quant à mon but, il s'agit seulement de faire un copier des colonnes A à H et de les coller dans mon classeur ouvert, celui à partir duquel je lancerai ma macro.
Si il y a d'autres précisions a apporter, je suis là.
Le chemin de mon classeur reste effectivement toujours le même donc a priori je n'ai pas bersoin de le choisir manuellement. Quant à mon but, il s'agit seulement de faire un copier des colonnes A à H et de les coller dans mon classeur ouvert, celui à partir duquel je lancerai ma macro.
Si il y a d'autres précisions a apporter, je suis là.
Bonjour,
Tu poses ta question à 8h42 et tu t'impatientes à 9h33...!!!
Ta demande est floue...
par ex:
faut il que le fichier reste fermé ? si oui, quelle est la structure de ce fichier: style base de données?
mais je ne trouve rien qui m'interresse.
bravo pour la précision
Donc avant de t'impatienter, commence par prendre du temps pour donner envie à quelqu'un de t'aider; pour l'instant c'est mal parti....
Tu poses ta question à 8h42 et tu t'impatientes à 9h33...!!!
Ta demande est floue...
par ex:
faut il que le fichier reste fermé ? si oui, quelle est la structure de ce fichier: style base de données?
mais je ne trouve rien qui m'interresse.
bravo pour la précision
Donc avant de t'impatienter, commence par prendre du temps pour donner envie à quelqu'un de t'aider; pour l'instant c'est mal parti....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ce n'est pas que je m'impatiente, je voulais juste éviter que le sujet disparaisse.
Le mieux est que le fichier reste fermé mais après, la personne qui acceptera de m'aider peut faire au plus simple pour elle, cela m'est égal.
Le fichuier est un simple tableau de données.
Le mieux est que le fichier reste fermé mais après, la personne qui acceptera de m'aider peut faire au plus simple pour elle, cela m'est égal.
Le fichuier est un simple tableau de données.
voici un c/c de ma procédure, je l'ai récupéré sur vbfrance et adapté pour un transfert d'excel vers access, mais le principe doit etre le même pour les set
Private Sub importExcel() Dim oApp As Excel.Application Dim oWkb As workbook Dim oWSht As Worksheet Dim oRge As Range Dim i As Integer Dim a As String Dim b As String Dim c As String Dim d As String Set oApp = CreateObject("excel.application") Set oWkb = oApp.Workbooks.Open("P:\TLa_OFENCOURS\OFENCOURS.xls") Set oWSht = oWkb.Worksheets(1) i = 2 DoCmd.SetWarnings (False) 'Call delete While ActiveSheet.Range("A" & i).Value <> "" DoCmd.RunSQL "INSERT INTO client VALUES('" & ActiveSheet.Range("C" & i).Value & "','" & ActiveSheet.Range("B" & i).Value & "');" DoCmd.RunSQL "INSERT INTO famille VALUES('" & ActiveSheet.Range("K" & i).Value & "','" & Mid(ActiveSheet.Range("K" & i).Value, 1, 1) & "','" & Mid(ActiveSheet.Range("K" & i).Value, 2, 1) & "','" & Mid(ActiveSheet.Range("K" & i).Value, 3, 1) & "','" & Mid(ActiveSheet.Range("K" & i).Value, 4, 1) & "');" DoCmd.RunSQL "INSERT INTO commande VALUES('" & ActiveSheet.Range("D" & i).Value & "','" & ActiveSheet.Range("C" & i).Value & "','" & ActiveSheet.Range("F" & i).Value & "');" DoCmd.RunSQL "INSERT INTO lof VALUES ('" & ActiveSheet.Range("A" & i).Value & "','" & ActiveSheet.Range("D" & i).Value & "','" & ActiveSheet.Range("E" & i).Value & "','" & ActiveSheet.Range("M" & i).Value & "','" & ActiveSheet.Range("G" & i).Value & "');" DoCmd.RunSQL "INSERT INTO article VALUES('" & ActiveSheet.Range("G" & i).Value & "','" & Replace(ActiveSheet.Range("H" & i).Value, "'", " ") & "','" & ActiveSheet.Range("K" & i).Value & "','','','" & Replace(ActiveSheet.Range("I" & i).Value, "'", " ") & "');" i = i + 1 Wend DoCmd.SetWarnings (True) Set oWSht = Nothing Set oWkb = Nothing Set oApp = Nothing End Sub
les Set ouvre le fichier excel et tu manipule ton fichier ainsi ouvert avec oWSht qui correspond a la premiere feuille (que tu peu adapté selon le nombre de feuille a traiter)
le i= 2 veut dire que mon traitement commence a partir de la ligne 2
le DoCmd.SetWarnings (False) sert a enlever les alertes de access, tu l'enleve
la boucle while veu dire que de la ligne 2 jusqu'a ce que la cellule A & i soit vide, on insert dans les tables correspondante
ensuite le DoCmd.SetWarnings (true réactive les messages d'alerte)
et enfin on vide les variables contenant le classeur ouvert
je pense que les seules choses a changer sont:
- le chemin d'acces dans le deuxième set
- le traitement dans le while afin d'extraire les info de ton classeur ouvert:
par contre ya un truc qui me trote dans la tête: c'est qu'il risquerai d'y avoir un conflit entre le fichier ouvert pour l'extraction et le fichier d'où est lancé la macro et qui recevra les infos (par rapport au oWSht du fichier a extraire et au possible activesheet que tu utilisera, ou a défaut un sheets("nom de feuille") )
mais "normalement" il ne devrai pas y avoir de problème ^^
le i= 2 veut dire que mon traitement commence a partir de la ligne 2
le DoCmd.SetWarnings (False) sert a enlever les alertes de access, tu l'enleve
la boucle while veu dire que de la ligne 2 jusqu'a ce que la cellule A & i soit vide, on insert dans les tables correspondante
ensuite le DoCmd.SetWarnings (true réactive les messages d'alerte)
et enfin on vide les variables contenant le classeur ouvert
je pense que les seules choses a changer sont:
- le chemin d'acces dans le deuxième set
- le traitement dans le while afin d'extraire les info de ton classeur ouvert:
par contre ya un truc qui me trote dans la tête: c'est qu'il risquerai d'y avoir un conflit entre le fichier ouvert pour l'extraction et le fichier d'où est lancé la macro et qui recevra les infos (par rapport au oWSht du fichier a extraire et au possible activesheet que tu utilisera, ou a défaut un sheets("nom de feuille") )
mais "normalement" il ne devrai pas y avoir de problème ^^
Je vais tester ca et je te tiens au courant. Quoiqu'il en soit je te remercie pour toutes tes réponses, que ce soit sur ce post ou les autres que j'ai pu faire.
Ah, juste un truc le private c'est pour quoi deja ?
Ah, juste un truc le private c'est pour quoi deja ?
je ne peu pas te l'expliquer précisément, mais c'est la valeur par défaut de excel (si tu ne met pas private ou public devant le sub c'est considéré comme private
si ca dérange pour l'utilisation dans d'autres modules tu le met en public
si ca dérange pour l'utilisation dans d'autres modules tu le met en public
J'ai essayé, mais il me met un erreur au niveau de DoCmd.SetWarnings (False).
de plus je pense que ce que je veux faire ne doit pas sde faire comme ca. Voice mon code apres transformation.
Sub importExcel()
Dim oApp As Excel.Application
Dim oWkb As Workbook
Dim oWSht As Worksheet
Dim oRge As Range
Dim i As Integer
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open("C:\Documents and Settings\CT00582\Bureau\export.xls")
Set oWSht = oWkb.Worksheets(1)
i = 2
DoCmd.SetWarnings (False)
'Call delete
While Sheets("export").Range("A" & i).Value <> ""
Range("a" & i + 1).Select
Selection.Copy
Sheets("full").Range("a" & i + 1).Select
slectiobn.Paste
i = i + 1
Wend
DoCmd.SetWarnings (True)
Set oWSht = Nothing
Set oWkb = Nothing
Set oApp = Nothing
End Sub
de plus je pense que ce que je veux faire ne doit pas sde faire comme ca. Voice mon code apres transformation.
Sub importExcel()
Dim oApp As Excel.Application
Dim oWkb As Workbook
Dim oWSht As Worksheet
Dim oRge As Range
Dim i As Integer
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open("C:\Documents and Settings\CT00582\Bureau\export.xls")
Set oWSht = oWkb.Worksheets(1)
i = 2
DoCmd.SetWarnings (False)
'Call delete
While Sheets("export").Range("A" & i).Value <> ""
Range("a" & i + 1).Select
Selection.Copy
Sheets("full").Range("a" & i + 1).Select
slectiobn.Paste
i = i + 1
Wend
DoCmd.SetWarnings (True)
Set oWSht = Nothing
Set oWkb = Nothing
Set oApp = Nothing
End Sub
comme je l'ai dis, le docmd.setwarnings est pour access, donc dans ton cas c'est inutile et vu que la références a access n'est pas activé dans ton fichier, ca bug
ensuite tu a fait une erreur de saisie pour selection.paste (utilise le copier coller pour ne pas faire ce genre de fautes
ensuite tu a fait une erreur de saisie pour selection.paste (utilise le copier coller pour ne pas faire ce genre de fautes
"le DoCmd.SetWarnings (False) sert a enlever les alertes de access, tu l'enleve "
je pensais que tu voulais j'enleve les alertes...donc ca ok.
J'ai corrigé les erreurs de saisie. Maintenant quand je relance la macro, j'ai une erreur au niveau de la ligne de while.
Il doit me manquer quelque chose dedans car mon but est de copier ce qu'il y a dans l'onglet export du classeur export (même nom pour l'onglet et le classeur donc) et de la copier dans la feuille "full" qui elle se trouve dans le classeur a partir duquel je lance la macro.
je pensais que tu voulais j'enleve les alertes...donc ca ok.
J'ai corrigé les erreurs de saisie. Maintenant quand je relance la macro, j'ai une erreur au niveau de la ligne de while.
Il doit me manquer quelque chose dedans car mon but est de copier ce qu'il y a dans l'onglet export du classeur export (même nom pour l'onglet et le classeur donc) et de la copier dans la feuille "full" qui elle se trouve dans le classeur a partir duquel je lance la macro.
a la place de Set oWSht = oWkb.Worksheets(1) tu met Set oWSht = oWkb.Worksheets("export")
et tu remplace ton sheets("expert") par oWSht, ca fera référence a ton classeur ouvert pour extraction (dans le cas présent je pense qu'il bug parce qu'il n'y a aucune feuille export dans le classeur d'où est éxécuté la macro
de plus tu as mis un range(xx) sans préciser la feuille ou est sensé etre pris cette cellule (il serai mieux que tu précise que c'est dans oWSht
ensuite ya un truc que je ne comprend pas
par exemple pour la ligne A2 (la premiere de la boucle) tu copie le contenu de la ligne A3 de oWSht pour la coller en A3 dans la feuille "full". j'en déduis (si c'est pas une erreur de colonne/ligne) que tes données commence a la ligne 3 non ? (et pour le "a" à la place de "A", si ca marche ben tant mieux ^^)
et tu remplace ton sheets("expert") par oWSht, ca fera référence a ton classeur ouvert pour extraction (dans le cas présent je pense qu'il bug parce qu'il n'y a aucune feuille export dans le classeur d'où est éxécuté la macro
de plus tu as mis un range(xx) sans préciser la feuille ou est sensé etre pris cette cellule (il serai mieux que tu précise que c'est dans oWSht
ensuite ya un truc que je ne comprend pas
par exemple pour la ligne A2 (la premiere de la boucle) tu copie le contenu de la ligne A3 de oWSht pour la coller en A3 dans la feuille "full". j'en déduis (si c'est pas une erreur de colonne/ligne) que tes données commence a la ligne 3 non ? (et pour le "a" à la place de "A", si ca marche ben tant mieux ^^)
Merci encore pour ton aide.
"ensuite ya un truc que je ne comprend pas
par exemple pour la ligne A2 (la premiere de la boucle) tu copie le contenu de la ligne A3 de oWSht pour la coller en A3 dans la feuille "full". j'en déduis (si c'est pas une erreur de colonne/ligne) que tes données commence a la ligne 3 non ? (et pour le "a" à la place de "A", si ca marche ben tant mieux ^^) "
En réalité non, c'est une suite de petites erreurs. Sur oWSht, mais données commencent a A1 (j'ai corrigé en mettant i=1 avant la boucle) mais je voulais la coller en A2 dans "full".
La ligne du while passe maintenant beaucoup mieux mais une erreur survient toujours, à la derniere ligne du while cette fois "selection.paste".
Je te remet mon code actualisé si cela peut t'aider.
Sub importExcel()
Dim oApp As Excel.Application
Dim oWkb As Workbook
Dim oWSht As Worksheet
Dim oRge As Range
Dim i As Integer
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open("C:\Documents and Settings\CT00582\Bureau\export.xls")
Set oWSht = oWkb.Worksheets("export")
i = 1
'Call delete
While oWSht.Range("A" & i).Value <> ""
oWSht.Range("A" & i).Select
Selection.Copy
Sheets("full").Range("A" & i + 1).Select
Selection.Paste
i = i + 1
Wend
Set oWSht = Nothing
Set oWkb = Nothing
Set oApp = Nothing
End Sub
"ensuite ya un truc que je ne comprend pas
par exemple pour la ligne A2 (la premiere de la boucle) tu copie le contenu de la ligne A3 de oWSht pour la coller en A3 dans la feuille "full". j'en déduis (si c'est pas une erreur de colonne/ligne) que tes données commence a la ligne 3 non ? (et pour le "a" à la place de "A", si ca marche ben tant mieux ^^) "
En réalité non, c'est une suite de petites erreurs. Sur oWSht, mais données commencent a A1 (j'ai corrigé en mettant i=1 avant la boucle) mais je voulais la coller en A2 dans "full".
La ligne du while passe maintenant beaucoup mieux mais une erreur survient toujours, à la derniere ligne du while cette fois "selection.paste".
Je te remet mon code actualisé si cela peut t'aider.
Sub importExcel()
Dim oApp As Excel.Application
Dim oWkb As Workbook
Dim oWSht As Worksheet
Dim oRge As Range
Dim i As Integer
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open("C:\Documents and Settings\CT00582\Bureau\export.xls")
Set oWSht = oWkb.Worksheets("export")
i = 1
'Call delete
While oWSht.Range("A" & i).Value <> ""
oWSht.Range("A" & i).Select
Selection.Copy
Sheets("full").Range("A" & i + 1).Select
Selection.Paste
i = i + 1
Wend
Set oWSht = Nothing
Set oWkb = Nothing
Set oApp = Nothing
End Sub
je n'utilise pas du tout les .copy et .paste
Sheets("full").Range("A" & i + 1).value=oWSht.Range("A" & i).value
(pourquoi se casser la tête à faire du copier coller alors qu'on peu directement dire qu'une cellule est égal a une autre ? ^^)
Sheets("full").Range("A" & i + 1).value=oWSht.Range("A" & i).value
(pourquoi se casser la tête à faire du copier coller alors qu'on peu directement dire qu'une cellule est égal a une autre ? ^^)
oui, je n'y avais jamais pensé, je vais revoir toutes mes macros moi je pense, d'autant plus que ca marche parfaitement maintenant, tu frôles le génie garion28 xD.
Merci a toi pour ton aide plus que précieuse
Merci a toi pour ton aide plus que précieuse
si ton classeur source est léger
procédure à adapter à ta configuration
procédure à adapter à ta configuration
Sub classeursourceléger() Dim derlig As Long Dim dummy Application.ScreenUpdating Workbooks.Open Filename:="D:\documents\resultats_scrabble.xls" With Sheets(3) derlig = Range("A65536").End(xlUp).Row dummy = Range("A2:H" & derlig).Value End With ActiveWorkbook.Close Sheets(1).Range("A1").Resize(derlig - 1, 8) = dummy End Sub