IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA - Méthode BrowseForFolder a échoué


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut VBA - Méthode BrowseForFolder a échoué
    Bonjour à tous,

    J'ai récupéré un script VBA permettant, via des boites de dialogue, de découper en plusieurs dalles un fichier raster. (via un programme FWtools)
    Tout marche bien sauf une chose, lorsqu'une boite de dialogue s'ouvre pour choisir le fichier raster à importer, j'obtiens l'erreur suivante :

    Erreur d'exécution '-2147024894 (80070002)':

    La méthode 'BrowseForFolder' de l'objet 'IShellDispatch4' a échoué.
    Je colle les lignes concernées lorsque je fais un débug :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set monraster_src = CreateObject("Shell.Application")
     
    Set objFichier = monraster_src.BrowseForFolder(&H0&, "Veuillez indiquer le chemin d'accès au fichier " & descrFichier & " à importer", &H4000&)
    Le plus étonnant est que ce script fonctionne sans erreur chez la personne m'ayant fourni le code.

    Quelq'un pourrait-il m'aider ?

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut VBA - Méthode BrowseForFolder a échoué
    Re-Bonjour tout le monde !

    Bon eh bien déçu de n'avoir reçu aucune réponse...peut-être mon problème ne vous intéresse-t-il pas ou je ne suis pas assez explicite ? Pour le coup, je colle une bonne partie du script vba, cela intéressera peut-être davantage quelqu'un !
    Petit rappel, ce script permet, après exécution du UserForm :
    - d'afficher des boites de dialogues pour spécifier des coordonnées en pixel,
    - de choisir un chemin pour le dossier dans lequel seront stockés les fichiers générés,
    - d'entrer des noms de fichiers pour les batchs à générer,
    - choisir le chemin du dossier où se trouve le fichier raster à découper

    Enfin, normalement, 1 fichier.bat est généré, qui lance un utilitaire (fwtools et gdal_translate) et permet de créer des tuiles d'un raster.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    Option Explicit
    Public chemin As String
    Public monraster_2 As String
    Public chaine_gdalinfo As String
    Public T As Double
    Public L_Y As Variant
    
    Public Function RoundUp(ByVal vvaleur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
       If Abs(iNbDecimal) < 5 Then RoundUp = -Int(-vvaleur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
    End Function
    Public Sub batch()
    
    Dim Coordxmin As Long
    Dim I As Long
    Dim J As Long
    Dim I2 As Long
    Dim J2 As Long
    Dim Pas As Long
    Dim Pas_Y As Long
    Dim Pas2 As Long
    Dim Pas3 As Long
    Dim CoordXvalid As Long
    Dim CoordYvalid As Long
    Dim Coordxmax As Long
    Dim Coordymin As Long
    Dim Coordymax As Long
    Dim Gdalcy2 As Long
    Dim Gdalcy1 As Long
    Dim Gdalcx1 As Long
    Dim Gdalcx2 As Long
    Dim X As Integer
    Dim Y As Integer
    Dim T As Double
    Dim L As Variant
    Dim L_Y As Variant
    Dim dossier As Object, Rep As Object
    Dim chemin As String
    Dim MonBatch As String
    Dim Monbacth_info As String
    Dim bat As String
    Dim monraster_src As Object
    Dim objFichier As Object
    Dim objAppli As Object
    Dim descrFichier As String
    Dim monraster As String
    Dim monraster_2 As String
    Dim chaine_gdalinfo As String
    Dim NomFic As String, Chaine As String, Chaine2 As String, Chaine3 As String, chaine4 As String
    Dim bat_sans_bat As String
    Dim nom_dossier As String
    Dim nom_dossier_txt As String
    Dim gdal_acces As String
    Dim gdal As String
    Dim metadonnees As String
    Dim laligne
    Dim position_pixel As Long
    Dim newHour As Variant
    Dim newMinute As Variant
    Dim newSecond As Variant
    Dim waitTime As Variant
    
    
    
    
    'fonction GDAL
    Const Gdalinfo As String = "gdalinfo"
    
    
    'taille du pixel en mètre fournit par GDALINFO
    Const Gdal_translate As String = "gdal_translate -of GTiff -srcwin "
    
    
    
    'coordo en pixel des coins nord ouest et sud est
    
    Coordxmin = Range("A2")
    Coordxmax = Range("B2")
    Coordymin = Range("C2")
    Coordymax = Range("D2")
    
    'pas terrain que l'on souhaite avoir pour découpage en mètre
    L = Range("E2")
    L_Y = Range("F2")
    
    I = 0
    J = 0
    
    
    'Initialisation des paramètres, pour de compléter le fichier batch
    
    'Active l'appli shell pour lancer l'ouverture du répertoire
    Set dossier = CreateObject("Shell.Application")
        
    'Ouvre la boîte de dialogue "sélection d'un répertoire"
        Set Rep = dossier.BrowseForFolder(&H0&, "Sélectionner un répertoire", &H1&)
        
    'Si le chemin est vide, alors prend le chemin que l'on donne
        If Not Rep Is Nothing Then
            
            Set Rep = Rep.items.Item
            chemin = Rep.Path
                  
        End If
        
    'saisir le nom du fichier batch que l'on va mettre dans le répertoire choisit précédemment
       MonBatch = InputBox("Saisir le nom du Fichier batch TRANSLATE")
       
    
    Monbacth_info = InputBox("saisir le nom du batch pour GDALINFO")
       
    'concatenation du chemin d'accès
      bat = chemin & "\" & MonBatch
    'retire au chemin d'accès l'extention du fichier .bat
     bat_sans_bat = Left(bat, Len(bat) - 4)
      
    'Active l'appli shell pour lancer l'ouverture du répertoire source des données raster
    Set monraster_src = CreateObject("Shell.Application")
    
    'Ouverture de la boîte de dialogue pour sélectionner le fichier voulu
    Set objFichier = monraster_src.BrowseForFolder(&H0&, "Veuillez indiquer le chemin d'accès au fichier " & descrFichier & " à importer", &H4000&)
     
    monraster = chemin & "\" & objFichier
    monraster_2 = chemin & "\" & Monbacth_info
    gdal = "C:\soft\FWTOOL~1.2\bin"
    
        Open monraster_2 For Output As #1
        
            gdal_acces = "cd" & " " & gdal
            chaine_gdalinfo = Gdalinfo & " " & monraster & " " & ">" & " " & monraster & ".txt"
    
    
            Print #1, gdal_acces
            Print #1, chaine_gdalinfo
       
        Close #1

    Voilà, lorsque j'en suis à l'étape de choix du chemin pour le fichier raster, je reçois une erreur que j'ai mentionné dans mon 1er post...et les lignes concernées après debug sont en rouge...

    Merci pour vos réponses si vous trouvez une solution !

    Ps : ma version d'excel est 2003 sp3

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour, et un peu en retard... bienvenue sur le forum.
    ton code doit fonctionner, seule possibilité que je vois, tu n'a pas mis la référence Ole Automation.
    A+

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Bonjour LeForestier,

    Merci pour ton message de bienvenue et également merci pour ta réponse !
    Je ne suis pas encore un pro en vba, que veux-tu dire donc concernant la référence Ole Automation ? Est-ce que c'est une déclaration de variable ? Un outil à activer ?
    Merci beaucoup !

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Quand tu est dans l'éditeur VBA (IDE)
    Outils >> Références >> dans la fenêtre tu cherche Ole Automation, tu ckeck. et OK
    Tu dis.
    A+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Eh bien j'ai vérifié, et Ole Automation était bien activé...
    C'est pas vrai, je sens que je ne trouverai jamais de solution décidément...

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Fait un test avec le code ci-dessous pour voir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub ChoisirRepertoir()
    Dim Chemin As String, NB As Long
    Dim objShell As Object, objFolder As Object, oFolderItem As Object
        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
     
        On Error GoTo ERREUR
        Set oFolderItem = objFolder.Items.Item
        On Error GoTo 0
        Chemin = oFolderItem.Path
        If Chemin = "" Then Exit Sub
        Set oFolderItem = objFolder.Items.Item
        'i = 0
        'CompterFichiers Chemin, NB, "xls"
        'MsgBox "Il y a " & NB & " fichiers"
        MsgBox Chemin
    ERREUR:
    End Sub
    A+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Merci pour ton suivi le forestier!

    Bon j'ai testé ton code dans un nouveau module et ça marche, j'ai essayé de l'incorporer dans mon script et ça évite l'erreur que j'ai mentionné...
    Le seul souci, c'est qu'à la base, il ne faut pas seulement aller chercher le chemin où se trouve le fichier, mais le fichier lui-même...
    Je ne sais pas si je m'explique bien, mais ton script et le mien font la même chose, à savoir une boite de dialogue permettant de choisir le chemin vers un dossier...mon script génère une erreur à partir du moment où je sélectionne le fichier contenu dans le dossier...et si ce fichier n'est pas bien mémorisé, la suite du script est faussée....
    Voilà...merci pour ce que tu pourras me dire après ça !

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Je n'avais pas bien compris que tu voulais ouvrir un classeur (pas tout lu ton code)
    essaye...pour voir si ça ne te convient pas mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub OuvrirFichier()
    Dim OuvrFich
    OuvrFich = Application _
        .GetOpenFilename("Excel Files (*.xls), *.xls")
    If OuvrFich <> False Then
        MsgBox "Fichier sélectionner = " & OuvrFich
    End If
     
    End Sub
    Tu peu changer le nom des fichiers et extentions.
    A+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Encore merci pour les solutions que tu me proposes !
    Juste, les fichiers que je dois ouvrir sont des images (GéoTiff, Ttiff, ECW, etc), et le fichier que je dois récupérer, est ensuite chargé pour générer un .bat, qui lui-même va lancer l'utilitaire dont je te parlais dans le précédent post...
    Avec la fonction que tu m'as donné, est-ce que ça permettra de faire ce que je viens de te décrire..?
    Voudrais-tu que je te colle l'ensemble du code ?
    Et je peux réécrire plus clairement toutes les étapes de ce que permet de faire le script ?

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Si tu a copier l'exemple que je met...
    Tu doubleClic sur GetOpenFilename pour le mettre en surbrillance et tu tape F1..
    Et plus spécialement sur Filtre
    A+

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Re LeForestier !

    Oui merci de tes indications, je n'ai pas encore les réflexes de consulter l'aide sur des fonctions que je ne connais pas trop ^^
    Donc le code que tu m'as collé récupère bien le fichier...néanmoins ça créée une autre erreur plus bas dans le code...(je te remets l'ensemble du script en mettant en rouge le code que tu m'as donné plus la ligne où une nouvelle erreur est apparue --> erreur d'exécution 52 Nom ou numéro de fichier incorrect)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    
    Option Explicit
    Public chemin As String
    Public monraster_2 As String
    Public chaine_gdalinfo As String
    Public T As Double
    Public L_Y As Variant
    
    Public Function RoundUp(ByVal vvaleur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
       If Abs(iNbDecimal) < 5 Then RoundUp = -Int(-vvaleur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
    End Function
    Public Sub batch()
    
    Dim Coordxmin As Long
    Dim I As Long
    Dim J As Long
    Dim I2 As Long
    Dim J2 As Long
    Dim Pas As Long
    Dim Pas_Y As Long
    Dim Pas2 As Long
    Dim Pas3 As Long
    Dim CoordXvalid As Long
    Dim CoordYvalid As Long
    Dim Coordxmax As Long
    Dim Coordymin As Long
    Dim Coordymax As Long
    Dim Gdalcy2 As Long
    Dim Gdalcy1 As Long
    Dim Gdalcx1 As Long
    Dim Gdalcx2 As Long
    Dim X As Integer
    Dim Y As Integer
    Dim T As Double
    Dim L As Variant
    Dim L_Y As Variant
    Dim dossier As Object, Rep As Object
    Dim chemin As String
    Dim MonBatch As String
    Dim Monbacth_info As String
    Dim bat As String
    Dim monraster_src As Object
    Dim objFichier As Object
    Dim objAppli As Object
    Dim descrFichier As String
    Dim monraster As String
    'Dim monraster_2 As String
    'Dim chaine_gdalinfo As String
    Dim NomFic As String, Chaine As String, Chaine2 As String, Chaine3 As String, chaine4 As String
    Dim bat_sans_bat As String
    Dim nom_dossier As String
    Dim nom_dossier_txt As String
    Dim gdal_acces As String
    Dim gdal As String
    Dim metadonnees As String
    Dim laligne
    Dim position_pixel As Long
    Dim newHour As Variant
    Dim newMinute As Variant
    Dim newSecond As Variant
    Dim waitTime As Variant
    Dim OuvrFich
    
    'fonction GDAL
    
    Const Gdalinfo As String = "gdalinfo"
    
    
    Const Gdal_translate As String = "gdal_translate -of GTiff -srcwin "
    'taille du pixel en mètre fournit par GDALINFO
    
    
    'coordo en pixel des coins nord ouest et sud est
    'Coordxmin = 530
    Coordxmin = Range("A2")
    'Coordxmax = 13496
    Coordxmax = Range("B2")
    'Coordymin = 551
    Coordymin = Range("C2")
    'Coordymax = 9400
    Coordymax = Range("D2")
    'calcul du pas pour en pixel
    'Pas = (L / T)
    'T = 5.805
    'T = Range("E2")
    'pas terrain que l'on souhaite avoir pour découpage en mètre
    'L = 10000
    L = Range("E2")
    L_Y = Range("F2")
    
    I = 0
    J = 0
    
    'calcul du nombre d'itérations nécessaires pour les calculs en appliquant la focntion d'arrondi supérieur
    'X = RoundUp((Coordxmax - Coordxmin) / Pas - 1)
    'Y = RoundUp((Coordymax - Coordymin) / Pas - 1)
    
    'Initialisation de tous les paramètres, afin de compléter le fichier batch
    
    'Active l'appli shell pour lancer l'ouverture du répertoire
    Set dossier = CreateObject("Shell.Application")
        
    'Ouvre la boîte de dialogue "sélection d'un répertoire"
        Set Rep = dossier.BrowseForFolder(&H0&, "Sélectionner un répertoire", &H1&)
        
    'Si le chemin est vide, alors prend le chemin que l'on donne
        If Not Rep Is Nothing Then
            
            Set Rep = Rep.items.Item
            chemin = Rep.Path
                  
        End If
        
    'saisir le nom du fichier batch que l'on va mettre dans le répertoire choisit précédemment
       MonBatch = InputBox("Saisir le nom du Fichier batch TRANSLATE")
       
    
    Monbacth_info = InputBox("saisir le nom du batch pour GDALINFO")
       
    'concatenation du chemin d'accès
      bat = chemin & "\" & MonBatch
    'retire au chemin d'accès l'extention du fichier .bat
     bat_sans_bat = Left(bat, Len(bat) - 4)
      
      
      OuvrFich = Application _
        .GetOpenFilename("Files (*.*), *.*")
    If OuvrFich <> False Then
        MsgBox "Fichier sélectionner = " & OuvrFich
    End If
    
    'Active l'appli shell pour lancer l'ouverture du répertoire source des données raster
    'set monraster_src = CreateObject("Shell.Application")
    
    
    'Ouverture de la boîte de dialogue pour sélectionner le fichier voulu
    'Set objFichier = monraster_src.BrowseForFolder(&H0&, "Veuillez indiquer le chemin d'accès au fichier " & descrFichier & " à importer", &H4000&)
     
    
     
    monraster = chemin & "\" & OuvrFich
    monraster_2 = chemin & "\" & Monbacth_info
    gdal = "C:\soft\FWTOOL~1.2\bin"
    
        Open monraster_2 For Output As #1
        
            gdal_acces = "cd" & " " & gdal
            chaine_gdalinfo = Gdalinfo & " " & monraster & " " & ">" & " " & monraster & ".txt"
    
    
            Print #1, gdal_acces
            Print #1, chaine_gdalinfo
       
        Close #1
    
    
    'nom_dossier = "C:\soft\FWTools2.1.1\setfw.bat"
    'execute le batch qui créer le fichier texte relatif aux metadonnées
    Shell "cmd.exe /c" & monraster_2, vbNormalFocus
    
    'si on veut supprimer le fichier batch, employer un kill apres execution
    
    
    metadonnees = monraster & ".txt"
    
    'temporisation de 2 secondes entre la création du fichier txt et la recherche de la valeur du pixel
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 5
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime
    
    
    Open metadonnees For Input As #1
    
    Do While Not EOF(1)
        
        Line Input #1, laligne
        position_pixel = InStr(1, laligne, "Pixel Size = (", vbTextCompare)
        If position_pixel > 0 Then
        T = Mid(laligne, position_pixel + 14, 7)
        MsgBox "Taille du pixel de l'image = " & T
        Exit Do
        End If
       
    Loop
    
    'Print #1, T
    
    
    Close #1
    
    
    
    
    
    
    
    'calcul du pas pour en pixel
    Pas = (L / T)
    Pas_Y = (L_Y / T)
    'calcul du nombre d'itérations nécessaires pour les calculs en appliquant la focntion d'arrondi supérieur
    X = RoundUp((Coordxmax - Coordxmin) / Pas - 1)
    Y = RoundUp((Coordymax - Coordymin) / Pas_Y - 1)
    
    
    'lance la commande pour créer et remplir le fichier batch
    Open bat For Output As #1
    'Boucle sur les lignes et colonnes de l'image
    For I = 0 To X
        For J = 0 To Y
            gdal_acces = "cd" & " " & gdal
            NomFic = bat_sans_bat & "_" & I & "_" & J & "ok.tif"
            'NomFic = Chemin & "\" & MonBatch & "_" & I & "_" & J & "ok.tif"
            'NomFic = "c:/temp/7349/7349" & "_" & I & "_" & J & "ok.tif"
            'calcul de la nouvelle coordonnée de départ en X
            Gdalcx1 = Coordxmin + I * Pas
            
            'calcul de la nouvelle coordonnée de départ pour Y
            Gdalcy1 = Coordymin + J * Pas_Y
            I2 = Gdalcx1 + Pas
            J2 = Gdalcy1 + Pas_Y
            
                'Condition d'itération, si la valeur de la coord X maximale est supérieure à l'emprise de l'image
                'il faut appliquer un nouveau Pas de calcul, inférieur au pas général. Il faut l'appliquer dans
                'la chaine de concaténation de la formule
                
                If I2 > Coordxmax Then
                     NomFic = bat_sans_bat & "_" & I2 & "_" & J2 & "ok.tif"
                     'NomFic = Chemin & "\" & MonBatch & "_" & I2 & "_" & J2 & "ok.tif"
                     'NomFic = "c:/temp/7349/7349" & "_" & I2 & "_" & J2 & "ok.tif"
                     CoordXvalid = I2 - Pas
                     Pas2 = Coordxmax - CoordXvalid
                   
                        Chaine2 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas2 & " " & Pas & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
                
                'Condition d'itération, si la valeur de la coord Y maximale est supérieure à l'emprise de l'image
                'il faut appliquer un nouveau Pas de calcul, inférieur au pas général. Il faut l'appliquer dans
                'la chaine de concaténation de la formule
                
                ElseIf J2 > Coordymax Then
                     CoordYvalid = J2 - Pas_Y
                     Pas3 = Coordymax - CoordYvalid
                    
                        Chaine3 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas & " " & Pas3 & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
                     
                End If
    
                'Il ne faut pas oublier le cas, où X et Y sont hors de l'emprise (le coin sud-est), c'est pourquoi
                'il faut spécifier qu'à la fois I2 et J2 sont supérieurs aux max X et Y
                'C'est pourquoi, il est nécessaire d'appliquer le Pas de X inférieur au pas normal et le pas de Y inférieur au pas normal
                
                If I2 > Coordxmax And J2 > Coordymax Then
                    
                        chaine4 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas2 & " " & Pas3 & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
                
                End If
    'Condition si, la coordo de départ est hors "cadre" alors il faut que la chaine soit vide, c'est-à-dire non utilisée
    
                Select Case Gdalcx1 + Pas > Coordxmax
    
                    Case Gdalcy1 + Pas_Y > Coordymax
     
                    Chaine = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas & " " & Pas_Y & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
     
                    Case Else
     
                    Chaine = ""
    
                End Select
             
         'applique dans le batch les différentes chaines de calcul GDAL
            Print #1, gdal_acces
            Print #1, Chaine
           Print #1, Chaine2
          Print #1, Chaine3
        Print #1, chaine4
        'fin des boucles
        Next J
    Next I
    
    'ferme le fichier batch
    Close #1
    'execute le batch qui découpe l'image
    Shell "cmd.exe /c" & bat, vbNormalFocus
    
    
    End Sub

    Ce bout de code est le module 1, j'ai également des déclarations de sub dans un module 2 plus un userform...mais je ne pense pas que cela joue sur mon erreur !!
    Enfin, vu que je te colle l'ensemble du code cette fois-ci, le but d'aller chercher et d'ouvrir ce fichier, c'est pour l'incorporer dans un fichier batch pour traitements ultérieurs...

    Au cas où t'en a marre de suivre mon problème, je n'en tiendrai pas rigueur !

    Sinon toutes les bonnes âmes sont les bienvenues !!

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Dans ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      OuvrFich = Application _
        .GetOpenFilename("Files (*.*), *.*")
    If OuvrFich <> False Then
        MsgBox "Fichier sélectionner = " & OuvrFich
    End If
    Si OuvrFich = False, la ligne de l'erreur s'exécute malgré tout...
    Open metadonnees For Input As #1
    Vérifie le nom que tu as ds metadonnees avant cette ligne

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Bonjour ouskel'n'or !

    Eh bien, pour metadonnees, elle prend la valeur = monraster & ".txt"
    Encore plus haut, monraster = chemin & "\" & OuvrFich

    Je pensais donc que toutes les références étaient correctes...
    Je ne vois pas ce que je pourrais changer...
    Merci si tu as une idée !

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ce que je te proposais était précisément d'afficher metadonnees pour vérifier ce qu'il y a dedans (oubli de \ par exemple)
    Tu peux faire ça soit avec un msgbox soit avec debug.print et en affichant la fenêtre exploration dans VBA.
    Tu dis
    A+

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    J'ai suivi ta méthode et en pointant sur debug.print metadonnees, j'obtiens :
    metadonnees = "C:\carto\new\C:\carto\new\new.tif.txt"

    Effectivement, quelque chose ne va pas dans le chemin...par contre, pour corriger ça, j'ai essayé d'affecter : monraster = OuvrFich et j'obtiens alors metadonnees = "C:\carto\new\new.tif.txt"
    Ce résultat peut sembler passablement mieux...

    L'ennui c'est que ça fait planter le reste du script...décidément, à vouloir changer des petits bouts, je n'arriverai qu'à déplacer le problème...

    AAAArrrrrrghghhgh !!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    1 - Quelle syntaxe de chemin est-elle exacte ?
    "C:\carto\new\"
    ou
    "C:\carto\"
    2 - Si c'est la première, le répertoire existe-t-il ?
    3 - Quel nom de fichier veux-tu ?
    new.tif.txt
    ou
    New.tif
    ou
    new.txt ?
    4 - New est-il une variable ou est-ce le nom ?
    Essaie de répondre aux quatre questions
    A+

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    J'ai résolu l'erreur (^^), enfin, en partie du moins !!
    (C'était en fait l'utilitaire qui est lancé par les batchs qui ne fonctionnait pas !)

    Pour t'expliquer un peu :

    - j'importe le fichier raster dont j'ai spécifié le chemin (ça, ça marche maintenant !)
    - le nom / type et le chemin du fichier en question est incorporé dans une ligne de commande;
    - cette ligne de commande est exécutée en générant un batch
    - et cela lance un utilitaire qui va dans un 1er temps récolter des infos de coordonnées,etc en fonction du système de coordonnées/géoréférencement du fichier raster.
    - ces infos sont stockées dans un fichier txt (d'où le new.tif.txt) --> en fait new.tif est le fichier raster...
    - à partir des infos stockées dans ce fichier txt, une boucle (celle sur laquelle j'ai de nouveau un soucis!) va calculer les coordonnées des dalles du raster initial, en créant une nouvelle ligne de commande exécutée par un nouveau batch;..;

    Est-ce plus clair ou j'embrouille encore plus ??!!

    Donc, maintenant, j'arrive à récupérer le fichier que je veux, ça lance mon utilitaire et les infos nécessaires sont stockées dans le fichier txt...
    Mais au niveau de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Do While Not EOF(1)
        
        Line Input #1, laligne
        position_pixel = InStr(1, laligne, "Pixel Size = (", vbTextCompare)
        If position_pixel > 0 Then
        T = Mid(laligne, position_pixel + 14, 7)
        MsgBox "Taille du pixel de l'image = " & T
        Exit Do
        End If
    
    Loop
    J'ai de nouveau une erreur d'exécution 13 : incompatibilité de type...

    Mais là, on touche un peu plus à la carto, coordonnées en pixel etc, donc je pense que tu ne pourras pt etre plus m'aider !!

    Je tiendrais au courant si j'arrive à faire fonctionner le tout correctement...

    A+ et merci pour les conseils !

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    je pense que tu ne pourras pt etre plus m'aider !!
    p'têt' binxi...
    Donne-nous une ligne complète rien que pour voir (je ne comprends pas où sont tes données, juste après "(" ou 14 caractères plus loin comme tu l'écris )
    Raconte
    A+

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Par défaut
    Dernier post pour mon problème !

    Tout est à présent résolu, ma dernière erreur était due non seulement à une mauvaise déclaration de variables et le plus important, aux options régionales linguistiques : le séparateur pour les nombres décimaux était la virgule, et il fallait que ce soit un point.(l'incompatibilité de type était donc causée par un nombre décimal dont le séparateur était un point tandis que mon système le voyait en tant que virgule !)

    Voilà...en tout cas merci beaucoup à tous pour votre suivi, vos solutions et conseils, et en particulier pour la solution de récup du fichier !!

    A bientot tout le monde

Discussions similaires

  1. [AC-2007] Code VBA : Méthode OpenReport et Access en non visible : ShowWindow
    Par thierrylosson dans le forum Access
    Réponses: 0
    Dernier message: 28/05/2015, 11h40
  2. [XL-2007] Union(range(Tb1),range(Tb2)).find => la méthode 'Union' a échoué
    Par mouftie dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 27/05/2015, 22h20
  3. La méthode SEARCH a échoué
    Par clem200 dans le forum Général VBA
    Réponses: 2
    Dernier message: 25/04/2014, 10h01
  4. [XL-2000] Erreur 1004 méthode global a échoué
    Par Sierra dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/03/2010, 23h21
  5. Réponses: 4
    Dernier message: 20/01/2006, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo