Bienvenue! Inscrivez-vous et rejoignez notre communauté :)
  • Login:

Bienvenue sur Forum SIG - Systèmes d'Information Géographique et Géomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre première visite, assurez vous de faire une recherche préalable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 15 sur 18
  1. #1

    Date d'inscription
    juillet 2005
    Localisation
    Bretagne
    Organisme
    service SIG Rennes Métropole
    Messages
    59

    Mes réseaux sociaux

    Follow OpenMac On Twitter

    Post [ArcGIS 8.x/9.x] VBA : Parcourir des couches, des champs ou des enregistrements

    Bonjour,

    Voici juste des exemples de code pour parcourir :
    • les couches d'un document ArcMap
    • les champs d'une table d'une couche
    • les enregistrements d'une table d'une couche
    J'espère que ça aidera. N'hésitez pas à faire des commentaire.

    Liste des couches
    Code:
    'les variables pour utiliser ArcMap
    Global pMxApp As IMxApplication
    Global pDoc As IMxDocument
    Global pMap As IMap
    
    'les objets ArcMap
    Set pMxApp = Application
    Set pDoc = Application.Document
    Set pMap = pDoc.FocusMap
    
    
    With pDoc
            For i = 0 To (pMap.LayerCount - 1)
                Debug.Print i & " -> " & pMap.Layer(i).Name
            Next i
    End With
    Liste des champs d'une couche
    Code:
    'les variables pour utiliser ArcMap
    Global pMxApp As IMxApplication
    Global pDoc As IMxDocument
    Global pMap As IMap
    
    'les objets ArcMap
    Set pMxApp = Application
    Set pDoc = Application.Document
    Set pMap = pDoc.FocusMap
    
    
        Dim pLayer As ILayer '= couche
        Dim pLayerClass As IClass '= schéma de la table attributaire d'une couche
        
        Dim pFields As IFields '= schéma des champs d'une table
        Dim NbChamps As Integer
        
        
        'liste des champs d'une table
        Debug.Print "LISTE DES COUCHES"
        With pDoc
            For i = 0 To (pMap.LayerCount - 1)
                
                Set pLayer = pMap.Layer(i) 'on instancie la variable "couche" en indiquant l'index de la couche de travail (du haut vers le bas)
                    Debug.Print i & " -> " & pLayer.Name
                
                Set pLayerClass = pLayer 'on instancie le schéma de la table pour la couche de travail
                Set pFields = pLayerClass.Fields 'on instancie le schéma des champs de la table de la couche de travail
                
                NbChamps = pFields.FieldCount
                    Debug.Print "       " & NbChamps & " champs pour la table de cette couche"
                
                'on parcours les champs de la table
                For j = 0 To (NbChamps - 1)
                    Debug.Print "        - " & pFields.Field(j).Name
                Next j
                
            Next i
        End With
    Parcours des enregistrements d'une table
    Code:
    'les variables pour utiliser ArcMap
    Global pMxApp As IMxApplication
    Global pDoc As IMxDocument
    Global pMap As IMap
    
    'les objets ArcMap
    Set pMxApp = Application
    Set pDoc = Application.Document
    Set pMap = pDoc.FocusMap
    
    
        Dim pLayer As IFeatureLayer
        Dim pFeature As IFeature
        Dim pFClass As IFeatureClass
        Dim pTable As ITable
        Dim pRow As IRow
        Dim NbEnrg As Long
        
        'On récupère la n ème couche de la carte
        Set pLayer = pMap.Layer(0)
        
        ' .. et la classe d'entité associée
        Set pFClass = pLayer.FeatureClass
        
        Set pTable = pLayer
        
        Dim Query As IQueryFilter
        Set Query = New QueryFilter
        
        NbEnrg = pTable.RowCount(Query)'on ne met pas de filtre pour parcourir toute la table
        Debug.Print NbEnrg & " enregistrements / objets dans cette couche"
        
        Dim i As Long
        
        'on parcours la table
        For i = 0 To (NbEnrg)
            Set pRow = pTable.GetRow(i)
            'Debug.Print pRow.Value(2) 'l'index du champ à traiter
        Next i
    
    'Attention, le temps de parcours peut être très très long !

  2. #2
    Supporter(rice)
    Date d'inscription
    janvier 2005
    Localisation
    Moncontour (22)
    Emploi
    Géomaticien spécialisé en Environnement - Entrepreneur-Salarié-Associé
    Organisme
    Coopérative d'activités et d'emploi Avant-Premières
    Âge
    37
    Messages
    417

    Par défaut

    Salut OpenMac,

    Euh j'aurais juste voulu quelques précisions sur le terme "Global" que je n'ai jamais utilisé en VBA jusqu'ici.

    merci.
    Cyrille Menguy - Géomaticien spécialisé en Environnement

  3. #3

    Date d'inscription
    juillet 2005
    Localisation
    Bretagne
    Organisme
    service SIG Rennes Métropole
    Messages
    59

    Mes réseaux sociaux

    Follow OpenMac On Twitter

    Par défaut

    Il s'agit de la portée des variables. Je ne suis pas vraiment calé la-dessu, cf cours de VB...

    Dim = variable qui sert juste dans le programme dans lequel elle a été déclarée. Sauf si, dans un module, cette variable est déclarée en tête du module, après la "fonction" Option Explicit. Dans ce cas, tous les programmes écrits dans ce module peuvent utiliser cette variable mais pas des programmes d'un autre module.

    Global = variable qui peut être utilsée dans TOUT le projet VB. C'est plus pratique car on peut se refiler des variables d'un module à l'autre. Ca permet d'organiser le code et de le rendre plus digeste à lire en regroupant dans un module tout le code qui correspond à une tâche ou un thème, par exemple.
    Très utile dans ArcMap car, ainsi, on déclare une bonne fois pour toute le IMXApplication et le pDoc en cours et le pMac, etc... Ca évite de retaper x fois des trucs pas utile.


    Je crois qu'il y a un autre type de déclaration mais je ne m'en souviens plus.

  4. #4
    Supporter(rice)
    Date d'inscription
    janvier 2005
    Localisation
    Moncontour (22)
    Emploi
    Géomaticien spécialisé en Environnement - Entrepreneur-Salarié-Associé
    Organisme
    Coopérative d'activités et d'emploi Avant-Premières
    Âge
    37
    Messages
    417

    Par défaut

    Merci
    Cyrille Menguy - Géomaticien spécialisé en Environnement

  5. #5

    Date d'inscription
    juillet 2005
    Localisation
    Bretagne
    Organisme
    service SIG Rennes Métropole
    Messages
    59

    Mes réseaux sociaux

    Follow OpenMac On Twitter

    Par défaut

    A voir aussi ici (merci MacGeol) : la "bonne" façon de programmer...

    http://arcscripts.esri.com/details.asp?dbid=12201

  6. #6

    Date d'inscription
    octobre 2004
    Localisation
    Rennes
    Emploi
    admin SIG
    Organisme
    agence d'urba
    Messages
    13

    Par défaut

    Bonjour,

    génial ce petit mémo, toute mamip faite régulièrement mérite d'être encapsuler dans une macro.

    moi qui est du mal à faire du vba en continue, peux-tu m'indiquer comment appliquer sur toutes une série de raster les manip suivantes cachés dans onglet affichage de la couche :
    1- appliquer le même coef de tranparence
    2- pour des raison d'impression A3, voir toutes les tuiles et plus le mode filaire

    merci du coup de main
    cocro

  7. #7

    Date d'inscription
    octobre 2005
    Messages
    47

    Par défaut

    Y a t'il d'autre moyen pour récupérer les enregistrement

    Merci d'avance

  8. #8

    Date d'inscription
    avril 2005
    Localisation
    Paris
    Âge
    37
    Messages
    136

    Par défaut

    Bonjour,

    un lien vraiment sympa, il a peut être déjà été évoqué dans le forum, mais bon au cas ou ....

    http://www.nacs.uci.edu/rcs/gis/ao_programs/index.html

    A++

    édit : même si les fonctions proposées ne font pas exactement ce que vous voulez, il y'a pas de fonctions annexes incluses qui sont très intéressantes ....
    Dernière modification par Lud ; 12/03/2013 à 14h51.

  9. #9

    Date d'inscription
    août 2005
    Localisation
    Caen
    Emploi
    Chargée d'études
    Messages
    412

    Par défaut

    Juste un petit rajout pour recuperer la Liste complete des couches
    Code:
    Sub ListAllDataLayers()
    
    '1   esriDTAny   Any Dataset.
    '2   esriDTContainer Any Container Dataset.
    '3   esriDTGeo   Any Geo Dataset.
    '4   esriDTFeatureDataset    Feature Dataset.
    '5   esriDTFeatureClass  Feature Class.
    '6   esriDTPlanarGraph   Planar Graph.
    '7   esriDTGeometricNetwork  Geometric Network.
    '8   esriDTTopology  Topology.
    '9   esriDTText  Text Dataset.
    '10  esriDTTable Table Dataset.
    '11  esriDTRelationshipClass Relationship Class.
    '12  esriDTRasterDataset Raster Dataset.
    '13  esriDTRasterBand    Raster Band.
    '14  esriDTTin   Tin Dataset.
    '15  esriDTCadDrawing    CadDrawing Dataset.
    '16  esriDTRasterCatalog Raster Catalog.
    '17  esriDTToolbox   Toolbox.
    '18  esriDTTool  Tool.
    '19  esriDTNetworkDataset    Network Dataset.
    '20  esriDTTerrain   Terrain dataset.
    '21  esriDTRepresentationClass   Feature Class Representation.
    '22  esriDTCadastralFabric   Cadastral Fabric.
    '23  esriDTSchematicDataset  Schematic Dataset.
    '24  esriDTLocator   Address Locator.
    
        Dim pDocDatasets As IDocumentDatasets
        Set pDocDatasets = ThisDocument
        
        Dim pEnumDS As IEnumDataset
        Set pEnumDS = pDocDatasets.Datasets
        
        Dim pDS As IDataset
        Set pDS = pEnumDS.Next
        Do While Not pDS Is Nothing
            If TypeOf pDS Is IDataLayer Then
                Debug.Print pDS.Name & " implemente Idatalayer"
                Debug.Print pDS.Type
            Else
            
                Debug.Print pDS.Name & " n'implemente pas Idatalayer"
            End If
            Set pDS = pEnumDS.Next
        Loop
    
    End Sub
    Elmo

  10. #10

    Date d'inscription
    juillet 2005
    Localisation
    Clamart
    Emploi
    développeur SIG
    Messages
    103

    Par défaut

    Pour les débutants il manque aussi le parcours des blocs de données (ou Map) d'un document :
    Code:
        Dim pMxDocument As IMxDocument
        'récupération pointeur vers le document courant
        Set pMxDocument = ThisDocument
        Dim pMaps As IMaps
        'récupérer la collection des cartes du document (les blocs de données)
        Set pMaps = pMxDocument.Maps
        'parcours de la collection de carte et affichage du nom
        Dim pMap As IMap
        Dim i As Integer
        For i = 0 To pMaps.Count - 1
            Set pMap = pMaps.Item(i)
            MsgBox (pMap.Name)
        Next
    Guiles78

  11. #11

    Date d'inscription
    novembre 2005
    Localisation
    Pacifique
    Organisme
    Indépendant
    Messages
    24

    Par défaut

    Bonjour,

    Génial ce post ;-)

    Hélas, j'ai fait un copier coller du code pour Parcours des enregistrements d'une table

    Et j'ai un message d'erreur sur la ligne
    Code:
            Set pRow = pTable.GetRow(i)
    Pourtant pTable.RowCount(Query) me retourne bien un nombre d'enregistrement non nul...

    Je ne comprend pas
    Impossible is not Bruno

  12. #12
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    32
    Messages
    1 906

    Par défaut

    Bonjour,

    La méthode de parcours proposée plus bas fonctionne mais est très lente !
    Les parcours / mise à jour se font beaucoup plus rapidement avec l'utilisation des curseurs (à vue de nez, au moins 1000 fois plus vite).

    Le code équivalent à celui proposé plus bas est avec cette méthode :

    Code:
    'les variables pour utiliser ArcMap
    Dim pMxApp As IMxApplication
    Dim pDoc As IMxDocument
    Dim pMap As IMap
    
    'les objets ArcMap
    Set pMxApp = Application
    Set pDoc = Application.Document
    Set pMap = pDoc.FocusMap
    
    
        Dim pLayer As IFeatureLayer
        Dim pFeature As IFeature
        Dim pFClass As IFeatureClass
        Dim pTable As ITable
        Dim pCursor As ICursor
        Dim pRow As IRow
       
        'On récupère la n ème couche de la carte
        Set pLayer = pMap.Layer(0)
       
        ' .. et la classe d'entité associée
        Set pFClass = pLayer.FeatureClass
       
        Set pTable = pLayer
       
        Dim Query As IQueryFilter
        Set Query = New QueryFilter
    
        Dim NbEnr As String
        NbEnrg = pTable.RowCount(Query)
        Debug.Print NbEnrg & " enregistrements / objets dans cette couche"
        
        'On définit le curseur
        Set pCursor = pTable.Search(Query, False)
        'NB1 : ici le curseur est en mode consultation
        'NB2 : si on ne veut pas utiliser une sélection de la table, on peut sauter l'étape du Queryfilter et écrire directement
        'Set pCursor = pTable.Search(Nothing, False)
    
        'On va à la première ligne
        Set pRow = pCursor.NextRow
           
        'On boucle
        While Not (pRow Is Nothing)
            Debug.Print pRow.Value(2) 'l'index du champ à traiter
            
            'Ligne suivante
            Set pRow = pCursor.NextRow
        Wend
    Jérémie

  13. #13

    Date d'inscription
    novembre 2005
    Localisation
    Pacifique
    Organisme
    Indépendant
    Messages
    24

    Par défaut

    Bonjour,

    Citation Envoyé par jeremie-lupsig Voir le message

    La méthode de parcours proposée plus bas fonctionne mais est très lente !
    Les parcours / mise à jour se font beaucoup plus rapidement avec l'utilisation des curseurs (à vue de nez, au moins 1000 fois plus vite).
    Tu veux dire que ta méthode est plus rapide ?

    En tout cas, elle marche !!!
    Un grand merci !

    Je rajoute juste une petite fonction qui m'est très utile :

    Retourne le numéro de la couche à partir du nom
    Code:
    Function FindNumTable(ByVal NameTable As String) As Integer
        '----------------------------------------------------------
        '  Retourne le numéro de la couche à partir du nom
        '----------------------------------------------------------
        Dim pMxDoc As IMxDocument
        Set pMxDoc = ThisDocument
        Dim pMap As IMap
        'On récupère dans pMap un pointeur sur la carte active (focus map)
        Set pMap = pMxDoc.FocusMap
        Dim i As Integer
        'Boucle sur le nombre de couche (numérotées à partir de 0)
        For i = 0 To pMap.LayerCount - 1
        'Si la ième couche porte le nom recherché, la fonction
        ' retourne cette couche
        If pMap.Layer(i).Name = NameTable Then
            FindNumTable = i
        End If
        Next
    End Function
    Si quelqu'un a la fonction qui retourne le numéro du champ d'une couche à partir de son nom

    A bientôt pour de nouvelles aventures lool
    Dernière modification par BrunoG ; 10/12/2009 à 21h21.
    Impossible is not Bruno

  14. #14
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    32
    Messages
    1 906

    Par défaut

    Oui, l'utilisation des curseurs (classe Icursor) pour le parcours ou la mise à jour des enregistrements et de la géométrie est infiniment plus rapide que si on parcourt sans.
    Sur un programme que j'avais modifié qui parcourt la géométrie pour calculer un attribut sur des couches de plusieurs dizaines de milliers de polylignes, je suis passé avec l'utilisation des curseurs à un temps de calcul de moins de 30s contre plus d'1h auparavant.

    Jérémie

  15. #15

    Par défaut

    pouvais vous m'aider en m'envoyant le code pour afficher les noms des attributs d'une couche

 

 
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ArcGIS 9.x] Parcourir champs d'une table pour les afficher dans un listbox
    Par kevinA4 dans le forum Programmation
    Réponses: 3
    Dernier message: 16/02/2011, 18h17
  2. Réponses: 1
    Dernier message: 18/02/2010, 08h57
  3. [ArcGIS 9.x] Parcourir dossiers disque dur
    Par kael dans le forum Programmation
    Réponses: 5
    Dernier message: 29/08/2008, 00h18
  4. Réponses: 3
    Dernier message: 28/04/2008, 20h18
  5. [ArcGIS 9.x] Parcourir les champs d'une table
    Par bijou dans le forum Programmation
    Réponses: 5
    Dernier message: 24/05/2005, 16h51

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •