XL 2010 Copier/Transposer plage vers Fichier fermé

  • Initiateur de la discussion Initiateur de la discussion cp4
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour