OVH Cloud OVH Cloud

pb de transfert d'une date de chaque feuille sur la 1ère feuille

12 réponses
Avatar
Antoine76
Bonsoir

Je butte sur le problème suivant (XP - Excel 2000) : à partir de chaque
feuille, je souhaite récupérer la date la plus récente de chaque feuille
située dans la plage K8 à K200 (plage qui ne contient que des dates), et la
transférer sur la colonne H (à partir de la cellule H1) de la 1ère feuille.
Voici ce que j'ai essayé de faire à partir de la fonction Max de Excel, mais
qui bloque.
Dim c As Range, d As Date
With ActiveSheet.Range("H2")
i = 0
For Each f In ActiveWorkbook.Worksheets
Set c = Worksheets(i).Range("K8:K200")
d = Application.WorksheetFunction.Max("A10:A200")
.Offset(i) = d
i = i + 1
Next
End With

Je ne sais pas ce que cela vous évoque (qui soit remédiable, de préférence
!) ?

Merci à tous

Antoine

2 réponses

1 2
Avatar
LSteph
Re, bonjour,
outre le fait que en amont de ce fil j'ai essayé de faire selon ta demande
par macro,
il est clair que sur le principe JB a parfaitement raison, par formule
l'utilisation de indirect serait tout a fait appropriée ici et possiblement
moins lourde comme solution.


Malheureusement, je ne peut pas me tourner vers une formule directe dans
la
cellule, car toutes les feuilles ont un nom défini
Rien empêche de laisser en macro l'inventaire des noms de feuilles dans une

colonne.
En plus tu n'aurais plus besoin de triturer à chaque fois les formats par
macro
mettre une MEFC pour délimiter le tableau, le cas échéant.
Par ailleurs le recours ici à un auto_open n'est pas forcément la bonne
solution:
-déjà le cas échéant amha préférable une private sub Workbook_open()
dans le thisworkbook
- de plus la nécessité de mettre à jour sommaire semble plutôt relever de
l'ajout et/ou
la mise à jour de feuilles correspondant à un salarié (si j'ai bien
compris!).
Donc auto open pas vraiment indispensable,
plutôt un moyen de mise à jour à la demande ou sur un autre évènement.

Mais c'est toi qui vois

Amicalement.

lSteph


"Antoine76" a écrit dans le message de news:
%
bonjour JB

Malheureusement, je ne peut pas me tourner vers une formule directe dans
la
cellule, car toutes les feuilles ont un nom défini (celui du salarié qui
est
en arrêt de travail) et d'autre part, parce que le nombre de feuilles sera
amener à s'accroître avec les futurs arrêts de travail qui arriveront , en
prenant le nom du nouveau salarié en arrêt ; C'est pourquoi je mets ce
programme en Auto_Open pour qu'il actualise à l'ouverture, sur une partie
de
la feuille 1( "Sommaire") l'état instantané de toutes les situations dans
les cellules de la colonne C de la 1ère feuille (Date de fin d'arrêt)
avec
pour contenu, soit "En Cours" (si la cellule D3 de la feuille i affiche
"En
Cours" - résultat déjà issu d'une formule), soit une date que je vais
rechercher par la formule en VBA Max de J8 à J25 de la feuille i de
l'arrêt
de travail considéré.

Pas très simple à expliquer !


ci-joint le code où je bloque ...

With ActiveSheet.Range("C2")
i = 0
For Each wsh In ActiveWorkbook.Worksheets
i = i + 1
With wsh.Cells(3, 4)
If .Value = "En Cours" Then
ActiveSheet.Cells(i + 1, 3) = "En cours"
Else
ActiveSheet.Cells(i + 1, 3) > Application.WorksheetFunction.Max(wsh.Range("J8:J200"))
End If
End With
Next
End With

Merci à toi

Antoine

"JB" a écrit dans le message de news:

Bonjour,

Solution tableur (tj à jour)

PJ: http://cjoint.com/?mCh4sad2in

Cas 1:Si les feuilles ont pour nom Feuil1,Feuille2,...

En H1: =MAX(INDIRECT("Feuil"&LIGNE()&"!K8:K20"))

Cas2: Si les feuilles n'ont pas de nom générique, écrire en colonne
L par ex les noms des feuilles:

En M1: =MAX(INDIRECT(L1&"!K8:K20"))

Cordialement JB




Avatar
Antoine76
Je viens de l'installer : C'est clair, c'est simple (quand on le lit!), et
ça fonctionne net et sans bavure !
Que dire de plus, si ce n'est que c'est exactement ce que j'attendais, et
que j'aurais bien voulu le "pondre" tout seul (reste de fierté sans doute),
et enfin que je ne connaissais pas l'usage de If Not ...Like et que....
Merci(bis ou plutôt tiers!)

Antoine

"LSteph" a écrit dans le message de news:

Bonjour Antoine,
Il semble pouvoir être quelque peu épuré aussi toutes les suppressions au
début
et remises ensuite de formatsmais je ne m'intéresserais ici qu'à l'objet
du

fil,
moyennant également que les variables sont déjà déclarées en haut
Alors après ceci
' sélectionne la cellule B1 de la feuille "Sommaire"
Sheets("Sommaire").Select
et avant cela


For Each H In Worksheets("Sommaire").Hyperlinks
je te propose donc de remplacer toute la série de boucles successives par



ceci:
''''''
For Each wsh In ActiveWorkbook.Sheets
i = i + 1

ActiveSheet.Hyperlinks.Add Anchor:Îlls(i + 1, 1), Address:="", _
SubAddress:="'" & wsh.Name & "'" & "!A1", TextToDisplay:=wsh.Name
Cells(i + 1, 2) = wsh.Range("B8")
Cells(i + 1, 3) = wsh.Range("D3")
If Not LCase(Cells(i + 1, 3)) Like "en cours" Then Cells(i + 1, 3) = _
Application.WorksheetFunction.Max(wsh.Range("J8:J200"))
Cells(i + 1, 4) = wsh.Range("c2")
Next
'''''
''dis moi si cela convient
'lSteph




"Antoine76" a écrit dans le message de news:
%
Réflexion faite, pourquoi pas , et plus tôt que prévu !

J'ai repris le programme et l'ai adapté plus précisément aux cellules
"cibles" (colonne C au lieu de H en commençant à partir de la 2ème
ligne),


adaptation qui n'a pas posée de problème.

Là où la situation est en fait un peu plus complexe; c'est qu'avant ce
morceau de programme que tu m'a débloqué, il y en une autre partie, qui
va


rechercher dans toutes ces mêmes feuilles la valeur de la cellule D3
pour


les transférer au préalable sur chacune de ces mêmes cellules. La valeur
contenue dans ces cellules ne peut-être que "En Cours" ou "Soldé". Le
programme que tu m'a débloqué intervient alors seulement pour mettre à
la


place, dans ces cellules transférées, la date de fin de l'arrêt de
travail


pour le cas où il est "Soldé" (dans le cas où il est toujours "En
Cours",


il doit alors uniquement rester "En Cours". Et c'est là que j'ai un
autre


petit blocage, car je n'arrive pas à faire passer en VBA la logique de
fusion de ces 2 concepts : si la cellule Di (qui contient la valeur
transférée de la cellule D3 de chaque feuille j du classeur) a la valeur
"En
Cours", garder "En Cours" pour valeur ; Sinon (c'est à dire si sa valeur
est
égale à "Soldé"), dans ce cas, remplacer "Soldé" par la valeur que la
routine que tu m'as déboguée fournit (date où l'arrêt de travail a été
soldé, c'est à dire la valeur transférée par la routine que tu m'as
débogué). Ci- joint la 1ère et la 2ème partie de programme ; le problème
est
que je n'arrive pas les articuler !

PGM N° 1

With ActiveSheet.Range("C2")
i = 0
For Each wsh In ActiveWorkbook.Worksheets
.Offset(i) = wsh.Range("D3")
i = i + 1
Next
End With


PGM N° 2

With ActiveSheet.Range("C2")
i = 0
For Each wsh In ActiveWorkbook.Worksheets
i = i + 1
If ActiveSheet.Cells(i + 1, 3).Value = "En Cours" Then
Else
ActiveSheet.Cells(i + 1, 3) > > Application.WorksheetFunction.Max(wsh.Range("J8:J200"))
End If
Next
End With

Je ne sais pas si j'ai su exprimer clairement ce que je recherche...
Sinon, j'ai mis le fichier sur Cjoint...
http://cjoint.com/?mBxdznWeEx
Je sais pas si tu vas réussir à comprendre ce que je recherche !

Avec mes remerciements

Antoine

"LSteph" a écrit dans le message de news:
#
Si,si "Merci!"
;o)
cela fait plaisir. ..

..si tu ne veux pas du nom de feuille en G
change le numéro de colonne ou enlève ceci:
ActiveSheet.Cells(i, 7) = wsh.Name

Si qqchose t'échappe dans le code demande le, il vaut mieux n'utiliser
que
des codes que l'on comprend!

A bientôt.

lSteph


"Antoine76" a écrit dans le message de news:

Cela marche parfaitement !

Que dire de plus à part "merci" !

Antoine

"LSteph" a écrit dans le message de news:

Bonjour Antoine,
Résultat en G nom de feuille en H date Max
'*****
Sub testdate()
Dim wsh As Worksheet, i As Integer
For Each wsh In ActiveWorkbook.Worksheets
i = i + 1
ActiveSheet.Cells(i, 8) = _
Application.WorksheetFunction.Max(wsh.Range("k8:k200"))
ActiveSheet.Cells(i, 7) = wsh.Name
Next
End Sub
'****

'lSteph

"Antoine76" a écrit dans le message de news:

Bonsoir

Je butte sur le problème suivant (XP - Excel 2000) : à partir de
chaque




feuille, je souhaite récupérer la date la plus récente de chaque
feuille
située dans la plage K8 à K200 (plage qui ne contient que des
dates),
et
la
transférer sur la colonne H (à partir de la cellule H1) de la 1ère
feuille.
Voici ce que j'ai essayé de faire à partir de la fonction Max de
Excel,




mais
qui bloque.
Dim c As Range, d As Date
With ActiveSheet.Range("H2")
i = 0
For Each f In ActiveWorkbook.Worksheets
Set c = Worksheets(i).Range("K8:K200")
d > >> >> > Application.WorksheetFunction.Max("A10:A200")
.Offset(i) = d
i = i + 1
Next
End With

Je ne sais pas ce que cela vous évoque (qui soit remédiable, de
préférence


!) ?

Merci à tous

Antoine

























1 2