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

dysorthographie

XLDnaute Accro
Bonjour,
Il y a 2 type de requête,des requêtes de sélection et des requêtes d'actions.

Il y a 3 grands type de requêtes d'actions,Ajout, modification, suppression !

Voici le modèle type d'une requête de sélection !
Code:
select table.champ1, table.champ2,etc
from table (S) inner join
Where champ(S)=valeur (s)'facultatif
Group by champs 'facultatif
Having champ(S)=valeur (s)'facultatif
Les requêtes d'actions
Code:
'ajout
Insert table 
(Champs)
Values (val1,val2,etc) 'notes que values peux être remplacé par une requête de sélection

'modification
Update table
Set champ(s)=valeure(s)
Where identifiant=valeurID

'Suppression n'existe pas pour EXCEL
Delete table
Where identifiant=valeurID
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour,
Il y a 2 type de requête,des requêtes de sélection et des requêtes d'actions.

Il y a 3 grands type de requêtes d'actions,Ajout, modification, suppression !

Voici le modèle type d'une requête de sélection !
Code:
select table.champ1, table.champ2,etc
from table (S) inner join
Where champ(S)=valeur (s)'facultatif
Group by champs 'facultatif
Having champ(S)=valeur (s)'facultatif
Les requêtes d'actions
Code:
'ajout
Insert table
(Champs)
Values (val1,val2,etc)

'modification
Update table
Set champ(s)=valeure(s)
Where identifiant=valeurID

'Suppression n'existe pas pour EXCEL
Delete table
Where identifiant=valeurID
Bonjour @dysorthographie ;),

Je te suis très reconnaissant pour ce petit cours. On m'a toujours dit que le SQL était simple à apprendre. J'avoue que je ne lui ai pas donné beaucoup d'importance. Car à l'époque, j'avais des comptes à rendre et n'avais pas beaucoup de temps. Je n'utilisais Excel que pour faire des tableaux (récapitulatif ou rapport).
Là, j'ai tout mon temps mais pas beaucoup d'idée. C'est pour cela que j'ai pris l'exemple du fil invoqué dans mon 1er post.
Toute ma gratitude.

Bonne journée.
 

cp4

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 ;)
Bonjour @patricktoulon ;),

Ton code est parfait. J'apprécie beaucoup ton partage de connaissance.
Dis-moi comment fais-tu pour te souvenir de tous ces codes?:cool:

Tous mes remerciements.

Bonne journée.
 

cp4

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
Bonjour @job75 ;),

Merci beaucoup. Ton code est concis et clair. Je vais mettre un lien pour le demandeur de l'autre fil puisse en profiter.

Encore merci pour ton partage.

Bonne journée.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour cp4
Dis-moi comment fais-tu pour te souvenir de tous ces codes?

ben je mange beaucoup de omega 3 j'ai une bonne mémoire 😂😂

non en fait quand je fait des codes je les rends génériques au plus possible (puisque la plus part du temps au départ c'est pour les autres que je les fait ) et je les stocke dans mon serveur dédié a vba et autre vb , j'ai 5 terra dispo pour stoker mes librairies de codes
c'est ça quand on est passionné;)
en ce qui concerne Ado et le SQL notre amis dysorthographie est vraiment fortiche
 

dysorthographie

XLDnaute Accro
SQL est un vrai langage dédié aux bases de données.

Il faut prendre ce langage au pied de la lettre ?
Une requête est une demande
{Select} Je sélectionne des champs
{From} en Provence d'une ou plusieurs tables qui sont liées par {inner join}
{Where} c'est le filtre !

Oui Patrick , pendant plus de 20 ans, mon travail a consisté à faire vivre des IHM en relation avec tout ce qui ressemble de près ou de loin à une base de données !
 

Discussions similaires

Réponses
3
Affichages
457