XL 2010 Copier/Transposer plage vers Fichier fermé

cp4

XLDnaute Barbatruc
Bonjour,

Suite à une discussion (lien dans le fichier principal). J'ai voulu refaire la même mais sans ouvrir le fichier destination.
Donc c'est une première pour moi. J'ai trouvé un tuto sur developpez.com dans lequel un code est proposé pour les fichiers en xlsm et xlsx.
Jusque là, c'est bon. Il y aussi un exemple de requête SQL (que je ne connais pas du tout) pour récupérer les données d'une feuille.
Or, dans l'exemple il faut copier C6:C8 et les transposer dans la dernière ligne non vide du fichier destination.
Je suis bien embarrassé. Merci pour votre aide.

nb: dans le fichier zippé il y a les 2 fichiers

Bonne journée.

edit: Omis de signaler que la requete ne doit s'executer qu'à condition que C6:C8 non vide.
 

Pièces jointes

  • Fichier Fermé.zip
    72.1 KB · Affichages: 12
Solution
Quelques explication aux format VBA§

VB:
Sub test()
'Mise en comparaison d'un range et d'un recorset!
Dim R As Range, I As Integer, FichierFerme As String
Set R = Sheets("Feuil2").Range("Y10:Y13")
R.Range("A1") = "toto"

FichierFerme = ThisWorkbook.Path & "\Classeur Destination.xlsx"
'--- Connexion Sans prise en compte des entêtes de colonnes ---
    With New ADODB.Connection
        .Provider = "Microsoft.Jet.OLEDB.\4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & FichierFerme & ";Extended Properties=""Excel 12.0;HDR=no;"""
            .Open
          
           With .Execute("select * from [Feuil1$A1:B5]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print...

cp4

XLDnaute Barbatruc
Bonjour,
une proposition!
Je te remercie beaucoup. ça copie mais pas sur la dernière ligne non vide.
Normalement, devrait être copié en ligne 4 et ainsi de suite à chaque exécution du code.
Présentement, copie en ligne 11
1641225097311.png

J'avoue que je fais connaissance avec le sql, je n'ai pas encore tout compris.
En tout cas, je te suis très reconnaissant.
Merci beaucoup.
 

job75

XLDnaute Barbatruc
Bonsoir cp4, dysort;

Pourquoi vouloir que le fichier de destination reste fermé ? Sur l'autre fil il est dit :
j'aimerais que lorsqu'on clique sur le bouton "Ajouter", le classeur qui contient la nouvelle base s'ouvre, ajoute le client et se referme tout de suite après.
C'est alors un problème élémentaire.

ADO est utile s'il y a beaucoup de fichiers à modifier.

A+
 

cp4

XLDnaute Barbatruc
Bonsoir cp4, dysort;

Pourquoi vouloir que le fichier de destination reste fermé ? Sur l'autre fil il est dit :

C'est alors un problème élémentaire.

ADO est utile s'il y a beaucoup de fichiers à modifier.

A+
Bonsoir Job75;),

En effet, dans l'autre fil la demande était d'ouvrir, transférer et refermer le fichier.
J'ai ouvert ce fil pour découvrir la manipulation des fichiers fermés.
Pour ne pas mourir idiot, j'ai voulu découvrir le SQL mais surtout ADO.
Merci pour ta précision concernant ADO et le nombre de fichiers à traiter.
Mon ami, avec un seul fichier j'ai coulé😞.
Merci beaucoup.
Bonne soirée.
 

dysorthographie

XLDnaute Accro
Quelques explication aux format VBA§

VB:
Sub test()
'Mise en comparaison d'un range et d'un recorset!
Dim R As Range, I As Integer, FichierFerme As String
Set R = Sheets("Feuil2").Range("Y10:Y13")
R.Range("A1") = "toto"

FichierFerme = ThisWorkbook.Path & "\Classeur Destination.xlsx"
'--- Connexion Sans prise en compte des entêtes de colonnes ---
    With New ADODB.Connection
        .Provider = "Microsoft.Jet.OLEDB.\4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & FichierFerme & ";Extended Properties=""Excel 12.0;HDR=no;"""
            .Open
          
           With .Execute("select * from [Feuil1$A1:B5]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With

         With .Execute("select * from [Feuil1$B10:F20]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With
          
        .Close
    End With

'--- Connexion Avec prise en compte des entêtes de colonnes ---
With New ADODB.Connection
        .Provider = "Microsoft.Jet.OLEDB.\4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & FichierFerme & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
            .Open
          
           With .Execute("select * from [Feuil1$A1:B5]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With

         With .Execute("select * from [Feuil1$B10:F20]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With
            
        .Close
    End With
End Sub
 

Pièces jointes

  • Fichier Fermé.zip
    42.5 KB · Affichages: 1

cp4

XLDnaute Barbatruc
Quelques explication aux format VBA§

VB:
Sub test()
'Mise en comparaison d'un range et d'un recorset!
Dim R As Range, I As Integer, FichierFerme As String
Set R = Sheets("Feuil2").Range("Y10:Y13")
R.Range("A1") = "toto"

FichierFerme = ThisWorkbook.Path & "\Classeur Destination.xlsx"
'--- Connexion Sans prise en compte des entêtes de colonnes ---
    With New ADODB.Connection
        .Provider = "Microsoft.Jet.OLEDB.\4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & FichierFerme & ";Extended Properties=""Excel 12.0;HDR=no;"""
            .Open
         
           With .Execute("select * from [Feuil1$A1:B5]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With

         With .Execute("select * from [Feuil1$B10:F20]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With
         
        .Close
    End With

'--- Connexion Avec prise en compte des entêtes de colonnes ---
With New ADODB.Connection
        .Provider = "Microsoft.Jet.OLEDB.\4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & FichierFerme & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
            .Open
         
           With .Execute("select * from [Feuil1$A1:B5]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With

         With .Execute("select * from [Feuil1$B10:F20]  ")
            For I = 0 To .Fields.Count - 1
            Debug.Print .Fields(I).Name
            Next
          End With
           
        .Close
    End With
End Sub
Je te remercie beaucoup pour ce code. Je t'avoue que je suis un peu dérouté.
Je vais reprendre le pas à pas demain et essayer de comprendre.

Merci pour ton partage et ta patience.

Bonne soirée.
 

dysorthographie

XLDnaute Accro
un range commence toujours en A1!

VB:
Set R = Sheets("Feuil2").Range("Y10:Y13")
R.Range("A1") = "toto" 'ici la plage R commence en A1 et écrit physiquement en Y10
With .Execute("select * from [Feuil1$B10:F20] ") 'ici le nom des champs est toujours F1,F2,F3 etc.
on défini si la première ligne de la plage Excel correspond aux entêtes de colonnes HDR=Yes/No;
 

patricktoulon

XLDnaute Barbatruc
bonsoir a tous

il est possible de connaitre la première ligne vide d'une plage en partant d'en bas dans le fichier fermé( en gros le end(xlup) dans une fichier fermé)
avec une petite fonction perso utilisant une macro4
exemple pour ton fichier destination
VB:
Sub test()
    Dim chemin$, Fichier$, Rng As Range, Feuille$
    chemin = ThisWorkbook.Path & "\"
    Fichier = "Classeur Destination.xlsx"
    'Nom de la feuille dans le classeur fermé
    Set Rng = [B1:B100000]
    Feuille = "Feuil1"
    x = GetLastRowColInClosedFich(chemin, Fichier, Feuille, Rng)

MsgBox Range("B" & x).Resize(, 3).Address(0, 0)
End Sub

Function GetLastRowColInClosedFich(chemin$, Fichier$, Feuille, Rng As Range)
    Dim Addr$, Formule, n&
    Addr = Rng.Address(, , xlR1C1)
    Formule = "'" & chemin & "[" & Fichier & "]" & Feuille & "'!" & Addr
    'Debug.Print Formule
    On Error Resume Next
    n = ExecuteExcel4Macro("MATCH(""zzz""," & Formule & ")")    'dernière cellule
    On Error GoTo 0
    GetLastRowColInClosedFich = n
End Function
parti de là le SQL devrait être plus simple
;)
coucou Robert Meilleurs veux ;)
 

job75

XLDnaute Barbatruc
Je disais que c'était élémentaire :
VB:
Sub Exporter()
Dim source, lig&
source = Sheets("Feuil1").[C6:C8] 'à adapter
Application.ScreenUpdating = False
With Workbooks.Open(ThisWorkbook.Path & "\Classeur Destination.xlsx").Sheets(1).[B:D] 'ouvre le classeur
    If Application.CountA(.Cells) Then lig = .Find("*", , xlValues, , xlByRows, xlPrevious).Row + 1 Else lig = 1
    .Rows(lig) = Application.Transpose(source)
    .Parent.Parent.Close True 'enregistre et ferme le classeur
End With
End Sub
 

Pièces jointes

  • Fichier Principal(1).xlsm
    20.8 KB · Affichages: 2
  • Classeur Destination.xlsx
    10.9 KB · Affichages: 2

Discussions similaires

Réponses
3
Affichages
457

Statistiques des forums

Discussions
311 720
Messages
2 081 924
Membres
101 841
dernier inscrit
ferid87