IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction AddFromString sur un classeur créé en vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut Fonction AddFromString sur un classeur créé en vba
    Bonjour à tous,

    Je possède la procédure suivante :

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub copie_données()
     
    Dim chemf As String
    Dim nomf As String
     
    'Sélection du fichier contenant  les données
    chemf = Application.GetOpenFilename("Fichiers Excel, *.xlsx", , "Sélectionnez le fichier de données", "Importer")
     
    Application.ScreenUpdating = False
     
    'Ouverture du fichier et récupération des variables
    Workbooks.Open (chemf)
    nomf = ActiveWorkbook.Name
    pos = InStr(ActiveWorkbook.Name, ".xls")
    chem = Left(nomf, pos - 1)
     
    'Copie des données dans le classeur "Suivi base horaire" et fermeture/suppression du fichier de données
    Workbooks("Suivi base horaire.xlsm").Sheets("Données").Range("A1:Z5000") = Workbooks(nomf).Sheets("sheet1").Range("A1:Z5000").Value
    Workbooks(nomf).Close
    Kill chemf
     
    'Sauvegarde du classeur à la place du fichier de données, avec le même nom que ce dernier
    ActiveWorkbook.SaveAs Filename:="M:\Administration\Secrétariat RH\LOGICIELS RH\CHARLES\KELIO\Suivi base horaire\2017\" & chem & ".xlsm"
    Application.ScreenUpdating = True
     
    ActiveSheet.Range("D8").Font.ColorIndex = 10
     
    End Sub

    Elle me permet en substance de récupérer des données d'un fichier dans un classeur modèle, puis d'enregistrer ce classeur modèle à la place du fichier de données. Ainsi je conserve intact mon classeur modèle, et j'ai une copie des données puisque la manipulation doit être effectuée chaque semaine.

    Cela fonctionne très bien. Cependant, j'ai ensuite le code suivant :

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        Dim Ws As Worksheet
     
        For i = 1 To Nbresp
            cFeuil = Worksheets("Modèle").Cells(i, 1).Value
     
                Set Ws = ThisWorkbook.Worksheets(cFeuil)
                With ThisWorkbook
                    With .VBProject.VBComponents(Ws.CodeName).CodeModule 'Copie l'onglet sans les macro de la feuille
                        .AddFromString "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbLf & _
                                       "If Not Application.Intersect(Target, Range(""A1"")) Is Nothing Then" & vbLf & _
                                       "Worksheets(""Modèle"").Activate" & vbLf & _
                                       "End If" & vbLf & _
                                       "End Sub"
                    End With
                End With
        Next

    Qui me permet d'insérer du code vba dans chaque page du classeur (une vingtaine au total). Ces pages sont créées en vba juste avant dans la même procédure.

    Ce code me renvoi une erreur d'exécution 9 : Cet indice n'appartient pas à la sélection sur cette ligne :

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    With .VBProject.VBComponents(Ws.CodeName).CodeModule 'Copie l'onglet sans les macro de la feuille

    Pourtant en posant un espion sur mes variables, elles contiennent les bonnes données.

    De plus, lorsque je ferme le classeur nouvellement créé grâce au vba puis que je l'ouvre à nouveau, à ce moment là la procédure s'exécute correctement.

    Erratum : La première fois que je lance la procédure elle plante, mais si je la relance ensuite elle fonctionne. :/

    C'est comme si le fait d'enregistrer sous en vba et de lancer la seconde procédure directement après provoquait un conflit dans mes vba projects.

    Mais là je sèche un peu pour comprendre pourquoi.

    Merci d'avance pour toute aide sur la question,

    Sardaucar

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Combien de classeurs ouverts quand tu lances ta macro d'insertion de code?

    Je soupçonne la ligne 4

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    A priori 1 seul puisque dans la procédure précédente de ferme le classeur de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks(nomf).Close
    Kill chemf

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Change ta ligne 4 et regarde la msgbox ce que donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cFeuil = ThisWorkbook.Worksheets("Modèle").Cells(i, 1).Value
                Set Ws = ThisWorkbook.Worksheets(cFeuil)
                msgbox Ws.CodeName

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    Ca me renvoi le numéro de la feuille "Feuil24" qui correspond au nom de la feuille contenu dans la variable cFeuil, toujours le même message d'erreur par contre :/.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je ne vois pas l'erreur

    Sinon, au lieu d'insérer le même code dans toutes tes feuilles, utiliser plutôt l'évènement SheetBeforeDoubleClick

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
     
    If Sh.name<>"Modèle" And Target.address="$A$1" then
         Cancel=true
         Worksheets("Modèle").Activate
    end if
    End Sub

Discussions similaires

  1. [XL-2007] Focus sur 2e classeur Excel en VBA
    Par Fanfan2A dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/06/2015, 18h35
  2. [XL-2007] Problème fonction CountIfs sur plusieurs classeurs fermés
    Par Qril59 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/04/2013, 09h45
  3. [VBA-E]:copier entre deux tableaux sur deux classeurs
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 39
    Dernier message: 28/06/2006, 15h39
  4. VBA-E comment exécuter un code sur un classeur complet?
    Par djulegnome dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/06/2006, 12h29
  5. [VBA-E]travail sur deux classeurs excel
    Par richou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo