VBA - agenda (afficher valeur de rotation) en évitant un ajout de col. (tablo) [résolu PJ / JOB75]

zebanx

XLDnaute Accro
Bonjour à tous,

Le code dans le fichier ci-après fonctionne (en étant un peu lent) mais me pose surtout un problème par la création d'une colonne intermédiaire (C) qu'il serait bien d'éviter d'afficher (le planning n'est pas présenté sur une seule colonne mais sur 24 avec un step de 2 entre chaque mois et il doit y avoir quelques cellules fusionnées en plus...):
- colonne C = Mod ()
- colonne D = Decaler () par rapport à la valeur sur la cells (i, 3) pour chaque ligne d'un range variable.
J'ai essayé de le modifier avec un tablo mais ... ça reste difficile )- et inévitablement une erreur apparait.
(pour reprendre une expression récente de MaPomme, je reste un vrai "crasseux" dans le domaine :cool:)

L'utilisation à ce stade d'une formule parait complexe mais c'est peut-être une solution.

Vous remerciant par avance pour vos commentaires et vos propositions de modification.

Bonne journée à vous,
zebanx
 

Pièces jointes

  • tablo_rotation.xls
    831 KB · Affichages: 27

zebanx

XLDnaute Accro
Bonjour Pierre-Jean,

Un grand merci (une énième fois) pour votre célérité et cette proposition :
- ciselée mais dont les termes et la disposition du code est facile d'accès
- qui fait 100% de ce qui était demandé.
- qui repart d'une tentative et permet de bien comparer la différence d'approche.
Et j'étais loin du compte, une nouvelle fois concernant les tableaux.

Bon apm !
zebanx
 

job75

XLDnaute Barbatruc
Bonjour zebanx, Pierre,

Solution par formule en B2 :
Code:
=SI((A2<J$1)+(A2>=J$1+J$2);"";DECALER(G$1;MOD(NB.SI(B$1:B1;"><")-1;NBVAL(G:G));))
Solution par VBA :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [G:G,J1:J2]) Is Nothing Then Exit Sub
Dim deb As Variant, h&
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
Range("B2:B" & Rows.Count) = "" 'RAZ
deb = Application.Match([J1], [A:A], 0)
If IsError(deb) Or Val(CStr([J2])) < 1 Then Exit Sub
h = Range("G" & Rows.Count).End(xlUp).Row
ThisWorkbook.Names.Add "deb", deb: ThisWorkbook.Names.Add "h", h 'noms définis
With Range("B" & deb).Resize([J2])
  .Formula = "=OFFSET(G$1,MOD(ROW()-deb,h),)"
  .Value = .Value 'supprime les formules
End With
End Sub
Fichiers joints.

A+
 

Pièces jointes

  • tablo_rotation par formule(1).xls
    75 KB · Affichages: 29
  • tablo_rotation par VBA(1).xls
    79.5 KB · Affichages: 22
Dernière édition:

zebanx

XLDnaute Accro
Ok, merci de la précision.
On est d'accord et ça va servir pour un calendrier donc pas de problème de ce côté là.

Les deux parties "offset(.., Mod(row()-deb,h,)" dans le code VBA et nb.si(...;"><";.) dans la formule sont bluffantes, là c'est pour "ta pomme" ! :)

Mais ne l'ayant jamais utilisé, à quoi correspond stp dans la fin de formule le critère "><" ?
(puisque, béat-ement, cela ne correspond pas à "<>" en tirant la formule, les résultats diffèrent).

Encore merci Job75, super-solutions (comme PJ).