Importer et exporter données avec formulaire

Bonjour à tous,

J'ai besoin de votre aide.

J'ai crée un formulaire de saisie avec lequel je souhaite récupérer des données d'un autre fichier excel (pas toujours le même) afin d'effectuer des calculs sur la feuille du formulaire. Il y a pas mal de choses à faire mais j'aimerais commencer par régler mon premier problème.

J'ai crée un bouton "importer" qui arrive à ouvrir l'explorateur Windows pour que je sélectionne mon fichier. Le fichier devient actif mais j'ai une erreur d'exécution 9 "l'indice n'appartient pas à la sélection".

J'ai essayé de modifier la plage de données mais toujours rien. J'ai essayé plusieurs modifs, de rajouter des .Activate et autre .Paste mais toujours la même erreur.

Private Sub btimporter_Click()
Dim wbMyWb As Workbook
Dim Nom_Fichier As Variant

Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If Nom_Fichier <> False Then
   Set wbMyWb = Workbooks.Open(Nom_Fichier)
  wbMyWb.Activate
  Workbooks("Nom_Fichier.xlsx").Sheets("Feuil1").Range("B12:B3000", "C12:C3000", "D12:D3000").Copy Workbooks("logiciel sigma mu.xlsx").Worksheets("sigma mu").Range("G15")
End If
End Sub

La plage de données "étrange" (3000) c'est simplement que je souhaite que le formulaire copie les données du tableau qui vont augmentées au fil du temps. En gros, les 3 mesures que je rentre dans le formulaire doivent ensuite se mettre dans le tableau ouvert. Il doit y avoir plus simple j'imagine, avec sélection des cellules non vide ou quelque chose du genre...

Je peux préciser si besoin, ce n'est pas simple à expliquer.

D'avance, merci pour votre aide.

Pom

10suivi-pince.xlsx (10.00 Ko)

Bonjour,

    wbMyWb.Sheets("Feuil1").Range("B12:B3000", "C12:C3000", "D12:D3000").......

et supprime ton Activate !

Cordialement.

Merci pour ton retour MFerrand.

Par contre, j'ai toujours le même type d'erreur et toujours sur la dernière ligne...

Private Sub btimporter_Click()
Dim wbMyWb As Workbook
Dim Nom_Fichier As Variant

Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If Nom_Fichier <> False Then
   Set wbMyWb = Workbooks.Open(Nom_Fichier)
  wbMyWb.Sheets("Feuil1").Range("B12:B3000", "C12:C3000", "D12:D3000").Copy Workbooks("logiciel sigma mu.xlsx").Worksheets("sigma mu").Range("G15")
End If

End Sub

En effet tu ne t'étais pas contenté d'une erreur de syntaxe sur la même ligne !

Mettre : ....Range("B12:D3000")...

Ce qui n'est par ailleurs ni élégant ni optimal...

Je vais t'en faire un autre version, le temps de l'écrire...

Merci pour ton retour.

Par contre j'ai toujours le même message d'erreur avec ta correction.

Rien à voir avec le fait que mon tableau soit presque vide?

J'attends ta version, merci pour ton aide.

Re,

Ma foi oui ! encore le nom de ton classeur qui est faux !...

Mais essaie ceci :

Private Sub btimporter_Click()
    Dim wbMyWb As Workbook, Nom_Fichier, bd
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If Nom_Fichier <> False Then
        Set wbMyWb = Workbooks.Open(Nom_Fichier)
        bd = wbMyWb.Sheets("Feuil1").ListObjects(1).DataBodyRange _
         .Offset(, 1).Resize(, 3).Value
        ThisWorkbook.Worksheets("sigma mu").Range("G15").Resize(UBound(bd), 3).Value = bd
    End If
End Sub

Cordialement.

Bonjour à tous,

Merci à toi MFerrand, cela fonctionne très bien.

Il y a un ou deux bouts de code que je ne pige pas ( ) mais je vais regarder ça.

Par contre, serait-ce possible de reprendre la main sur le fichier du formulaire après la copie? Ou alors laisser 'invisible le fichier suivi?

Bon, maintenant il faut que je regarde comment mettre ces données sur une même colonne.

Encore merci pour ton aide MFerrand.

Bonjour,

Private Sub btimporter_Click()
    Dim wbMyWb As Workbook, Nom_Fichier, bd
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If Nom_Fichier <> False Then
        Set wbMyWb = Workbooks.Open(Nom_Fichier)
        bd = wbMyWb.Sheets("Feuil1").ListObjects(1).DataBodyRange _
         .Offset(, 1).Resize(, 3).Value
        With ThisWorkbook
            .Worksheets("sigma mu").Range("G15").Resize(3, UBound(bd)).Value _
             = WorksheetFunction.Transpose(bd)
            .Activate
        End With
    End If
End Sub

Version modifiée. Ce qu'il faut bien voir :

1) Tu affectes le classeur ouvert à une variable objet (type Workbook). A partir de là tu utilises la variable pour atteindre le classeur (sinon inutile de mettre une variable).

2) On ne fait pas de copier-coller, inutile dans ton opération, on se contente d'affecter les valeurs d'une plage à une autre plage, on ne peut faire cela qu'en VBA, et c'est plus rapide.

3) Par commodité on transite par une variable (de type Variant) à laquelle on affecte les valeurs de la plage source, et comme tu utilises un tableau Excel on y accède aux données souhaitées par le tableau (ListObject), dont on retient la plage de données (DataBodyRange), qu'on décale (Offset) d'une colonne et qu'on redimensionne (Resize) à 3 colonnes.

4) On redimensionne la plage cible pour y affecter le tableau (bd) prélevé sur la plage source. Modification, puisque tu veux inverser lignes et colonnes, on inverse le dimensionnement, et on transpose le tableau prélevé.

5) On remet le classeur avec lequel tu opères au premier plan. Attention, tu ne reprends la main sur le classeur qu'après fermeture du formulaire.

Cordialement.

Un grand merci pour ton explication, c'est plus clair pour moi.

Par contre, lorsque mon tableau suivi a plus d'une ligne de remplie il le transpose sur plusieurs colonnes (il décale d'une colonne pour chaque série de 3 mesures) au lieu d'inscrire les données à la suite de la même colonne.

La transposition d'une plage de 3 colonnes se fera sur 3 lignes, et autant de colonnes qu'il y avait de lignes dans la plage source.

Si tu veux mettre tout dans une même colonne, c'est autre chose, il faut faire une recomposition sur une colonne.

Ok, je vais regarder ça.

C'est juste que cela me semble plus simple pour faire les formules de calcul après.

C'est pas gagné mais faut bien se lancer...

Merci pour ton retour.

Voilà :

Private Sub btimporter_Click()
    Dim wbMyWb As Workbook, Nom_Fichier, bd, Col(), i%, j%, k%
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If Nom_Fichier <> False Then
        Set wbMyWb = Workbooks.Open(Nom_Fichier)
        bd = wbMyWb.Sheets("Feuil1").ListObjects(1).DataBodyRange _
         .Offset(, 1).Resize(, 3).Value
        ReDim Col(UBound(bd) * 3 - 1, 0)
        For i = 1 To UBound(bd)
            For k = 1 To 3
                Col(j, 0) = bd(i, k): j = j + 1
            Next k
        Next i
        With ThisWorkbook
            .Worksheets("sigma mu").Range("G15").Resize(j).Value = Col
            .Activate
        End With
    End If
End Sub

On conserve l'affectation à une variable de la plage source, car il est plus rapide de parcourir un tableau que la plage elle-même. Et on compose un nouveau tableau sur une seule colonne.

Cordialement.

Ha oui quand même!

J'aurais jamais réussi à faire cela, en tout cas pas aussi vite et pas aussi proprement que toi.

Merci sincèrement MFerrand.

Bon, il me reste à travailler sur l'exportation.

Je vais essayer de m'inspirer de ton code pour exporter les 3 mesures que je rentre sur le formulaire à la suite du tableau "suivi" en prenant en compte la date, le nom etc.

Je laisse ouvert la discussion si j'ai quelques problèmes.

Encore merci.

Pom

Bon, je viens de passer la journée sur mon formulaire...

J'ai réussi à faire quelques macros.

La mise en page est à priori bonne, j'ai fais une msgbox et quelques transferts sur la feuille source.

J'ai aussi réussi à transférer les états des checkboxs.

Maintenant il me reste le transfert des infos sur le fichier suivi.

J'ai essayer quelques macros mais rien ne fonctionne...

Il faut pouvoir transférer les infos avec le bouton "transfert" de la feuille source à la feuille suivi.

En gros, toutes les infos que demande la feuille 1 du fichier suivi et si possible les états des checkboxs sur la feuille 2 du fichier suivi.

Je laisse en PJ mes fichiers.

Merci d'avance.

Pom

11suivi-pince.xlsx (13.87 Ko)

Bonjour à tous,

Je reviens vers vous après une bonne nuit de sommeil...

Je suis toujours bloqué sur cette macro de transfert, je n'arrive même pas à faire un semblant de début de quelque chose...

Private Sub bttransf_Click()
    With ThisWorkbook.Worksheets("sigma mu").Range("E16:E18").Value.Copy
    Workbooks(Nom_Fichier).Worksheets("Feuil1").Range("B13:D13").PasteSpecial Transpose:=True
    End With
End Sub

Mon but est de récupérer 3 valeurs de ma source (E16;E18) et de les coller dans le tableau du fichier suivi à la suite des précédentes. Le premier enregistrement doit se faire à partir de la ligne 13 du tableau. Dans le même temps il faut récupérer la date (H15) et la coller dans le tableau à la suite des précédentes dans la colonne A du fichier suivi. Il y a également les valeurs des Z, Z théo, F et F théo à récupérer pour inscrire également dans le tableau de suivi. Enfin, il y a a les états des checkboxs que je souhaite récupérer sur la feuille 2 du fichier de suivi dans la colonne C du cadre "mécanique". Une fois cela fait, j'aimerais pouvoir Reset tous les champs modifiés de la feuille source.

Bref, il y pas mal de travail. Je ne pense pas pouvoir réussir tout seul, j'aimerais au moins un peu d'aide pour le début, que je puisse avoir l'impression d'avancer un peu.

D'avance, merci.

Pom

bonjour

salut MFerrand

aujourd'hui, on uttilise Power Query pour se "connecter" à un fichier (on peut aussi charger le fichier) et faire des calculs

Excel 2010

https://www.youtube.com/watch?v=gwW2CDdvUUs

à chaque évolution ou chnagement du fichier d''origine, tu fais "actualiser", et les calculs sont à jour !

aucun VBA !

bonne journée à vous

Bonjour jmd,

Merci pour ton intervention.

Je veux bien croire que ta solution soit plus pertinente mais là où je travail ils n'utilisent pas Power query.

De plus, au vu du temps que j'ai investi dans ce projet, ce serait dommage de ne pas le finir, amha.

Toutefois, Je prends note pour une prochaine fois.

N'hésite pas si tu souhaite m'aider au passage.

Pom

Bonjour,

Je ne vois pas bien où se situe les différences avec le sujet initial posé, limité à un transfert de données...

Sur ce point je ne vois pas ce qui justifierait que l'on revienne à un collage valeurs dans la mesure où le copier-coller ne se justifie pas et peut donc être évité, (et si on peut l'éviter, à mon sens on le doit !)

Après, en ce qui concerne les CheckBox, comme je n'avais pas regardé le détail de ton Userform, c'est autre chose, si cela doit être pris en compte dans la même procédure, tu ne l'avais pas indiqué et ton bouton Importer semblait relativement indépendant...

Cordialement.

Bonjour MFerrand,

Merci pour ton retour.

Oui, je veux bien croire que la méthode soit la même mais pour un débutant ce n'est pas simple...

Je comprends pour le copier/coller, merci pour le conseil.

Concernant les checkboxs ce n'est que pour l'export vers le fichier suivi, le bouton "import" marche très bien comme cela.

J'ai récupéré les états de ces checkboxs sur ma feuille source (Vrai/Faux) suivant qu'ils sont cochés ou non. Je souhaite ensuite les transférer sur le fichier suivi avec d'autres infos comme précisé dans un message précédent.

Ai-je un début de quelque chose?

Private Sub bttransf_Click()
  Dim wbMyWb As Workbook, Nom_Fichier, bd, Col(), i%, j%, k%
   Nom_Fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
        If txtseuil & txtdate & txtmesure1 & txtmesure2 & txtmesure3 & txtnom & CheckBox1 & CheckBox2 & CheckBox3 & CheckBox4 & CheckBox5 & CheckBox6 <> "" Then
        bttransf.Enabled = True
        bd = wbMyWb.Sheets("Feuil1").ListObjects(1).DataBodyRange _
         .Offset(, 1).Resize(, 3).Value
        With ThisWorkbook
            .Worksheets("sigma mu").Range("E16:E18").Resize(i,j,k).Value

J'avoue avoir vraiment du mal à comprendre le code "importation", tout du moins assez pour ne pas arriver à le retranscrire dans l'autre sens... Avec les boucles "for" et les redimensionnements je suis largué...

Rechercher des sujets similaires à "importer exporter donnees formulaire"