Définir un onglet du classeur en tant que variable

Marco56

XLDnaute Nouveau
Bonjour à tous,

Donc voici mon problème.

La macro ouvre une Inputbox en demandant le numéro de la semaine sous le format "semaine 2011" (par exemple la première semaine de janvier "01 2011").

Les onglets du classeur correspondent également aux semaines de l'année 2011, donc la réponse à l'Inputbox doit correspondre au nom d'un onglet. Par exemple, si on demande "quelle semaine ?" et qu'on écrit "17 2011", je souhaite que la réponse à l'Inputbox définisse l'onglet correspondant en tant que variable.

La seconde partie du code (après les '''''''''''') fonctionne mais seulement en fonction de Sheets(1). Je souhaite qu'à la place de Sheets(1), le nom de cette feuille soit remplacée par la variable correspondant à la réponse de l'Inputbox.

La feuille 2 est une constante, donc toutes les données copiées proviennent de cette feuille.

La macro doit en fait copier les données en feuille 2 (feuille constante), et les coller dans la feuille variable (nomf).

Code:
    nomf = InputBox("quelle semaine ?")
    If nomf = "" Then
        MsgBox "Saisie de la semaine impérative! Recommencez...", vbCritical
        Exit Sub
    End If

For Each wkSheet In ActiveWorkbook.Worksheets
    If wkSheet.Name = nomf Then
      
'Là je souhaite que la feuille "nomf" soit définit comme une variable et qu'ensuite je puisse la sélectionner pour y coller les données.
      
    End If
    Next
  
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim datejour As Range                                   'Colle la valeur des heures travaillées si la date et le nom correspondent.
Dim datej As Range
Dim X As Integer

Dim Nom As String, i As Long, j As Long
Sheets("nomf").Select                            'A modifier en fonction de la variable
i = 4                                                   'Démarre en ligne 4 de la feuille "nomf"
With Sheets(2)
  Do While Cells(i, 2) <> "FIN"                         'Exécute jusqu'à trouver la ligne FIN (à modifier)
    Nom = Cells(i, 2)                                   'Définit nom colonne B de la feuille 1
    For j = 4 To .Range("B200").End(xlUp).Row           'Démarre en ligne 4 de la feuille 2
      If Nom = .Cells(j, 2) Then                        'Si le nom de la feuille 1 = nom de la feuille 2
      Set datejour = Worksheets("2").Cells(j, 5)   'Cherche la date du jour en feuille 2
With Worksheets("2").Range("A2:AL2")
Set datej = .Find(datejour, LookIn:=xlFormulas)         'Trouve la date correspondante en feuille "nomf"
X = datej.Column                                        'Définit la variable X
       End With
        Sheets(nomf).Cells(i, X + 3).Value = Sheets(2).Cells(j, 17).Value     'Colle les heures totales travaillées
        Cells(i, X + 3).Interior.ColorIndex = 6                            'Colore en jaune
        Cells(i, X + 3).Select
                                         
            Exit For
      End If
    Next
    i = i + 1
  Loop
End With

Je ne peux malheureusement vous transmettre un fichier exemple puisque ces données sont confidentielles. Pour vous faire une idée, la feuille 2 contient des heures en fonction des personnes, et les autres onglets (semaine 2011), sont des planning en fonction de la semaine.

Merci de votre aide,
Bonne journée :)
 

Modeste

XLDnaute Barbatruc
Re : Définir un onglet du classeur en tant que variable

Bonjour,


Modifie le début de ton code comme ceci:
VB:
Sub lala()
nomf = InputBox("quelle semaine ?")
    If nomf = "" Then
        MsgBox "Saisie de la semaine impérative! Recommencez...", vbCritical
        Exit Sub
    End If
Set mafeuille = Sheets(nomf)
End Sub

mafeuille est à présent une variable de type WorkSheet
 

Marco56

XLDnaute Nouveau
Re : Définir un onglet du classeur en tant que variable

Bonjour Modeste et merci de ta réponse rapide,

Code:
'nomf = InputBox("quelle semaine ?")
    nomf = InputBox("quelle semaine ?")
    If nomf = "" Then
        MsgBox "Saisie de la semaine impérative! Recommencez...", vbCritical
        Exit Sub
    End If
    Set mafeuille = Sheets(nomf)
        
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim datejour As Range                                   'Colle la valeur des heures travaillées si la date et le nom correspondent.
Dim datej As Range
Dim X As Integer

Dim Nom As String, i As Long, j As Long
Sheets(nomf).Select
i = 4                                                   'Démarre en ligne 4 de la feuille 1
With Sheets(2)
  Do While Cells(i, 2) <> "FIN"                         'Exécute jusqu'à trouver la ligne FIN (à modifier)
    Nom = Cells(i, 2)                                   'Définit nom colonne B de la feuille 1
    For j = 4 To .Range("B200").End(xlUp).Row           'Démarre en ligne 4 de la feuille 2
      If Nom = .Cells(j, 2) Then                        'Si le nom de la feuille 1 = nom de la feuille 2
      Set datejour = Worksheets(2).Cells(j, 5)   'Cherche la date du jour en feuille 2
With Worksheets(nomf).Range("A2:AL2")
Set datej = .Find(datejour, LookIn:=xlFormulas)         'Trouve la date correspondante en feuille 1
X = datej.Column                                        'Définit la variable X
       End With
        Sheets(nomf).Cells(i, X + 3).Value = Sheets(2).Cells(j, 17).Value     'Colle les heures totales travaillées
        Cells(i, X + 3).Interior.ColorIndex = 6                            'Colore en jaune
        Cells(i, X + 3).Select
    Selection.NumberFormat = "0.0"
        Sheets(nomf).Cells(i, 39).Value = Sheets(2).Cells(j, 20).Value        'Colle l'avance ou le retard
        Cells(i, 39).Select
    Selection.NumberFormat = "0.00"                                        'Prends le format avec deux décimales
        Sheets(nomf).Cells(i, 40).Value = Sheets(2).Cells(j, 21).Value        'Colle le solde de RCR
        Cells(i, 40).Select
    Selection.NumberFormat = "0.00"                                        'Prends le format avec deux décimales
        Sheets(nomf).Cells(i, X + 1).Value = Sheets(2).Cells(j, 28).Value
        Cells(i, X + 1).Select
    Selection.NumberFormat = "h:mm;@"
        Sheets(nomf).Cells(i, X + 2).Value = Sheets(2).Cells(j, 29).Value
        Cells(i, X + 2).Select
    Selection.NumberFormat = "0.00"
                                         
            Exit For
      End If
    Next
    i = i + 1
  Loop
End With

Donc voilà j'ai modifié le code avec le nom de la feuille "nomf".
Mais maintenant j'ai une erreur qui n'apparaissait pas avant.
X = datej.Column apparait comme une erreur "Variable objet ou variable de bloc With non définie". Pourtant, la variable est définie, donc je ne vois pas trop l'erreur...

Merci de votre aide ;)
 

Modeste

XLDnaute Barbatruc
Re : Définir un onglet du classeur en tant que variable

Re-bonjour,

Je repassais voir où tu en étais ... l'absence de réponses indique peut-être que le code, sans fichier, ne permet pas de déterminer ce qui "coince". Point n'est besoin de tout le fichier et moins encore des données confidentielles ou sensibles (une vingtaine de lignes avec des noms "bidons" devraient suffire)

Seule hypothèse que je puisse formuler à ce stade: la recherche de la date n'a pas abouti et le X=datej.column provoque une erreur. Comme tu alternes entre la feuille indiquée dans l'inputbox et ta feuille 2, difficile de s'y retrouver sans savoir comment ton fichier se présente.
Si tu n'as pas trouvé de solution, essaie de recréer un fichier de même structure, mais "allégé" et "anonyme".
 

nyko283

XLDnaute Occasionnel
Re : Définir un onglet du classeur en tant que variable

Bonsoir à tous,

une autre piste, regarde ta methode find "Find(datejour, LookIn:=xlFormulas)" ne faudrait'il pas plutot rechercher dans les valeurs au lieu de la formule. "Find(datejour, LookIn:=xlValues)"
 

Marco56

XLDnaute Nouveau
Re : Définir un onglet du classeur en tant que variable

Bonsoir à tous,

Tout d'abord, merci de votre aide.

Modeste, j'ai fais une éxecution pas à pas, et il trouve bien la date en question.
nyko283, j'avais intégré Values au début de la macro et ça ne fonctionnait pas justement, c'est pourquoi on m'avait conseillé de le remplacer par Formulas

Je vous transmet un fichier exemple basique pour vous aider à comprendre.

Merci de votre aide ;)
 

Pièces jointes

  • Fichier exemple.xls
    114 KB · Affichages: 51
  • Fichier exemple.xls
    114 KB · Affichages: 51
  • Fichier exemple.xls
    114 KB · Affichages: 50

Modeste

XLDnaute Barbatruc
Re : Définir un onglet du classeur en tant que variable

Bonsoir Marco56, le fil,

j'ai fais une éxecution pas à pas, et il trouve bien la date en question
... Ah ben, en tout cas, sur ma machine (en Xl 2000, ici), datej vaut Nothing
Par contre
Code:
Set datej = .Find(datejour.Value, LookIn:=xlFormulas)
semble fonctionner.
 

Marco56

XLDnaute Nouveau
Re : Définir un onglet du classeur en tant que variable

Toujours la même erreur...

Je vous transmet le code complet avec des annotations :

Code:
Sub Extract()
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
Dim MonFichier As String
 Range("A1").Select                                  'Extraction du fichier texte "Extract_exemple.txt"
    MonFichier = Application.GetOpenFilename
      Workbooks.Open MonFichier
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;S:\prestation\STAGIAIRES\Marc\Dossier Extract temps\Extract_exemple.txt" _
        , Destination:=Range("A1"))
        .Name = "Fichier extrait"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With                                     'Fin de l'extraction du fichier texte
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    Windows("Extract_exemple.txt").Activate             'Récupération du fichier texte
    Range("A1:O50").Select
    Selection.Copy                                      'Copie la plage de données A1:O500
    Windows("Planning_exemple.xls").Activate            'Sélectionne le classeur Planning_exemple
    Sheets("ExtracEt").Select
    ActiveSheet.Paste                                   'Colle la plage de données en feuille ExtracEt
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
Set bk1 = Workbooks("Extract_exemple.txt")               'Ferme le fichier "Extract_exemple"
bk1.Close savechanges:=False                             'Ne sauvegarde pas les changements du fichier

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Range("Q4").Select                                  'Création de la colonne des heures
    ActiveCell.FormulaR1C1 = "=RC[-3]/60"               'Divise la colonne HJJOU/60
    Range("Q4").Select
    Selection.AutoFill Destination:=Range("Q4:Q50"), Type:=xlFillDefault
    Range("Q4:Q50").Select
    Selection.NumberFormat = "0.0"                      'Prends le format avec deux décimales
    
    Range("R4").Select                                  'Création de la colonne H début
    ActiveCell.FormulaR1C1 = "=RC[-5]/60/24"            'Divise la colonne HJEMBAUC/60/24
    Range("R4").Select
    Selection.AutoFill Destination:=Range("R4:R50"), Type:=xlFillDefault
    Range("R4:R50").Select
    Selection.NumberFormat = "h:mm;@"                   'Prends le format de l'heure

    Range("S4").Select                                  'Création de la colonne H fin
    ActiveCell.FormulaR1C1 = "=RC[-8]/60/24"            'Divise la colonne HJDEBAUC/60/24
    Range("S4").Select
    Selection.AutoFill Destination:=Range("S4:S50"), Type:=xlFillDefault
    Range("S4:S50").Select
    Selection.NumberFormat = "h:mm;@"                   'Prends le format de l'heure
    
    Range("T4").Select                                  'Création de la colonne Avance/Retard
    ActiveCell.FormulaR1C1 = "=RC[-8]/60"               'Divise la colonne HJDELRAJ/60
    Selection.AutoFill Destination:=Range("T4:T400"), Type:=xlFillDefault
    Range("T4:T50").Select
    Selection.NumberFormat = "0.00"                     'Prends le format avec deux décimales
    
    Range("U4").Select                                  'Création de la colonne RCR
    ActiveCell.FormulaR1C1 = "=RC[-6]/60/7.24"          'Divise la colonne HJSOLRCR/60
    Selection.AutoFill Destination:=Range("U4:U50"), Type:=xlFillDefault
    Range("U4:T50").Select
    Selection.NumberFormat = "0.00"                     'Prends le format avec deux décimales
     
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Range("V4").Select
    ActiveCell.FormulaR1C1 = "=HOUR(RC[-4])"
    Selection.AutoFill Destination:=Range("V4:V50"), Type:=xlFillDefault
    
    Range("W4").Select
    ActiveCell.FormulaR1C1 = "=MINUTE(RC[-5])"
    Selection.AutoFill Destination:=Range("W4:W50"), Type:=xlFillDefault
    
    Range("X4").Select
    ActiveCell.FormulaR1C1 = "=RC[-2]&""h""&RC[-1]"
    Selection.AutoFill Destination:=Range("X4:X50"), Type:=xlFillDefault
    
    Range("Y4").Select
    ActiveCell.FormulaR1C1 = "=HOUR(RC[-6])"
    Selection.AutoFill Destination:=Range("Y4:Y50"), Type:=xlFillDefault
    
    Range("Z4").Select
    ActiveCell.FormulaR1C1 = "=MINUTE(RC[-7])"
    Selection.AutoFill Destination:=Range("Z4:Z50"), Type:=xlFillDefault
    
    Range("AA4").Select
    ActiveCell.FormulaR1C1 = "=RC[-2]&""h""&RC[-1]"
    Selection.AutoFill Destination:=Range("AA4:AA50"), Type:=xlFillDefault
    
    Range("AB4").Select                                  'Création de la colonne des horaires de la journée
    ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-4]&"" - "",RC[-1])"
    Selection.AutoFill Destination:=Range("AB4:AB50"), Type:=xlFillDefault
     
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Range("AC4").Select                                  'Création de la colonne Pause
    ActiveCell.FormulaR1C1 = "=RC[-21]/60"               'Divise la colonne HJABSPAU/60/24
    Selection.AutoFill Destination:=Range("AC4:AC400"), Type:=xlFillDefault
    Range("AC4:AC400").Select
    Selection.NumberFormat = "0.00"                      'Prends le format de l'heure
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
    Range("AD4").Select                                  'Création de la colonne Nombre semaine
    ActiveCell.FormulaR1C1 = "=INT(MOD(INT((RC[-25])/7)+0.6,52+5/28))+1"
    Selection.AutoFill Destination:=Range("AD4:AD400"), Type:=xlFillDefault
    
    Range("AE4").Select
    ActiveCell.FormulaR1C1 = "=RC[-1]& "" 2011"""
    Selection.AutoFill Destination:=Range("AE4:AE400"), Type:=xlFillDefault
   
                        
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim intI As Integer                                     'Suppression des lignes vides
intI = 4

Do While Cells(intI, 1) <> ""                           'Exécute jusqu'à trouver une ligne vide en colonne HJJOU
    If Cells(intI, 14) = 0 Then                         'Si la cellule de la colonne Q = 0
        Rows(intI).Delete                               'Alors on supprime la ligne
    Else
        intI = intI + 1
    End If
Loop

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

nomf = InputBox("Quelle semaine ?")                     'Demande la semaine
    If nomf = "" Then
        MsgBox "Saisie de la semaine impérative! Recommencez...", vbCritical
        Exit Sub
    End If
    
    Set mafeuille = Sheets(nomf)                        'Définit la feuille nomf en tant que variable
        
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim datejour As Range                                   'Colle la valeur des heures travaillées si la date et le nom correspondent.
Dim datej As Range
Dim X As Integer

Dim Nom As String, i As Long, j As Long
Sheets(nomf).Select
i = 4                                                   'Démarre en ligne 4 de la feuille 1
With Sheets("ExtracEt")
  Do While Cells(i, 2) <> "FIN"                         'Exécute jusqu'à trouver la ligne FIN (à modifier)
    Nom = Cells(i, 2)                                   'Définit nom colonne B de la feuille correspondant à la semaine
    For j = 4 To .Range("B200").End(xlUp).Row           'Démarre en ligne 4 de la feuille ExtracEt
      If Nom = .Cells(j, 2) Then                        'Si le nom de la feuille 1 = nom de la feuille 2
      Set datejour = Worksheets("ExtracEt").Cells(j, 5) 'Cherche la date du jour en feuille 2
With Worksheets(nomf).Range("A2:AL2")
Set datej = .Find(datejour, LookIn:=xlFormulas)         'Trouve la date correspondante en feuille 1

Sheets(nomf).Select

X = datej.Column                                       'Définit la variable X
       End With
        Sheets(nomf).Cells(i, X + 3).Value = Sheets("ExtracEt").Cells(j, 17).Value     'Colle les heures totales travaillées
        Cells(i, X + 3).Interior.ColorIndex = 6                                        'Colore en jaune
        Cells(i, X + 3).Select
    Selection.NumberFormat = "0.0"
        Sheets(nomf).Cells(i, 14).Value = Sheets("ExtracEt").Cells(j, 20).Value        'Colle l'avance ou le retard
        Cells(i, 14).Select
    Selection.NumberFormat = "0.00"                                                     'Prends le format avec deux décimales
        Sheets(nomf).Cells(i, 15).Value = Sheets("ExtracEt").Cells(j, 21).Value         'Colle le solde de RCR
        Cells(i, 15).Select
    Selection.NumberFormat = "0.00"                                                     'Prends le format avec deux décimales
        Sheets(nomf).Cells(i, X + 1).Value = Sheets("ExtracEt").Cells(j, 28).Value      'Colle la plage horaire travaillée
        Cells(i, X + 1).Select
    Selection.NumberFormat = "h:mm;@"
        Sheets(nomf).Cells(i, X + 2).Value = Sheets("ExtracEt").Cells(j, 29).Value      'Colle le temps de pause
        Cells(i, X + 2).Select
    Selection.NumberFormat = "0.00"
                                         
            Exit For
      End If
    Next
    i = i + 1
  Loop
End With

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Columns("A:AN").Select                                                    'Ajuste les colonnes de la feuille correspondante
Selection.Columns.AutoFit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Sheets("ExtracEt").Select
'Columns("Q:BA").Delete                                                    'Supprime les colonnées crées de la feuille ExtracEt

Sheets(nomf).Select
Cells(1, 1).Select

End Sub

Merci de votre aide :)
 

Modeste

XLDnaute Barbatruc
Re : Définir un onglet du classeur en tant que variable

Bonsoir Marco56,

Ce code ressemble furieusement à celui qui figurait dans ton fichier d'hier (même s'il était présent presque à l'identique dans 2 Modules distincts :confused:)
Le problème est que, comme tel et appliqué au fichier transmis, le code ne saurait pas fonctionner ... donc il ne me paraît pas possible de détecter que la date est trouvée (et que l'erreur est ailleurs)
VB:
Do While Cells(i, 2) <> "FIN"
Même s'il y a un "With sheets("ExtracEt")" à la ligne du dessus, "cells(i, 2)" doit s'appliquer à la feuille active ... laquelle ne contient pas le mot "FIN" ... la boucle risque donc d'être longue!

VB:
For j = 4 To .Range("B200").End(xlUp).Row
Cette instruction doit s'appliquer à la feuille "ExtracEt" (cfr le With un peu plus haut). Or dans cette même feuille, la colonne B est vide.
Par ailleurs, pourquoi commencer en ligne 4??

Bref, il n'est pas possible de déterminer où il pourrait y avoir une (des?) erreur(s). La seule chose que je peux dire c'est qu'en ne gardant que la partie du code dont tu dis qu'elle pose problème, en modifiant ledit code pour qu'il s'adapte au fichier que tu as transmis et en l'exécutant, Excel trouve bien la colonne dans laquelle figure la date cherchée.
Il me semble avoir lu un jour (mais où??) que l'utilisation de la fonction MATCH() permettait de contourner la difficulté. Par ailleurs, de nombreuses discussions font référence au fait que les critères de recherche (avec Find ou Ctrl+f) sont mémorisés, d'une exécution à l'autre ... voir si un paramètre supplémentaire ne serait pas activé?
 

Discussions similaires

Réponses
5
Affichages
421

Membres actuellement en ligne

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette