XL 2010 [Résolu]Bouton d'exportation de données

3xceln4ute

XLDnaute Occasionnel
Bonjour/Bonsoir Le Forum,

Je me tourne, une nouvelle fois, vers vous pour faire appel à votre expertise.

Le but:

Mon projet est de constituer une base de données de candidats qui ont passé les entrevues. Le but est d'éviter qu'un candidat qui a échoué précédemment sur le même poste de le re-convoquer (ne peut être réévaluer pour une période de 12 mois).

Le procédé:

J'ai pensé à un bouton qui exporterait les données nécessaires au suivi, que le tableau des horaires contienne vers la BD.

J'ai coloré les cellules à exporter du Fichier "Horaire - Entrevues" vers "BD candidats - entrevues".

Amicalement.
 

Pièces jointes

  • Horaire entrevues.xls
    76 KB · Affichages: 55
  • BD candidats - entrevues.xlsx
    12.9 KB · Affichages: 45

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Subirubi, bonjour le forum,

Si les deux classeur sont ouverts, essaie ce code à appliquer à un bouton :

Code:
Public Sub Macro1()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim PO As String 'déclare la variable PO (Onglet POste)
Dim PR As String 'déclare la variable PR (PRocessus)
Dim CO As String 'déclare la variable CO (COnseiller(ère))
Dim DA As Date 'déclare la variable DA (DAte)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim CAND As Byte 'déclare la variable CAND (CANDidat)

Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("Horaire entrevue - Mus") 'définit l'onglet source OS
Set CD = Workbooks("BD candidats - entrevues.xlsx") 'définit le classeur destination CD
Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination OD
'définit la cellule de destination DEST (A2 si A2 est vide, sinoin la première celllue vide de la colonne A de l'onglet OD)
Set DEST = IIf(OD.Range("A2").Value = "", OD.Range("A2"), OD.Range("A1").End(xlDown).Offset(1, 0))
PO = OS.Range("C11") 'définit le poste PO
PR = OS.Range("C12") 'définit la processus PR
CO = OS.Range("C13") 'définit le conseiller(ère) CO
DA = OS.Range("C18").Value 'définit la date DA
For LI = 23 To 37 'boucle sur les lignes 23 à 37
    Select Case LI 'agit en fonction de la ligne LI
        Case 23 'cas 23
            CAND = 0 'définit le candidat CAND
        Case 25 'cas 25
            CAND = 1 'définit le candidat CAND
        Case 33 'cas 33
            CAND = 2 'définit le candidat CAND
        Case 35 'cas 35
            CAND = 3 'définit le candidat CAND
        Case 37 'cas 37
            CAND = 4 'définit le candidat CAND
        Case Else 'autre cas
            GoTo suite 'va à l'e'tiquette "suite"
    End Select 'fin de l'action en fonction de la ligne LI
    'renvoie le nom du candidat dans DEST décalée de cand ligne(s) vers le bas et 0 colonne vers la droite
    DEST.Offset(CAND, 0) = OS.Cells(LI, 3).Value
    'renvoie le poste PO dans DEST décalée de cand ligne(s) vers le bas et 1 colonne vers la droite
    DEST.Offset(CAND, 1).Value = PO
    'renvoie le processus PR dans DEST décalée de cand ligne(s) vers le bas et 2 colonnes vers la droite
    DEST.Offset(CAND, 2).Value = PR
    'renvoie le conseiller(ère) CO dans DEST décalée de cand ligne(s) vers le bas et 3 colonnes vers la droite
    DEST.Offset(CAND, 3).Value = CO
    'renvoie la date DA dans DEST décalée de cand ligne(s) vers le bas et 4 colonnes vers la droite
    DEST.Offset(CAND, 4) = DA
suite: 'étiquette
Next LI 'prochaijne ligne de la boucle
End Sub
 

3xceln4ute

XLDnaute Occasionnel
Bonjour Robert,

Je te remercie pour ton code.

J'ai ajouté le bouton "Exporter" au classeur "Horaire entrevue", puis j'ai collé le code.
Reste qu'à déterminer le sender:
VB:
Private Sub Exporter_Click()
 

Pièces jointes

  • erreur.PNG
    erreur.PNG
    20.1 KB · Affichages: 43

3xceln4ute

XLDnaute Occasionnel
Bon matin Robert, Le forum,

Ça marche parfaitement, merci beaucoup pour ton assistance.

Cependant, sans vouloir abuser de ta gentillesse, peux-tu jeter un coup d'oeil sur cette discussion (Copier valeurs d'un classeur à un autre), pour savoir si tu peux adopter ton code aux classeurs.

Finalement, dans la mesure du possible, si je modifie l'échéancier d'un quelconque processus créé auparavant, comment adapter le code pour qu'il modifie seulement la ligne concernée dans le "Tableau de bord-cadres" ?

Cordialement.
 

3xceln4ute

XLDnaute Occasionnel
Bonjour, Robert, Le forum,

Lorsque le classeur Horaire est ouvert et le classeur BD - candidats entrevue est fermé, j'obtiens une erreur en exportant les données. Normalement ça devrait fonctionner même si le fichier de la base de données est fermé, n'est-ce pas ?

Les deux classeurs se trouvent dans le même dossier.

erreur 9.PNG
ligne d\'erreur.PNG
 
Dernière édition:

3xceln4ute

XLDnaute Occasionnel
Bonjour Robert,

Je vous remercie pour votre réponse rapide. Toutefois, la contrainte rencontrée est que le classeur "BD candidats - entrevues.xlsx" doit être impérativement ouvert pour pouvoir exporter. Y a-t-il moyen d'alimenter la BDD sans avoir à l'ouvrir ?

Cordialement.
 

3xceln4ute

XLDnaute Occasionnel
Bon pour apporter mon aide à la communauté, je partage avec vous le code qui permet d'exporter les données sans avoir à ouvrir le classeur de consolidation:

Merci à la personne qui l'a faite.

VB:
Sub Image1_Cliquer()

    Dim CS As Workbook 'déclare la variable CS (Classeur Source)
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
    Dim PO As String 'déclare la variable PO (Onglet POste)
    Dim PR As String 'déclare la variable PR (PRocessus)
    Dim CO As String 'déclare la variable CO (COnseiller(ère))
    Dim DA As Date 'déclare la variable DA (DAte)
    Dim LI As Integer 'déclare la variable LI (LIgne)
    Dim CAND As Byte 'déclare la variable CAND (CANDidat)
  
    Select Case IsFileOpen(Range("Consolidation.filename").Value)
    Case False
        'OK the file exists and is closed
    Case True
        MsgBox "Le fichier de consolidation étant actuellement ouvert, la consolidation ne peut être complétée. Veuillez essayer à nouveau plus tard." & vbCrLf & vbCrLf & _
                Range("Consolidation.filename").Value
        Exit Sub
    Case Else
        MsgBox "Le fichier de consolidation n'étant présentement pas accessible, la consolidation ne peut être complétée. Veuillez essayer à nouveau plus tard." & vbCrLf & vbCrLf & _
                Range("Consolidation.filename").Value
        Exit Sub
    End Select
  
    Application.ScreenUpdating = False
  
    Set CS = ThisWorkbook 'définit le classeur source CS
    Set OS = radio2 'définit l'onglet source OS
    On Error Resume Next
    Set CD = Workbooks.Open(filename:=Range("Consolidation.filename").Value)
    If Err <> 0 Then
        MsgBox "Le fichier de consolidation étant actuellement ouvert, la consolidation ne peut être complétée. Veuillez fermer le fichier et essayer à nouveau."
        Application.ScreenUpdating = True
        Exit Sub
    End If
    On Error GoTo 0
'    Set CD = Workbooks("BD_candidats-entrevues.xlsx") 'définit le classeur destination CD
    Set OD = GetWsFromCodeName(CD, "d010") 'définit l'onglet destination OD
'    Set OD = CD.Worksheets("Data") 'définit l'onglet destination OD
    'définit la cellule de destination DEST (A2 si A2 est vide, sinoin la première celllue vide de la colonne A de l'onglet OD)
    Set DEST = OD.Range("tbConso").Range("a1").Offset(10000, 0).End(xlUp)
    If DEST.Address <> OD.Range("tbConso").Range("a1").Address Then Set DEST = DEST.Offset(1, 0)

'    Set DEST = IIf(OD.Range("A2").Value = "", OD.Range("A2"), OD.Range("A1").End(xlDown).Offset(1, 0))
    PO = OS.Range("C3") 'définit le poste PO
    PR = OS.Range("C4") 'définit la processus PR
    CO = OS.Range("C5") 'définit le conseiller(ère) CO
    DA = OS.Range("C12").Value 'définit la date DA
    For LI = 15 To 29 'boucle sur les lignes 15 à 29
        Select Case LI 'agit en fonction de la ligne LI
            Case 15 'cas 15
                CAND = 0 'définit le candidat CAND
            Case 17 'cas 17
                CAND = 1 'définit le candidat CAND
            Case 25 'cas 25
                CAND = 2 'définit le candidat CAND
            Case 27 'cas 27
                CAND = 3 'définit le candidat CAND
            Case 29 'cas 29
                CAND = 4 'définit le candidat CAND
            Case Else 'autre cas
                GoTo suite 'va à l'e'tiquette "suite"
        End Select 'fin de l'action en fonction de la ligne LI
        'renvoie le nom du candidat dans DEST décalée de cand ligne(s) vers le bas et 0 colonne vers la droite
        DEST.Offset(CAND, 0) = OS.Cells(LI, 3).Value
        'renvoie le poste PO dans DEST décalée de cand ligne(s) vers le bas et 1 colonne vers la droite
        DEST.Offset(CAND, 1).Value = PO
        'renvoie le processus PR dans DEST décalée de cand ligne(s) vers le bas et 2 colonnes vers la droite
        DEST.Offset(CAND, 2).Value = PR
        'renvoie le conseiller(ère) CO dans DEST décalée de cand ligne(s) vers le bas et 3 colonnes vers la droite
        DEST.Offset(CAND, 3).Value = CO
        'renvoie la date DA dans DEST décalée de cand ligne(s) vers le bas et 4 colonnes vers la droite
        DEST.Offset(CAND, 4) = DA
suite:     'étiquette
    Next LI 'prochaine ligne de la boucle
  
    Application.DisplayAlerts = False
    CD.Save
    CD.Close
    Application.DisplayAlerts = True
  
    Application.ScreenUpdating = True
End Sub
Sub GetConsolidationFileName()
    Dim FName
    FName = Application.GetOpenFilename(Title:="Please choose a file to open", FileFilter:="Excel Files *.xls* (*.xls*),")
    If FName = False Then
        'do nothing
    Else
        Range("Consolidation.filename").Value = FName
    End If
End Sub

Function IsFileOpen(filename As String)
    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    ' Attempt to open the file and lock it.
    Open filename For Input Lock Read As #filenum
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.
    Select Case errnum

        ' No error occurred.
        ' File is NOT already open by another user.
        Case 0
         IsFileOpen = False

        ' Error number for "Permission Denied."
        ' File is already opened by another user.
        Case 70
            IsFileOpen = True

        ' Another error occurred.
        Case Else
            IsFileOpen = errnum
    End Select

End Function

Function GetWsFromCodeName(wb As Workbook, CodeName As String) As Excel.Worksheet
    Dim ws As Excel.Worksheet
  
    For Each ws In wb.Worksheets
        If ws.CodeName = CodeName Then
            Set GetWsFromCodeName = ws
            Exit For
        End If
    Next ws
End Function
 
Dernière édition:

DoubleZero

XLDnaute Barbatruc

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 208
Membres
103 158
dernier inscrit
laufin