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   -
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.

21 réponses

enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
Personne ?
0
Bidouilleu_R Messages postés 1181 Date d'inscription   Statut Membre Dernière intervention   295
 
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+
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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à.
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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.
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
Peut tu me dire ce qu'elle fait 'en gros' afin que je comprenne son fonctionnement un peu mieux ?
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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 ^^
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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 ?
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
"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.
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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 ^^)
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
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 ? ^^)
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
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
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   406
 
^^ ca va je me défend en vba, je suis toujours dispo pour aider :)
0
enark78 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   17
 
Alors je ne manquerai pas de te faire signe en cas de besoin :).
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
si ton classeur source est léger
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
0