Encore et toujours du VBA

enark78 Messages postés 491 Statut Membre -  
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.
Configuration: Windows XP Internet Explorer 6.0

21 réponses

  • 1
  • 2
  1. enark78 Messages postés 491 Statut Membre 17
     
    Personne ?
    0
  2. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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
  3. enark78 Messages postés 491 Statut Membre 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
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. enark78 Messages postés 491 Statut Membre 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
  7. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  8. enark78 Messages postés 491 Statut Membre 17
     
    Peut tu me dire ce qu'elle fait 'en gros' afin que je comprenne son fonctionnement un peu mieux ?
    0
  9. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  10. enark78 Messages postés 491 Statut Membre 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
  11. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  12. enark78 Messages postés 491 Statut Membre 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
  13. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  14. enark78 Messages postés 491 Statut Membre 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
  15. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  16. enark78 Messages postés 491 Statut Membre 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
  17. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  18. enark78 Messages postés 491 Statut Membre 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
  19. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    ^^ ca va je me défend en vba, je suis toujours dispo pour aider :)
    0
  20. enark78 Messages postés 491 Statut Membre 17
     
    Alors je ne manquerai pas de te faire signe en cas de besoin :).
    0
  21. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  • 1
  • 2