Autres Petit defi du jour

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
Un petit défi comme ca le dimanche (et oui c'est tout moi ca )

J’ai plusieurs longueurs en nombre variable
Je cherche un algo qui me permettrait de faire des groupes de longueurs au plus proches les une des autres.
exemple
10;17.5;18;24.9;12.3;32;19;28.7;41;etc.....
ce nombre de longueurs je veux pouvoir le diviser par 3,4,ou,5,ect....groupe

ca me fera x groupes
l'addition des longueurs de ces groupes doivent être = ou tres proche

des idées ?
Patrick
 
Solution
Bonjour @job75
Me voilà de retour avec un nouvel écran super tout beau tou neuf enfin
4 jours sans PC , j'ai cru tourner un remake de "Seul au monde" 🤣 🤣

Donc voici ma version que j'avais adoptée la semaine dernière
Voir feuille patchwork 2 qui est sans conteste plus rapide
je ne prends pas la hauteur de cellule c'est moi qui décide la hauteur
tu constateras que les images coupées sont au zoom identique autres
si il est fiable si tu prend en compte le coeff de réduction de taille en amont sinon les données sont fausse
exemple une image fait 400X500 point a la base
tu la réduit pour qu'elle rentre dans le cell a supposer que la ligne fait 100 de haut
donc insertion h=height :.height=cell.height ; mémorisation de h pour l'image

a la fin tu fais un cropRight largeur max-le width actif* le coeff h de l'image
car justement le crop prend en compte les dimensions de départ
 
Bonjour Patrick, le forum,

si il est fiable si tu prend en compte le coeff de réduction de taille en amont
Tu as raison, alors dans cette version on ajuste la largeur et on rogne en bas la dernière image de chaque ligne.

Cela dit en visuel il y a très peu de différence avec la solution du post #9.

A+
 

Pièces jointes

Bonjour @job75
Me voilà de retour avec un nouvel écran super tout beau tou neuf enfin
4 jours sans PC , j'ai cru tourner un remake de "Seul au monde" 🤣 🤣

Donc voici ma version que j'avais adoptée la semaine dernière
Voir feuille patchwork 2 qui est sans conteste plus rapide
je ne prends pas la hauteur de cellule c'est moi qui décide la hauteur
tu constateras que les images coupées sont au zoom identique autres
 

Pièces jointes

Bonjour Patrick, le forum,

Avec le fichier de mon post #17 l'essentiel du temps de traitement vient de la macro Tirages.

Pour 11 images sur 3 lignes :
- ntirages = 10 000 => écart 7 points => 0,9 seconde
- ntirages = 1000 => écart 16 points => 0,13 seconde.

Pour 33 images sur 5 lignes :
- ntirages = 10 000 => écart 51 points => 2,14 secondes
- ntirages = 1000 => écart 81 points => 0,40 seconde.

Avec 33 images le rognage en hauteur de la dernière de chaque ligne peut être important.

J'ai testé ta macro Patrick après avoir ajouté "webp" mais elle beugue sur :
VB:
If Not dicoDoublons.exists(PiCt.Name) Then
Sur l'autre fil je t'ai indiqué comment l'éviter.

A+
 
Bonsoir @job75
Oui j'ai compris que c'était le tirage qui prenait du temps
Ce n'est pas le principe que j'emploie
Moi je mets les images au hasard(ou pas) comme elles viennent
Je décide du nombre d'image par ligne à la base
Ensuite je rajoute en doublonnant en changeant un peu la luminosité
Et quand il ne reste plus que des bagatelles de points je mets une triplette ou doublons et je la crop(coupe l'image par la droite).
Et oui ce problème de shapes/pictures c'est pénible qui crée le bug sur certain 365 (pas tous).

@laurent950
les images sont dans un dossier que tu sélectionnes tout simplement
 
Bonsoir @patricktoulon

Aujourd'hui j'ai eu l'occasion d'essayé CODEX de ChatGpt, la version à 360 €.

je me suis permis de voir comment celui-ci modifier et obptimisé ton code, j'ai laissé le systéme faire tous seule, quelques informations pour recadrer quand ca plante = (Copie d'écrans du code que je lui envoie) incroyable il gére tous seule.

C'est impressionnant la rapidité a laquelle cela galope... bon je n'y suis pas rester longtemps mais en 15 minutes il a tous Obptimisé selon lui !

Veux tu voir le résultat et bien sur c'est ton code a 100% je le poste ici et je détruit le fil et tu remets ton nom dans le code que tu as fait (et aussi celui de CODEX tu remets ton nom)

j'ai choisie ce code car j'ai trouver interressant... il y a aussi une possibilité de le codé avec PowSell mais franchement j'y connais rien il m'a fait le code et alors sans passé par excel est VBA c'est vraiment super mais ca je sais pas codé.

C'est juste pour des tests et pas prendre ton code je détruit le fil ensuite si tu veux récupérer le code et voir si il y a une réelle pertinence de CODEX moi je sais pas ! ton oeil d'expert le verra très certainement beaucoup mieux que moi ? j'ai vraiment envie de savoir si cela en valut la peine CODEX CHATGPT.

je le poste dans ce fil si tu es OK bien sur, si non je le poste pas c'est ton code.

Laurent
 
ma derniere version

demo4.gif
 
la version que tu viens de poser
comme tu vois le travail est loin d'être terminé il me laisse les shapes texturées
on est tout juste au niveau de la version 1 que j'avais fait au depart
et en plus c'est moins bien finalement puisque on vois bien que des shapes texturées peuvent être largement remplacées par les images de lignes suivantes chatgpt l'a carément oublié ça
par exemple l'image "un truc" peut tres bien aller da la ligne au dessus et ainsi reduire la shapes texturée
il faut arrêter de croire que chatGpt va vous pondre le code magique d'ailleurs pour être honnete c'est le moins bon dans ce dommaine d'autre IA sont bien plus performantes
demo4.gif

a la limite dans ce contexte (avec shapes texturée @job75 avait fait mieux
tout ce qui brille n'est pas d'or laurent
 
re
oui ca vaut pas un clou je le ruine en un seul LLM
c'est simple quand il ne trouve pas il tourne (des fois même il bug) et il descend en version
pour te refaire des propositions erronées qu'il avait déjà faites

Autant rester en 5.2 tant que tu peux en gratuit (sinon il faut payer)
Voici la dernière version pas une seule shapes texturée ne doit subsiter
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'CREER UN PATWORK AVEC DES IMAGES SUR LE DISQUE DUR dans une feuille
'Version 1.0
'date version 27/11/2025
'patricktoulon
Option Explicit
Sub clearPatwork2()
    Dim shap As Shape
    'clear la page
    For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Column >= 3 Then If Not shap.Name Like "BoutonGo*" Then shap.Delete
    Next
End Sub

Sub GoPatchwork2()
    Dim a&, B&, C&, D&, E&, F&, G&
    '---------------------------------------
    clearPatwork2
    '-----------------------------------------
    a = [B6] 'hauteur de l'image donc hauteur des lignes
    B = [B5].Value 'Nombre d'images par ligne
    C = Int(Cells(2, 1).Top) 'Top de depart
    D = [D1].Left 'left de depart
    E = [B7] 'combler les trous avec des doublon(0 pour non/1 pour oui)
    F = [B8] 'melanger les images
    G = [B9] 'terminer les bandes avec des images tronquées
    CreatePatchwork2 a, B, C, D, E, F, G
End Sub



Sub CreatePatchwork2( _
                     Optional hauteurmax& = 100, _
                     Optional NbPictureByRow& = 4, _
                     Optional Topdepart& = 0, _
                     Optional LeftStart = 0, _
                     Optional FillGapsDuplicates = 0, _
                     Optional UnOrderedPicture& = 0, _
                     Optional TerminalCropImage& = 0)
    Application.ScreenUpdating = False
    Dim p As Range, fichiers, topx&, count&, fin#, TrOu, LeftX&, tbl(), a&, q&, temp, W#, Timages(), x&
    Dim DosSier, img
    Dim dicoRight As Object, it, elem, dicoDoublons As Object
    Set dicoRight = CreateObject("scripting.dictionary")
    Set dicoDoublons = CreateObject("scripting.dictionary")
    topx = Topdepart
    LeftX = LeftStart
    'dialog folder
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "CHOISISSEZ LE DOSSIER D IMAGES"
        If .Show <> -1 Then Exit Sub
        DosSier = .SelectedItems(1) & "\"
    End With
    
    'dir fichieret stakage des liens fichier dans une variable tableau
    fichiers = Dir(DosSier & "\*.*")
    If fichiers <> "" Then
        Do While fichiers <> ""
            Select Case Split(LCase(fichiers), ".")(1)
                Case "jpg", "jpeg", "png", "gif", "bmp", "tiff", "webp"
                    a = a + 1: ReDim Preserve tbl(1 To a): tbl(a) = DosSier & fichiers
            End Select
            fichiers = Dir
        Loop
        
        'si demandé on melange les images
        If UnOrderedPicture& = 1 Then
            For a = 1 To UBound(tbl)
                q = 1 + (Rnd * (UBound(tbl) - 1))
                temp = tbl(q): tbl(q) = tbl(a): tbl(a) = temp
            Next
        End If
        
        For a = 1 To UBound(tbl)
            DoEvents
            'insertion de limage
            'Set img = ActiveSheet.Pictures.Insert(dossier & fichiers)
            Set img = ActiveSheet.Shapes.AddPicture(tbl(a), False, True, 0, 35, -1, -1)
            img.LockAspectRatio = True
            img.Top = topx: img.Left = LeftX
            img.Height = hauteurmax
            img.Name = "pict" & a
            x = x + 1: ReDim Preserve Timages(1 To x): Timages(x) = img.Name
            count = count + 1
            If count = NbPictureByRow Then
                dicoRight(topx) = (LeftX + img.Width)
                If LeftX > fin Then fin = LeftX + img.Width
                topx = topx + hauteurmax: LeftX = LeftStart: count = 0
            Else
                LeftX = LeftX + img.Width
                
            End If
            
        Next
        If LeftX > LeftStart Then dicoRight(topx) = LeftX
    End If
    
    it = dicoRight.Items
    ' MsgBox fin & vbCrLf & Join(it, vbCrLf)
    fin = Application.Max(dicoRight.Items)
    
    
    'a partir d'ici on va combler les trous avec des shapes texturées
    For Each elem In dicoRight
        Dim shap, i&, cacHe As Shape, PiCt
        Randomize
        TrOu = 0
        TrOu = Val(fin) - Val(dicoRight(elem))
        'If trou > 0 Then
        Set shap = ActiveSheet.Shapes.AddShape(1, Val(dicoRight(elem)), elem, TrOu, hauteurmax)
        shap.Name = "shap" & elem
        'shap.Fill.PresetTextured Round(Rnd * 22) + 1
        shap.line.Visible = msoFalse
        
        'End If
    Next elem
    
    'combler les trous avec des doublons autant que possible
    If FillGapsDuplicates = 1 Then
        For Each shap In ActiveSheet.Shapes
            If shap.Type = 1 And shap.Top >= 30 Then
                LeftX = shap.Left
                For Each PiCt In ActiveSheet.Pictures
                    If Not dicoDoublons.Exists(PiCt.Name) Then
                        W = PiCt.Width
                        If W <= shap.Width Then
                            PiCt.CopyPicture
                            ActiveSheet.Paste
                            Set img = ActiveSheet.Shapes(ActiveSheet.Shapes.count)
                            img.Name = PiCt.Name & "bis"
                            img.Top = shap.Top: img.Left = LeftX
                            img.PictureFormat.Brightness = (3 + (Rnd * 4)) / 10
                            LeftX = LeftX + img.Width
                            shap.Width = shap.Width - img.Width: shap.Left = LeftX
                            dicoDoublons(PiCt.Name) = ""
                            dicoDoublons(img.Name) = ""
                            'x = x + 1: ReDim Preserve Timages(1 To x): Timages(x) = img.Name
                        End If
                        
                    End If
                Next
            End If
        Next
    End If
    
    Dim CropRatio, imgg
    'à partir d'ici il reste encores des shape trou  même minime en terme de largeur
    'nous alons les remplir avec des images
    If TerminalCropImage = 1 Then
        For Each shap In ActiveSheet.Shapes
            If shap.Type = 1 And shap.Top >= 30 Then
re:
                imgg = tbl(1 + Int(Rnd * (UBound(tbl) - 1)))
                If dicoDoublons.Exists(imgg) Or dicoDoublons.Exists(imgg & "bis") Then GoTo re
                 dicoDoublons(imgg) = ""
                Set img = ActiveSheet.Shapes.AddPicture(imgg, False, True, 0, 0, -1, -1)
                CropRatio = img.Height / hauteurmax
                img.LockAspectRatio = True
                img.Height = hauteurmax
                img.PictureFormat.CropRight = (img.Width - shap.Width) * CropRatio
                img.Left = shap.Left
                img.Top = shap.Top
                'x = x + 1: ReDim Preserve Timages(1 To x): Timages(x) = img.Name
            End If
            DoEvents
        Next
    End If
    Dim G
    'on peut grouper timages pour n'en faire qu'une ici et l'exporter
    
End Sub
 
Hello @patricktoulon

Alors CODEX l'option payante est nul a 356 €/Mois !

j'avais donner le code de l'onglet 2
1766262415747.png


je suis partie sur une mauvaise base

J'aurais du prendre ce code pour tester (Dommage)
oui ca vaut pas un clou je le ruine en un seul LLM
En Poste #18 c'est l'onglet : patchwork (2)

le code :
1766262217670.png


qui correspond a ce que tu as poster en Poste #27 (pour être sûr)

Code début :
1766262290429.png
 
il y a deux raisonnements valables
le mien qui consiste
a déterminer au départ le nombre d'images minimum par ligne
Remplir ensuite avec des doublons modifiés en lumière (pour les différencier un peu)
et pour finir remplir les brindilles a la fin avec des doublons ou triplet tronqués

et celui de @job75 qui consiste a
determiner une largeur au depart
mouliner pour trouver les meilleures selections d'images pour chaque lignes qui laissent un minimum de brindille
sa derniere version rempli aussi les brindille avec des doublons ou triplet tronqués
mais il est moins rapide
 
@patricktoulon
Tu as CODEX ?

c'est vraiment interrssant.

Patrick = fais ce test avec CHATGPT.

Ecrit le Prompte ChatGpt ci-dessous : Copier/Coller
tu sais me comparer deux code vba qui font la même choses ?me dire si qu'elle code est le plus performant et le mieux construit et pourquoi ?
je te poste les deux codes.

Le Premier code
Colle ton ici GoPatchwork2

Puis le deuxiéme code
colle le code que je t'ai donner ici GoPatchwork() / le code que j'ai poster dans le fil que j'ai effacer (car c'est ton code et ton idée) si tu l'a conservé

regarde la réponse de CHATGPT c'est Étonnant !
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour