Ouvrir un fichier excel caché depuis excel

Balata9 -  
 Balata9 -
Bonjour à tous,

Je cherche un moyen d'ouvrir un fichier excel "CALCUL PRODUCTION JOUR" au début d'une macro car la macro va chercher des données dans "CALCUL PRODUCTION JOUR". Cependant, j'aimerais que ce fichier s'ouvre de manière caché et se referme à la fin de la macro.

J'ai écrit la macro suivante mais ca ne marche pas:

Sub FaibleProductible()

Dim xlApp As New Excel.Application ' déclarer Public si dans un module
Dim xlBook As New Excel.Workbook
Dim xlSheet As New Excel.Worksheet

'Ouvrir le classeur dont on a besoin avec tout le chemin...
Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\utilisateur\Bureau\CONNECTIS MARTINIQUE\CALCUL PRODUCTION JOUR.xls")
Set xlSheet = xlBook.Sheets("CALCULS") ' si on veut utiliser une feuille en particulier

La je met la macro qui va chercher les données dans "CALCUL PRODUCTION JOUR"


xlBook.Close
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
End Sub


On dirais que le fichier ne s'ouvre pas car j'ai l'erreur suivante: "l'indice n'appartient pas à la sélection". Merci d'avance pour votre aide

6 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    J'ai testé en lisant une cellule, le fichier est bien ouvert.

    Je me demande quand même pourquoi :
    Dim xlSheet As New Excel.Worksheet
    et non :
    Dim xlSheet As Worksheet
    puisque la feuille est existante dans le classeur, mais les 2 versions fonctionnent
    eric
    0
  2. Balata9
     
    Pourtant, ca ne marche pas pour moi. Je te met le code en entier, peut être que tu auras une idée de ce qu'il se passe:

    Sub FaibleProductible()
    
    Dim xlApp As New Excel.Application 
    Dim xlBook As New Excel.Workbook
    Dim xlSheet As Worksheet
    
    'Ouvrir le classeur dont on a besoin avec tout le chemin...
    Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\utilisateur\Bureau\CONNECTIS MARTINIQUE\CALCUL PRODUCTION JOUR.xls")
    Set xlSheet = xlBook.Sheets("CALCULS") ' si on veut utiliser une feuille en particulier
    
    Dim i As Long
    Dim j As Long
    Dim DATA As Long
    Dim REF As Long
    
    ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B26:E300").ClearContents
    
    j = 26 'Début du tableau de la page TABLEAU DE CONTROLE'
    
    For i = 8 To 180
    
    
    If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i) = 0 Then
    
            Else
    
    DATA = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Cells(i, 9)
    REF = ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C22")
    
    End If
    
    If DATA < REF Then
    
        If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i) = 0 Then
        
        Else
    
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("A" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("I" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("D" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("J" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("E" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("L" & i)
          
          
        j = j + 1
    
        End If
    
    End If
    
    Next i
    
    'Important en quittant le programme ou quand on n'en a plus besoin xlBook.Close
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    End Sub


    Si tu comprends le problème c'est super!
    0
  3. Balata9
     
    Pourtant, ca ne marche pas pour moi. Je te met le code en entier, peut être que tu auras une idée de ce qu'il se passe:

    Sub FaibleProductible()
    
    Dim xlApp As New Excel.Application 
    Dim xlBook As New Excel.Workbook
    Dim xlSheet As Worksheet
    
    'Ouvrir le classeur dont on a besoin avec tout le chemin...
    Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\utilisateur\Bureau\CONNECTIS MARTINIQUE\CALCUL PRODUCTION JOUR.xls")
    Set xlSheet = xlBook.Sheets("CALCULS") ' si on veut utiliser une feuille en particulier
    
    Dim i As Long
    Dim j As Long
    Dim DATA As Long
    Dim REF As Long
    
    ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B26:E300").ClearContents
    
    j = 26 'Début du tableau de la page TABLEAU DE CONTROLE'
    
    For i = 8 To 180
    
    
    If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i) = 0 Then
    
            Else
    
    DATA = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Cells(i, 9)
    REF = ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C22")
    
    End If
    
    If DATA < REF Then
    
        If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i) = 0 Then
        
        Else
    
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("A" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("I" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("D" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("J" & i)
        ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("E" & j) = Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("L" & i)
          
          
        j = j + 1
    
        End If
    
    End If
    
    Next i
    
    'Important en quittant le programme ou quand on n'en a plus besoin xlBook.Close
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    End Sub


    Si tu comprends le problème c'est super!
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Pas trop le temps actuellement mais tu devrais préciser en quelle ligne tu as 'l'indice n'appartient pas à la sélection'

      If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i)
      Pourquoi utiliser Workbooks("CALCUL PRODUCTION JOUR") alors que tu as défini xlbook ?
      0
  4. Balata9
     
    J'obtiens le message d'erreur à la ligne suivante:

    If Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS").Range("D" & i) = 0 Then

    Cela vient peut être du fait que, comme tu dis, j'ai déja défini xlbook. Mais je ne comprend pas comment l'écrire.

    Merci encore
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Bonjour,

      Pour désigner un classeur (même ouvert), il faut mettre le chemin entier dans la désignation du classeur:
      Workbook(C:\Documents and Settings\utilisateur\Bureau\CONNECTIS MARTINIQUE\CALCUL PRODUCTION JOUR.xls") par exemple.

      Dans le code, le classeur "CALCUL PRODUCTION JOUR.xls" est instancié dans un objet xlBook et la feuille "CALCULS" de ce calsseur pas xlSheet, il faut donc les utiliser.

      Sub FaibleProductible()
      
      Dim xlApp As New Excel.Application
      Dim xlBook As New Excel.Workbook
      Dim xlSheet As Worksheet
      
      'Ouvrir le classeur dont on a besoin avec tout le chemin...
      Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\utilisateur\Bureau\CONNECTIS MARTINIQUE\CALCUL PRODUCTION JOUR.xls")
      Set xlSheet = xlBook.Sheets("CALCULS") ' si on veut utiliser une feuille en particulier
      
      Dim i As Long
      Dim j As Long
      Dim DATA As Long
      Dim REF As Long
      
      ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B26:E300").ClearContents
      
      j = 26 'Début du tableau de la page TABLEAU DE CONTROLE'
      
      For i = 8 To 180
      
      
      If xlSheet.Range("D" & i) = 0 Then
      
              Else
      
      DATA = xlSheet.Cells(i, 9)
      REF = ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C22")
      
      End If
      
      If DATA < REF Then
      
          If xlSheet.Range("D" & i) = 0 Then
          
          Else
      
          ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("B" & j) = xlSheet.Range("A" & i)
          ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("C" & j) = xlSheet.Range("I" & i)
          ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("D" & j) = xlSheet.Range("J" & i)
          ThisWorkbook.Worksheets("TABLEAU DE CONTROLE").Range("E" & j) = xlSheet.Range("L" & i)
            
            
          j = j + 1
      
          End If
      
      End If
      
      Next i
      
      'Important en quittant le programme ou quand on n'en a plus besoin xlBook.Close
      xlApp.Quit
      Set xlSheet = Nothing
      Set xlBook = Nothing
      Set xlApp = Nothing
      
      End Sub


      ;o)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Balata9
     
    Finalement j'ai trouvé comment faire, c'était tout bête. Il faut en effet remplacer Workbooks("CALCUL PRODUCTION JOUR").Worksheets("CALCULS"). par xlBook.Sheets("CALCULS")

    Merci pour ton aide eriic
    0