Userform pour ouvrir un classeur

kioups

XLDnaute Occasionnel
Bonjour à tous !

J'aimerai créer un userform d'un classeur1 afin d'ouvrir un classeur2 et de transférer des données du classeur2 au classeur1.

Bon, la macro pour transférer les données fonctionne sans problèmes.

Ce que je veux avec mon userform, c'est que l'utilisateur aille chercher le classeur2 de son choix.

Alors, j'aimerai savoir comment créer un Userform genre "Enregistrer sous". Après, je dois pouvoir me débrouiller pour lancer ma macro automatiquement.
Puis, je dois pouvoir trouver le truc pour fermer le classeur2.

Je viens de tenter le coup en "enregistrant une macro" à partir de mon classeur, je suis aller ouvrir le classeur2, puis le refermer et ça m'a donné :

Code:
Sub Ouvrir_Fermer_classeur()
'
' Ouvrir_Fermer_classeur Macro
'

'
    ActiveWorkbook.Close
End Sub

C'est pas trop ça... :rolleyes:

Merci d'avance !

Kioups
 

nolich

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Bonsoir kioups, bonsoir à toutes et à tous :)

Tu peux, peut-être, essayer ce genre de code :

Code:
Option Explicit

Const ChDir = "C:\MesFichiersExcel"
Const NomFichier = "MonFichier.xls"

Sub OuvrirFichier()
    Workbooks.Open Filename:=ChDir & "\" & NomFichier
    ' ... Ton code
    Windows(ChDir & "\" & NomFichier).Close
End Sub

Tiens-nous au courant :)

@+
 

kioups

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Pour "simplifier" ma question, est-ce que c'est possible de créer un userform genre "Enregistrer sous" où j'ai la possibilité de choisir n'importe quel dossier sur mon PC puis n'importe quel fichier dans ce dossier ?
 

kioups

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Bon, j'ai trouvé un truc tout bête...

Me suffit "a priori" de commencer ma macro par :
Application.GetOpenFilename

Alors, j'ai fait une macro juste avec ça :

Code:
Sub Ouvrir_Fermer_classeur()
Application.GetOpenFilename
End Sub

J'ai mis un raccourci clavier pour la lancer.
Je la lance dans mon classeur, je choisis le classeur à ouvrir et....
il ne s'ouvre pas...

Que faire ?

Kioups
 

kioups

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Bon, j'ai pas mal de trucs...

J'ai fait une macro qui, par un raccourci clavier, ouvre un classeur, applique la macro de transfert et ferme le classeur.

J'ai un souci de lien entre les deux macros.

Voici ma macro d'ouverture/fermeture :

Code:
Sub Ouvrir_Fermer_classeur()

Dim Nom As String
       
    Nom = Application.GetOpenFilename()
        If Nom = "" Then
    MsgBox "Aucun Fichier Sélectionné", vbOKOnly + vbCritical, "Importation des votes non réalisée "
    Exit Sub
    
    Else
    Workbooks.Open Filename:=Nom
    Importation_Journée (Nom)
    Workbooks(Nom).Close
    
        End If

End Sub

Et ma macro de transfert (oui, je sais, elle est très moche...)

Code:
Sub Importation_Journée(Nom As String)
'
Dim NumeroJournee As Integer
Dim JoueursJournee As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim NomJoueur As String
Dim NbreJoueursTotal As Integer
Dim ColonneJoueur As Integer
'
' Sélection de la feuille
    Windows(Nom).Activate  [COLOR="Red"][B]Ca merde ici !!!!!![/B][/COLOR]
' Rajout des deux calculs
    Cells(4, 1).Select
    ActiveCell.FormulaR1C1 = _
        "=VALUE(IF(RIGHT(LEFT(R[-1]C,14))=""e"",RIGHT(LEFT(R[-1]C,13)),RIGHT(LEFT(R[-1]C,14),2)))"
    Cells(7, 1).Select
    ActiveCell.FormulaR1C1 = "=VALUE(LEFT(R[-1]C,2))"
    NumeroJournee = Cells(4, 1).Value
    JoueursJournee = Cells(7, 1).Value
    Cells(4, 1).Value = ""
    Cells(7, 1).Value = ""
' Suppression des bordures
    Cells.Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
' Suppression du fusionnage
    Selection.UnMerge
' Sélection des matchs de la journée
    Range("B9:C18").Select
    Selection.Copy
' Copie dans le classeur
    Windows("Classeur L1 2008-2009").Activate
    Cells(6 + 18 * (NumeroJournee - 1), 2).Select
    ActiveSheet.Paste
' Sélection d'un joueur
    For i = 1 To JoueursJournee
        Windows("Nom").Activate
        NomJoueur = Cells(8, 8 + 4 * (i - 1))
    ' Savoir si le joueur existe déjà ou pas
        NbreJoueursTotal = Workbooks("Classeur L1 2008-2009").Worksheets("Feuil1").Range("B1").Value
        k = 1
        Do While k < NbreJoueursTotal + 1
            If Workbooks("Classeur L1 2008-2009").Worksheets("Feuil1").Cells(4, 15 + 3 * (k - 1)).Value = NomJoueur Then
                ColonneJoueur = 15 + 3 * (k - 1)
                Exit Do
            Else
                k = k + 1
            End If
        Loop
    ' Copie du nom du joueur
        If k = NbreJoueursTotal + 1 Then
            ColonneJoueur = 15 + 3 * NbreJoueursTotal
            Cells(8, 8 + 4 * (i - 1)).Select
            Application.CutCopyMode = False
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(4, ColonneJoueur).Select
            ActiveSheet.Paste
        ' Fusionnage des cellules
            Range(Cells(4, ColonneJoueur), Cells(4, ColonneJoueur + 2)).Select
            Application.CutCopyMode = False
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlBottom
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With
            Selection.Merge
        ' Copie des votes du joueur
            Windows("Nom").Activate
            Range(Cells(9, 8 + 4 * (i - 1)), Cells(18, 9 + 4 * (i - 1))).Select
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(6 + 18 * (NumeroJournee - 1), ColonneJoueur).Select
            ActiveSheet.Paste
        Else
            Windows("Nom").Activate
            Range(Cells(9, 8 + 4 * (JoueursJournee - 1)), Cells(18, 9 + 4 * JoueursJournee - 1)).Select
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(6 + 18 * (NumeroJournee - 1), ColonneJoueur).Select
            ActiveSheet.Paste
        End If
    Next i
End Sub
 

Bebere

XLDnaute Barbatruc
Re : Userform pour ouvrir un classeur

bonjour Kioups,Mekkaoui,Nolich
vois si cela te convient,à adapter

Sub testfilopen()
Dim F As String, CheminF As String, NomF As String

F = FileOpen

For I = Len(F) To 1 Step -1
If Mid(F, I, 1) = "\" Then Exit For
Next

NomF = Mid(F, I + 1) 'ou Right(F, Len(F) - I)
CheminF = Mid(F, 1, I) 'ou Left(F, Len(F) - Len(NomF))

Workbooks.Open Filename:=NomF

End Sub

Function FileOpen(Optional ByVal sTitle As String = "Choisir le(s) fichier(s)", _
Optional ByVal bAllowMultiSelect As Boolean = False, _
Optional ByVal sFiltreName As String = "Excel", _
Optional ByVal sFiltreContent As String = "*.xls") As String
' CHOIX D'UN FICHIER PAR VBA
'Optional ByVal sFiltreName As String = "Images"
' Optional ByVal sFiltreContent As String = "*.bmp; *.gif; *.jpg; *.jpeg; *.png"

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
Dim vrtSelectedItem As Variant
With fd
.Title = sTitle 'Titre
.AllowMultiSelect = bAllowMultiSelect 'Choix multiples
.Filters.Add sFiltreName, sFiltreContent, 1 'Filtre image
If .Show = -1 Then
For Each vrtSelectedItem In .SelectedItems
FileOpen = Trim(FileOpen & "|" & vrtSelectedItem)
Next vrtSelectedItem
Else
'Bouton Annuler
End If
End With
Set fd = Nothing
End Function

à bientôt
 

kioups

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Merci Bebere...

Je crois que j'ai trouvé plus simple pour ouvrir mon fichier...

Enfin, à vrai dire, je ne comprends pas grand chose à ce que tu as écrit. Comme tu peux le voir, je suis plutôt très amateur en VBA ! ;-)

Là, j'ai plutôt a priori un problème de "noms" entre mes deux macros...

Dans Windows().Activate, entre parenthèses, je dois avoir un nom de classeur sans extension.
Comme ici : Windows("Classeur L1 2008-2009").Activate

Mais quand je mets Windows(Nom).Activate
Nom est le nom avec extension (par exemple Journee1.xlsm ou .xlsx...)

Faudrait que je supprime l'extension et ça devrait rouler, non ????

Kioups
 

kioups

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Bonjour vbacrumble.

Je n'avais pas vu le forum Excel 2007.
Ceci dit, je ne pense pas que mon problème soit lié directement aux extensions .xlsm ou .xlsx...

Et vu l'affluence sur le forum 2007....

A+

Kioups
 

nolich

XLDnaute Occasionnel
Re : Userform pour ouvrir un classeur

Re kioups, bonjour mekkaoui1963 et Bebere, bonjour à toutes et à tous :)

Même échec en mettant
Workbooks(Nom).Activate

Peut-être parce que Nom est un string et devrait être autre chose, non ??

Nom doit être de la forme "NomDuFichier.xls". Pour t'en persuader, ouvre 2 fichiers et va dans un module VBA (n'importe lequel des 2 fichiers) et écris ceci :

Code:
Sub test()
'
Dim Nom1 As String, Nom2 As String
Dim TestNom1 As String, TestNom2 As String
'
  Nom1 = Windows(1).Caption
  Nom2 = Windows(1).Caption
  Windows(Nom1).Activate
  TestNom1 = ActiveWindow.Caption
  Windows(Nom2).Activate
  TestNom2 = ActiveWindow.Caption
End Sub

Puis sous VBA, tu exécutes cette macro en pas à pas (F8 quand le curseur est dans la macro) sans oublier d'afficher la fenêtre des variables locales (dans le menu Affichage).

Tu peux voir ce que ça donne au niveau des noms (propriété Caption).

@+

EDIT : C'est la même chose pour un objet Workbook, mise à part que la propriété utilisée est Name et non Caption...
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 165
Messages
2 085 882
Membres
103 009
dernier inscrit
dede972