Scan d'une carte maillée reproduite en tableur

Bonjour à tous,

Je suis nouveau sur ce forum et ai une demande à vous soumettre. Dans le cadre de mes études, je dois réaliser un indice tenant compte de la "connectivité" qui existe entre des patchs d'habitats d'une série d'espèces. Pour ça, j'ai une carte maillée, avec une grille en fond pour être plus clair. Les côtés de chaque maille font 10 km / 10 km. Ces mailles sont soit vides, soit pleines. Dans tous les cas pour étudier cette carte et ma fameuse connectivité, je dois définir pour chaque maille quelles sont les 8 mailles qui l'entourent.

Je suis plutôt à l'aise avec excel mais j'ai beau chercher, je crois bien que mon problème ne pourra pas se résoudre avec les fonctions classiques d'excel. C'est en cherchant que je suis tombé sur les macros et je suis en train de découvrir tout un monde, au langage hélas bien hermétique pour un étudiant en écologie...

Je suis quasiment certain qu'il est possible de programmer un tel processus dans une macro mais je suis bien incapable de le faire par moi-même. Je pourrais le faire à la main avec des macros moins ambitieuse, mais la question me taraude et je serais heureux de voir quelqu'un me proposer cette solution!

Je vous remercie pour votre aide, j'espère que mon challenge en est vraiment un, et que la solution n'est pas trop évidente!

15classeur1.xlsx (17.13 Ko)

Bonjour Lachouffe et bienvenue,

En utilisant une macro vba il est possible de faire une boucle pour récolter les résultats,

mais je ne sais pas à quoi correspond les entêtes Maille attenante 1 à Maille attenante 8 sur l'onglet Feuil2

voici un exemple,

Bonjour et bienvenue

J'ai défini une "plage" et ajouté une ligne et colonne vierge (grisée).

Sub maillage()
Dim cel As Range, ici As Range
With Sheets(2)
    For Each cel In [plage]
        If cel <> "" Then
            Set ici = .Columns(1).Find(cel)
            .Cells(ici.Row, 2) = cel.Offset(-1, -1)
            .Cells(ici.Row, 3) = cel.Offset(-1, 0)
            .Cells(ici.Row, 4) = cel.Offset(-1, 1)
            .Cells(ici.Row, 5) = cel.Offset(0, 1)
            .Cells(ici.Row, 6) = cel.Offset(1, 1)
            .Cells(ici.Row, 7) = cel.Offset(-1, 0)
            .Cells(ici.Row, 8) = cel.Offset(-1, -1)
            .Cells(ici.Row, 9) = cel.Offset(0, -1)
        End If
    Next
End With
End Sub

edit : bonjour Isabelle, désolé je n'avais pas vu ta réponse !

Michel

slt Michel,

sans problème,

contente que tu aies compris à quoi correspond les entêtes Maille attenante 1 à Maille attenante 8 sur l'onglet Feuil2

même en regardant ton fichier je n'ai pas compris la correspondance. @

slt Michel,

sans problème,

contente que tu aies compris à quoi correspond les entêtes Maille attenante 1 à Maille attenante 8 sur l'onglet Feuil2

même en regardant ton fichier je n'ai pas compris la correspondance. @

ps/

c'est peut être

Maille attenante 1 = Nord

Maille attenante 2 = Nord Ouest

Maille attenante 3 = Nord Est

Maille attenante 4 = Ouest

Maille attenante 5 = Est

Maille attenante 6 = Sud

Maille attenante 7 = Sud Ouest

Maille attenante 8 = Sud Est

ou tout autre ?

les données des lignes 1 à 3 et colonnes A à C sur l'onglet Feuil1

correspondent à quoi ?

Alors là, je ne me suis pas posé de question ... j'ai fait le tour dans le sens trigonométrique en partant du coin haut gauche !

re,

ok, je comprend mieux,

voici un exposé VBA pour Lachouffe en espèrent qu'il soit utile

target environ

ou bien sur cette version,

target environ 2

Tout d'abord merci pour vos réponses!

Ensuite, je suis pas sûr de comprendre comment fonctionne cette macro. Je veux dire, comment faites vous pour récupérer les résultats? A la place de [plage] je dois rentrer la plage correspondante à la carte maillée c'est ça?

Et puis, quelque chose m'embête un peu. Ce que j'appelle les mailles attenantes sont en effet les mailles qui entourent la maille d'intérêt, peu importe laquelle est mise en 1 ou 2 ou 3... Ca n'a pas d'importance pour la suite. En revanche, pour chaque maille d'intérêt, il me faut bien uniquement des valeurs de maille uniques! Or ici, il y a des doublons dans quasiment chaque ligne...

Enfin, je ne sais pas si c'est trop demander, mais est-ce qu'il serait possible de m'expliquer rapidement les macros que vous m'envoyez? Plus que trouver la solution au problème, j'aimerais comprendre comment la manipuler

Merci à tous

Merci i20100, je n'avais pas vu ton message! Je comprend mieux comment la macro fait référence aux mailles adjacentes à la maille d'intérêt. Ce que je ne comprend pas, c'est comment, à partir de ces formules, les résultats vont venir se mettre à leur place dans le tableau de la seconde feuille

Tout d'abord merci pour vos réponses!

Ensuite, je suis pas sûr de comprendre comment fonctionne cette macro. Je veux dire, comment faites vous pour récupérer les résultats? A la place de [plage] je dois rentrer la plage correspondante à la carte maillée c'est ça?

Et puis, quelque chose m'embête un peu. Ce que j'appelle les mailles attenantes sont en effet les mailles qui entourent la maille d'intérêt, peu importe laquelle est mise en 1 ou 2 ou 3... Ca n'a pas d'importance pour la suite. En revanche, pour chaque maille d'intérêt, il me faut bien uniquement des valeurs de maille uniques! Or ici, il y a des doublons dans quasiment chaque ligne...

Enfin, je ne sais pas si c'est trop demander, mais est-ce qu'il serait possible de m'expliquer rapidement les macros que vous m'envoyez? Plus que trouver la solution au problème, j'aimerais comprendre comment la manipuler

Merci à tous

1-

[plage] est le nom donné à la ... plage ! Celle que j'ai colorié en jaune paille ici :

capture d ecran 161

2- je vais enlever les doublons ... bientôt ! pour le moment je réponds juste aux questions

3- pour la macro :

Sub maillage()
Dim cel As Range, ici As Range

' ceci permettra de rattacher tous les .Cells (commençant par un point) à la feuille 2
With Sheets(2)

    ' pour chaque cellule de la plage
    For Each cel In [plage]

        ' si elle n'est pas vide
        If cel <> "" Then

            ' je cherche où elle se trouve en colonne 1 feuille 2
            Set ici = .Columns(1).Find(cel)

            ' j'y mets les valeurs dans la ligne de la cellule trouvée en feuille 2
            ' pour offset, voir explication graphique d'Isabelle ci-dessus
            .Cells(ici.Row, 2) = cel.Offset(-1, -1)
            .Cells(ici.Row, 3) = cel.Offset(-1, 0)
            .Cells(ici.Row, 4) = cel.Offset(-1, 1)
            .Cells(ici.Row, 5) = cel.Offset(0, 1)
            .Cells(ici.Row, 6) = cel.Offset(1, 1)
            .Cells(ici.Row, 7) = cel.Offset(-1, 0)
            .Cells(ici.Row, 8) = cel.Offset(-1, -1)
            .Cells(ici.Row, 9) = cel.Offset(0, -1)
        End If
    Next
End With
End Sub

Ce que j'appelle les mailles attenantes sont en effet les mailles qui entourent la maille d'intérêt, peu importe laquelle est mise en 1 ou 2 ou 3... Ca n'a pas d'importance pour la suite. En revanche, pour chaque maille d'intérêt, il me faut bien uniquement des valeurs de maille uniques!

Alors là, je ne sais pas comment tu vas exploiter !

Je fais donc prendre les devants avec 2 présentations possibles des résultats (feuille 4 et 5)

Fais tourner maillage2

Sub maillage2()
Dim cel As Range
With Sheets(3)

    ' au cas où le tableau serait déjà vide
    On Error Resume Next
        ' effacement du tableau
        .ListObjects(1).DataBodyRange.Delete
    On Error GoTo 0

    ligne = 1
    ' pour chaque cellule de la plage
    For Each cel In [plage]

        ' si elle n'est pas vide
        If cel <> "" Then
            If cel.Offset(-1, -1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(-1, -1)
            If cel.Offset(-1, 0) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(-1, 0)
            If cel.Offset(-1, 1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(-1, 1)
            If cel.Offset(0, 1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(0, 1)
            If cel.Offset(1, 1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(1, 1)
            If cel.Offset(1, 0) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(1, 0)
            If cel.Offset(1, -1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(1, -1)
            If cel.Offset(0, -1) <> "" Then ligne = ligne + 1: .Cells(ligne, 1) = cel: .Cells(ligne, 2) = cel.Offset(0, -1)

        End If
    Next
End With

Sheets(4).Select
ActiveSheet.PivotTables(1).PivotCache.Refresh

Sheets(5).Select

End Sub

Le script s'allonge on dirait! Le tableau croisé dynamique c'est pas mal mais je suis toujours embêté car dans votre solution, le nombre maximum de mailles entourant une maille d'intérêt est de 4 alors qu'il y a bien des mailles qui sont entourées de 8 autres mailles..! Je ne sais pas d'où vient ce problème.

Je répète qu'il faut plus prendre ça comme un challenge que comme un réel problème, si i le faut je le ferai à la main, mais j'aimerais bien avoir une solution macro à cette opération!

le nombre maximum de mailles entourant une maille d'intérêt est de 4 alors qu'il y a bien des mailles qui sont entourées de 8 autres mailles..!

Peux-t me donner un exemple ?

En fait toutes les mailles qui ne sont pas en bordure de la carte, quasiment, sont entourées par 8 mailles. Je cite quelques noms de mailles qui sont dans cette situation (ou pas) :

[*] VU74 : 8 mailles attenantes

[*] VV90 : 8 mailles attenantes

[*] Mais UU83 : 5 mailles attenantes

[*] Et UU62 : 1 maille attenante

Je vais regarder

Néanmoins, j'ai créé un cas à 8 voisins différents de la cellule "z" et je retrouve bien les 8 sur les feuilles 4 et 5.

[*] VU74 : 8 mailles attenantes

en effet, je regarde

Ok j'ai compris

Ils y étaient mais comme je mettais dans l'ordre les 2 voisins, il aurait fallu additionner ligne et colonne

Et dans mon exemple, z étant supérieur à a, b, c, d, e, f, g, h, cela ne se voyait pas !

J'ai corrigé, a présentation est plus lisible du coup.

Bonjour Lachouffe,

un retour sur cette proposition ?

C'est extrêmement efficace et ça fonctionne super bien! Faudra juste que je prenne le temps de me pencher sur le fonctionnement, je suis surchargé de boulot pour le moment!

Je passe le sujet en résolu!

Merci beaucoup pour votre aide

Rechercher des sujets similaires à "scan carte maillee reproduite tableur"