Extraction de données d'un tableau

roro69

XLDnaute Impliqué
Bonsoir et merci pour l'aide et le temps consacré
Voici mon problème j'ai un tableau avec des série de chiffres et je dois extraire certaines informations suivants des séries.Je joints mon classeur avec ce que je souhaiterais.
Merci beaucoup
 

Pièces jointes

  • Extraction de données.xls
    38.5 KB · Affichages: 68
  • Extraction de données.xls
    38.5 KB · Affichages: 78
  • Extraction de données.xls
    38.5 KB · Affichages: 80

Paf

XLDnaute Barbatruc
Re : Extraction de données d'un tableau

Bonjour,

la logique de récupération (figurant dans le classeur) et les données coloriées en jaune( résultat attendu ?) ne concordent pas ? (ou je n'ai pas compris la logique!)

Quand vous dites "je récupère les données une fois la plus grande ;une fois la plus petite;...." de quelles données parlez vous ? (données de quelle colonne, ligne ?)

Quand vous dites:
Si nombre de répétions = 2 je récupère les données une fois la plus grande ;une fois la plus petite;ainsi de suite jusqu'a changement de série
dans la mesure où la série comporte 2 lignes(donc 2 répétitions ?) qu'entendez vous par ainsi de suite...

...


Quelques précisions supplémentaires vous apporteraient sans doute davantage de réponses.

A+
 

Jacou

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonjour à tous,
les données de roro69 semblent triées dans l'ordre des numéros de pages puis dans l'ordre des "haut", et les "répétitions" semblent désigner le nombre de lignes de données pour une même page.
Les séries s'arrêtent quand pour une page on n'a pas le même nombre de lignes de données que pour la page précédente.
par exemple :
7 101 116 2 --> la page 7 a 2 lignes de données (101-116) constitue la plus "petite"
7 186 193 2 (186-193) constitue la plus "grande"
8 93 124 2 --> la page 8 a elle aussi 2 lignes de données, donc elle continue la série des "2 répétitions"
8 185 193 2
dans cet exemple, pour cette série de 2 répétitions, les lignes à conserver seront
7 186 193 2 (considérée comme la plus grande pour la page 7) puis
8 93 124 2 (considérée comme la plus petite pour la page 8) et ainsi de suite tant que l'on aura des pages avec "2 répétitions" c'est à dire dans le fichier transmis en exemple aux lignes de la page 44 pour laquelle il y a "3 répétitions".
j'ai essayé de résumer ce que j'ai compris dans l'exemple de roro69 dans le fichier joint
mais il y a effectivement des choix qui ne semblent pas suivre les règles expliquées.

Bonne journée à tous
 

Pièces jointes

  • Extraction de données roro.xls
    72 KB · Affichages: 30
  • Extraction de données roro.xls
    72 KB · Affichages: 42
  • Extraction de données roro.xls
    72 KB · Affichages: 47
Dernière édition:

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonjour PAF Et Jacou
Merci de votre intérêt
Jacou tu as très bien compris ce que je voulais; il est vrai que j'ai fait une erreur dans le coloriage de mes cellules.
Je te remercie si tu peut me trouver un code qui pourrait m'extraire les données

Merci pour le temps accordé et l'aide apporté
 

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

re Bonjour en relisant ton poste jacou Je pense que mon code resemblerait à ca:
Si cellule 4 =1 alors je récupère la ligne telle que
si Cellule 4 = 2 alors je boucle jusqu’à cellule différente 2 par 2 -1
si Cellule 4 = 3 alors je boucle jusqu’à cellule différente 3 par 3 -2
Mais là je bloque un peu
 

Jacou

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonsoir roro69, bonsoir le forum

Je propose la macro "extraction" dans le fichier joint.
Les lignes transférées le sont dans une feuille nommée "récup".
(les séries dont les "répétitions" sont supérieures à 5 sont traitées avec la même logique que les précédentes)

Bonne nuit

Jacou
 

Pièces jointes

  • Extraction de données roro.xls
    85 KB · Affichages: 52
  • Extraction de données roro.xls
    85 KB · Affichages: 53
  • Extraction de données roro.xls
    85 KB · Affichages: 46

Paf

XLDnaute Barbatruc
Re : Extraction de données d'un tableau

Bonjour roro69, Jacou,

une autre proposition, honteusement inspirée de celle de Jacou, mais basée sur des tableaux pour gagner sur le temps de traitement des 20000 lignes prévues.

Code:
Sub Tri()
 Dim Ws1 As Worksheet, Ws2 As Worksheet
 Dim DerL As Long,  Ind As Long, MonTab, TabFin()
 Dim Rep As Byte, Rep1 As Byte

 Set Ws1 = Worksheets("Feuil2")
 Set Ws2 = Worksheets("récup")

 DerL = Ws1.Range("A" & Rows.Count).End(xlUp).Row
 MonTab = Ws1.Range("A2:D" & DerL)

 Rep = 0
 Ind = 1
 While Ind < UBound(MonTab, 1)
    If MonTab(Ind, 4) = Rep Then
        x = x + 1
        For i = 1 To 3
            ReDim Preserve TabFin(1 To 3, 1 To x)
            TabFin(i, x) = MonTab(Ind + Rep1 - 1, i)
        Next i
        If Rep1 = 1 Then Rep1 = Rep Else Rep1 = Rep1 - 1
    
        Ind = Ind + Rep
    Else
        Rep = MonTab(Ind, 4)
        Rep1 = Rep
    End If
 Wend

 Ws2.Range("A2").Resize(UBound(TabFin, 2), UBound(TabFin, 1)) = Application.Transpose(TabFin)
End Sub

A+
 

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonjour et un grand merci à vous deux c'est génial
Vraiment bravo
J'aurais une dernière question dans le fichier exemple j'ai tapé les nombre de répétions à la main ;dans mon fichier originale je n'ai pas cette colonne ;y a t-il un moyen par code de noter ces répétitions.
Merci beaucoup pour votre aide et votre temps consacré.

PS:En fait voilà ce que je souhaite automatiser:
Faitmain

Je voudrais ne pas être obliger de passer par le logiciel de dessin pour créer mes patrons
Donc si quelqu'un peut m'aider se serait sympa
Je joint le classeur avec un fichier image de test
on ne peut tester que des images noir et blanc et que .bmp ou.jpg
Merci si quelqu'un peut m'aider
 

Pièces jointes

  • LogicielPatron.xls
    218 KB · Affichages: 43
  • Lessai.JPG
    Lessai.JPG
    2.1 KB · Affichages: 23

Paf

XLDnaute Barbatruc
Re : Extraction de données d'un tableau

Re,

pour les répétitions

insérérer cette ligne de code
Code:
Ws1.Range("D2:D" & DerL).Formula = "=COUNTIF($A$2:$A$" & DerL & ",A2)"

entre
Code:
DerL = Ws1.Range("A" & Rows.Count).End(xlUp).Row
et
Code:
 MonTab = Ws1.Range("A2:D" & DerL)
du code proposé

Bonne suite
 
Dernière édition:

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Merci beaucoup paf et jacou
pour votre aide et pour le temps que vous m'avez accordé.

Une toute petite dernière question ; y a t'il un moyen de travailler sur des images .png ou vais je devoir passer par une autre solution?
Merci beaucoup
 

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonsoir
Je m'excuse de vous déranger encore avec mon problème ; mais en finalisant le code de mon projet j'ai un problème avec la boucle while (Dépassement de capacité) .Je poste le code si vous pouviez y jetez un oeil se serait génial ; je touche presque à la fin de mon projet.
Sub infoimage()
Dim bm_départ As BITMAP
Dim x1&, y1&, m&, l&, n&, p&, i&, hDC&
Dim Tablo(), tabfin()
Dim Rep As Byte, Rep1 As Byte
fich_img = Application.GetOpenFilename(, , "choisissez l'image à récupérer (.bmp)")
If fich_img = False Then Exit Sub

Application.ScreenUpdating = False

'récupérer l'image
écran_DC = GetDC(0)
Set img_départ = LoadPicture(fich_img)
GetObjectAPI img_départ.Handle, Len(bm_départ), bm_départ 'récupère le bitmap correspondant à l'image
'créer un bitmap img_ini, dans le imgDC pour y accueillir l'image
img_DC = CreateCompatibleDC(écran_DC)
img_DCOld = SelectObject(img_DC, img_départ)
'récupération des colonnes de mon image
larg = bm_départ.bmWidth
haut = bm_départ.bmHeight
p = larg * haut
ReDim Tablo(0 To p, 0 To 3)
For x1 = 0 To larg - 1
n = 0
l = 1
For y1 = 0 To haut - 1
pix = GetPixel(img_DC, Int(x1), Int(y1))
If n = 0 Then
If pix = 0 Then
n = y1 - 1
l = 1
End If
Else
If pix = 0 Then
l = l + 1
Else
m = m + 1
Tablo(m, 0) = x1
Tablo(m, 1) = n
Tablo(m, 2) = n + l + 1
Tablo(m, 3) = 0
n = 0
l = 0
End If
End If
Next
Next
'reprise dans la colonne 3 des répétitions
Index = 0
For i = 1 To m
If Tablo(i, 0) = Tablo(i - 1, 0) Then
Tablo(Index, 3) = Tablo(Index, 3) + 1
Else
Index = i
Tablo(Index, 3) = Tablo(Index, 3) + 1
End If
Next
For i = 1 To m
If Tablo(i, 3) = 0 Then
Tablo(i, 3) = Tablo(i - 1, 3)
End If
Next
'Création Tableau final
Rep = 0
Ind = 0
While Ind < UBound(Tablo, 0)
If Tablo(Ind, 3) = Rep Then
x = x + 1
For i = 0 To 2
ReDim Preserve tabfin(0 To 2, 0 To x)
tabfin(i, x) = Tablo(Ind + Rep1, i)
Next i
If Rep1 = 1 Then Rep1 = Rep Else Rep1 = Rep1 - 1 ''''ici dépassement capacité
Ind = Ind + Rep
Else
Rep = Tablo(Ind, 3)
Rep1 = Rep
End If
Wend
F2.Range("G2").Resize(UBound(tabfin, 2), UBound(tabfin, 1)) = Application.Transpose(tabfin)
Application.ScreenUpdating = True

Set img_départ = Nothing
DeleteObject SelectObject(img_DC, img_DCOld)
DeleteDC img_DC
End Sub

Merci pour le temps accordé et l'aide apporté
 

Paf

XLDnaute Barbatruc
Re : Extraction de données d'un tableau

Re,

Une toute petite dernière question ; y a t'il un moyen de travailler sur des images .png

dans l'état actuel du code, non. Peut-être qu' une âme charitable pourrait s'y pencher dans une autre discussion . En attendant il y a la possibilité d'enregistrer sous JPG les image PNG à l'aide de logiciel tels que PAINT , PhotoFiltre ...

Pour le post #11,

pas facile de s'y retrouver, noms de variables et indices de tableaux étant modifiés.

La reprise de répétitions ne donnait pas les résultats escomptés et l'utilisation de la variable Index (mot réservé VBA) posait soucis. Reprise en utilisant un dictionnaire.
la dépassement de capacité des variables déclarée en Byte, est dûe à un dimensionnement excessif du tableau Tablo (largeur x hauteur de l'image). reprise en dimensionnant le tableau au fur et à mesure de son remplissage( mais inversion des données)

le résultat de la macro initiale et de ce code donne une légère différence (+/- 1) au niveau de de la colonne des X

a priori :

Code:
Sub infoimage()
 Dim bm_départ As BITMAP
 Dim x1&, y1&, m&, l&, n&, p&, i&, hDC&
 Dim Tablo(), tabfin()
 Dim Rep As Byte, Rep1 As Byte
 Dim MonDico

 Set MonDico = CreateObject("Scripting.Dictionary")
 fich_img = Application.GetOpenFilename(, , "choisissez l'image à récupérer (.bmp)")
 If fich_img = False Then Exit Sub


 'récupérer l'image
 écran_DC = GetDC(0)
 Set img_départ = LoadPicture(fich_img)
 GetObjectAPI img_départ.Handle, Len(bm_départ), bm_départ 'récupère le bitmap correspondant à l'image
 'créer un bitmap img_ini, dans le imgDC pour y accueillir l'image
 img_DC = CreateCompatibleDC(écran_DC)
 img_DCOld = SelectObject(img_DC, img_départ)
 'récupération des colonnes de mon image
 larg = bm_départ.bmWidth
 haut = bm_départ.bmHeight
 p = larg * haut
 For x1 = 0 To larg - 1
    n = 0
    l = 1
    For y1 = 0 To haut - 1
        pix = GetPixel(img_DC, Int(x1), Int(y1))
        If n = 0 Then
            If pix = 0 Then
                n = y1 - 1
                l = 1
            End If
        Else
            If pix = 0 Then
                l = l + 1
            Else
                ReDim Preserve Tablo(0 To 3, 0 To m)
                Tablo(0, m) = x1
                Tablo(1, m) = n
                Tablo(2, m) = n + l + 1
                Tablo(3, m) = 0
                m = m + 1
                n = 0
                l = 0
            End If
        End If
    Next
 Next

'reprise dans la colonne 4 des répétitions

 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    MonDico(Tablo(0, i)) = MonDico(Tablo(0, i)) + 1
 Next
 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    Tablo(3, i) = MonDico(Tablo(0, i))
 Next

 'Création Tableau final
 Rep = 0
 Ind = 0
 x = 0
 While Ind < UBound(Tablo, 2)
    If Tablo(3, Ind) = Rep Then
        For i = 0 To 2
            ReDim Preserve tabfin(0 To 2, 0 To x)
            tabfin(i, x) = Tablo(i, Ind + Rep1 - 1) ' et non Ind+Rep1
        Next i
        If Rep1 = 1 Then Rep1 = Rep Else Rep1 = Rep1 - 1
        Ind = Ind + Rep
        x = x + 1
    Else
        Rep = Tablo(3, Ind)
        Rep1 = Rep
    End If
 Wend
 Worksheets("F2").Range("G2").Resize(UBound(tabfin, 2) + 1, UBound(tabfin, 1) + 1) = Application.Transpose(tabfin)

 Set img_départ = Nothing
 DeleteObject SelectObject(img_DC, img_DCOld)
 DeleteDC img_DC
End Sub

Bonne suite
 

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonsoir PAF .
Vraiment merci beaucoup de ton aide et du temps que tu me consacres ;c'est vraiment sympa.
J'ai essayé ton code çà fonctionne ; juste que dés que les répétions sont = à 4 ou = à 5 j'ai un décalage dans les récupérations.
Je joint mon fichier avec l'image d'essai . J' Ai relevé à la main dans les colonnes a b c les relevées idéales.
En tout cas un grand merci pour toute l'aide et les très bons conseils fourni.
 

Pièces jointes

  • EssaiLogPatron.zip
    31.2 KB · Affichages: 38

Paf

XLDnaute Barbatruc
Re : Extraction de données d'un tableau

Re,

Si je me réfère au besoin exprimé dans le classeur du post #1 :
Si nombre de répétions = 4 je récupère les données de la plus grande à la plus petite;ainsi de suite jusqu'a changement de série

or dans le dernier exemple fourni (EssaiLogPatron.xls, feuille TableauFinal tableau relevé à la main) dès qu'on est en répétition 4 (ligne 50), la ligne qui doit être sélectionnée serait non plus la plus grande mais la deuxième dans l'ordre croissant (soit la deuxième ligne d'une valeur).

Précisez bien votre besoin, afin qu'un autre intervenant puisse poursuivre.


Bonne suite
 

roro69

XLDnaute Impliqué
Re : Extraction de données d'un tableau

Bonsoir
désolé ; je débute ce projet et c'est un peu flou et compliqué pour moi ; il est vrai que j'ai trés mal analyser mes questions et mon orientation de mon projet.
Voilà je joint un fichier ou j'ai synthétiser comment j'aimerais récupérer les informations de mon image.
Je suis vraiment désolé mais ne pense pas que tu as perdu ton temps ;car vraiment j'ai encore appris plein de chose avec toi
En tout cas je te remercie de ta patience.

Allez tiens je te verse un petit vin jaune de chez moi et trinque à ta bonne santé
 
Dernière édition:

Discussions similaires

Réponses
45
Affichages
1 K

Statistiques des forums

Discussions
312 326
Messages
2 087 312
Membres
103 513
dernier inscrit
adel.01.01.80.19