Se connecter avec
S'enregistrer | Connectez-vous

Macro renomage fichiers aléatoire

Dernière réponse : dans Programmation

Bonjour,
je suis dans la recherche et je n'y connais pas grand chose en programmation informatique c'est pourquoi je vous demande à l'aide.

J'aurai aimé faire une macro qui permette de copier et renommer des dossiers (comprenant 3 ou 4 fichiers) de façon aléatoire pour que je ne sache plus à quoi ils correspondent. Bien entendu il faudrait que le système me crée un fichier texte me donnant les correspondances entre les anciens noms et les nouveaux noms aléatoires pour que je puisse retrouver à quoi ça correspond une fois que mon analyse en aveugle sera terminée.

Je sais que j'en demande beaucoup mais c'est très important...alors merci beaucoup d'avance à ceux ou celles qui pourront m'aider.

Lassé par la pub ? Créez un compte
Expert Programmation

Bonjour biboudet6,

As-tu fait un réel effort de rédaction, ou bien concordes-tu les temps aussi naturellement ? Cette remarque juste parce qu'il est si rare de voir quelqu'un s'exprimer correctement sur les forums, ce dont je te remercie.

En ces temps de rentrée, voilà un premier bon point.

Passons maintenant aux point négatifs...
  • Premièrement, nous ne réalisons aucun travail, même rémunéré, conformément au règlement. Il va donc falloir que tu t'y colles toi-même, quitte à accepter un peu de notre aide, pas plus !
  • Deuxièmement, tu ne précises pas quels langages tu souhaites utiliser. Le VB dans le rubrique VB, c'est un minimum. Oui, mais lequel ? VB, VBA (Excel, Word, autre) VBS ?

    Tout d'abord merci pour ta réponse rapide.

    Ensuite c'est une macro VBA sur excel que j'aimerai avoir.

    Troisièmement voici le point de départ que j'ai (à la fin du message): en fait c'est une macros que j'avais fait avec quelqu'un qui s'y connaissait durant un ancien stage. J'aurai aimé adapter cette macro à mes nouveaux types de données mais je n'y suis pas arrivée. Le problème étant que je n'ai pas les mêmes types de dossier, sous dossiers etc...

    en gros j'ai un gros dossier "09 09 2009"
    dans lequel se trouve plusieurs sous dossier "control" + "1h" + "2h" + etc...
    dans chacun de ses dossiers j'ai une liste de fichiers qui se nomment "control_0_vert", "control_0_rouge", "control_0_bleu", "control_1_vert, control_1_rouge", "control_1_bleu"...
    et j'aimerai avoir au final un gros dossier qui comprennent toutes les photos mélangées (control, 1h ...) renommées a_0_bleu, a_0_rouge, a_0_vert... pour que je ne sache plus si c'est control, 1h, 2h mais que les trois photos (bleu, vert, rouge)correspondant à la même chose (n°0,1,2...) restent codées de facon cohérente (a_0-rouge, a_0_vert, a_0_bleu). Et que ca me cré un fichier texte qui me donne les correspondances pour que je puisse retrouver après analyse à quoi ca correspond (dans la macros que j'ai mis à la suite la dernière partie est censée faire ca)

    Je ne sais pas si c'est très clair...navrée, je sais que c'est un peu compliqué et que je demande beaucoup mais c'est dur pour une biologiste de faire de la programmation sans y avoir jamais touché!

    En tout cas un énorme merci ne serait-ce que pour l'intérêt que tu portes à ma requête.


    Dim avant(1 To 1000) As String
    Dim apres(1 To 1000) As String
    Dim suf As String
    Dim typ As String

    Sub MelangeImages()

    Dim chemin As String
    Dim nb As Integer

    Randomize

    'Les images à mélanger doivent être dans un dossier à part; elles vont par deux : "name x" et "name x tub"; le dossier "dossier_shuff" sera détruit
    suf = " tub"
    chemin = Application.GetOpenFilename(, , "Sélectionner un des fichiers à mélanger")
    If chemin = "Faux" Then End

    a = ""
    b = 1
    typ = Mid(chemin, Len(chemin) - 3)
    Do Until a = "/" Or a = "\"
    a = Mid(chemin, Len(chemin) - b, 1)
    b = b + 1
    Loop
    chemin = Mid(chemin, 1, Len(chemin) - b)
    a = ""
    b = 1
    Do Until a = "/" Or a = "\"
    a = Mid(chemin, Len(chemin) - b, 1)
    b = b + 1
    Loop
    dossier = Mid(chemin, Len(chemin) - b + 2)
    chemin = Mid(chemin, 1, Len(chemin) - b + 1)

    Set fs = Application.FileSearch
    With fs
    .LookIn = chemin & dossier & "\"
    .Filename = "*"
    If .Execute(SortBy:=msoSortByFileName, _
    SortOrder:=msoSortOrderAscending) > 0 Then
    reponse = MsgBox(.FoundFiles.Count & _
    " fichier(s) " & typ & " trouvé(s)", vbOKCancel)
    If reponse = vbCancel Then End

    nb = .FoundFiles.Count

    For i = 1 To nb
    avant(i) = .FoundFiles(i)
    avant(i) = Mid(avant(i), Len(chemin & dossier) + 2)
    avant(i) = Mid(avant(i), 1, Len(avant(i)) - 4)
    Next i

    Else
    MsgBox "Aucun fichier trouvé"
    End
    End If

    End With

    If Int(nb / 2) <> nb / 2 Then
    MsgBox "Le nombre de fichiers n'est pas pair..." & Chr(13) & "...interruption du programme.", vbOK, "*** ATTENTION ***"
    End
    End If

    If Mid(avant(1), Len(avant(1)) - 3) = suf Then
    For f = 1 To nb Step 2
    interm = avant(f)
    avant(f) = avant(f + 1)
    avant(f + 1) = interm
    Next f
    End If

    ChDir ".."
    compt = 1
    nouv_dossier = dossier & "_shuf" & compt
    Set fs = CreateObject("Scripting.FileSystemObject")
    Do Until Not fs.folderexists(nouv_dossier)
    compt = compt + 1
    nouv_dossier = Mid(nouv_dossier, 1, Len(nouv_dossier) - 1) & compt
    Loop
    MkDir nouv_dossier
    fs.CopyFile chemin & dossier & "\*", chemin & nouv_dossier & "\"
    ChDir nouv_dossier

    Call tableau_correspondance(nb)

    ChDir ".."

    MsgBox nouv_dossier, , "MELANGE EFFECTUE"

    End Sub

    Private Sub tableau_correspondance(n As Integer)

    n = n / 2

    ReDim choix(1 To n) As Integer
    ReDim interm(1 To n) As Integer

    For f = 1 To n
    interm(f) = f
    Next f
    ni = n

    compt = 0
    While ni > 0
    compt = compt + 1
    has = Int(Rnd * ni) + 1
    choix(compt) = interm(has)
    If has < ni Then
    For f = has To ni - 1
    interm(f) = interm(f + 1)
    Next f
    End If
    ni = ni - 1
    Wend

    For f = 1 To n
    titre = "Fichier shuf " & f
    apres(1 + (f - 1) * 2) = titre
    apres(2 * f) = titre & suf
    Next f

    Open "Correspondance.txt" For Output As #1

    For f = 1 To n
    Print #1, apres(1 + (f - 1) * 2) & " = " & avant(1 + (choix(f) - 1) * 2)
    Print #1, apres(f * 2) & " = " & avant(choix(f) * 2)
    Print #1, ""
    Name avant(1 + (choix(f) - 1) * 2) & typ As apres(1 + (f - 1) * 2) & typ
    Name avant(choix(f) * 2) & typ As apres(f * 2) & typ
    Next f

    Close #1

    End Sub
    Expert Programmation

    Et un troisième mauvais point ! [:antp]
    Désolé, mais je suis un modérateur tatillon [:zeb:6] !
    Et toi, un nouveau membre qui n'a pas lu le règlement.



    Modifie (ne recommence pas tout, édite) ton message précédent et mon présent message s'autodétruira.

    Tout d'abord merci pour ta réponse rapide.

    Ensuite c'est une macro VBA sur excel que j'aimerai avoir.

    Troisièmement voici le point de départ que j'ai (à la fin du message): en fait c'est une macros que j'avais fait avec quelqu'un qui s'y connaissait durant un ancien stage. J'aurai aimé adapter cette macro à mes nouveaux types de données mais je n'y suis pas arrivée. Le problème étant que je n'ai pas les mêmes types de dossier, sous dossiers etc...

    en gros j'ai un gros dossier "09 09 2009"
    dans lequel se trouve plusieurs sous dossier "control" + "1h" + "2h" + etc...
    dans chacun de ses dossiers j'ai une liste de fichiers qui se nomment "control_0_vert", "control_0_rouge", "control_0_bleu", "control_1_vert, control_1_rouge", "control_1_bleu"...
    et j'aimerai avoir au final un gros dossier qui comprennent toutes les photos mélangées (control, 1h ...) renommées a_0_bleu, a_0_rouge, a_0_vert... pour que je ne sache plus si c'est control, 1h, 2h mais que les trois photos (bleu, vert, rouge)correspondant à la même chose (n°0,1,2...) restent codées de facon cohérente (a_0-rouge, a_0_vert, a_0_bleu). Et que ca me cré un fichier texte qui me donne les correspondances pour que je puisse retrouver après analyse à quoi ca correspond (dans la macros que j'ai mis à la suite la dernière partie est censée faire ca)

    Je ne sais pas si c'est très clair...navrée, je sais que c'est un peu compliqué et que je demande beaucoup mais c'est dur pour une biologiste de faire de la programmation sans y avoir jamais touché!

    En tout cas un énorme merci ne serait-ce que pour l'intérêt que tu portes à ma requête.

    1. Dim avant(1 To 1000) As String
    2. Dim apres(1 To 1000) As String
    3. Dim suf As String
    4. Dim typ As String
    5.  
    6. Sub MelangeImages()
    7.  
    8. Dim chemin As String
    9. Dim nb As Integer
    10.  
    11. Randomize
    12.  
    13. 'Les images à mélanger doivent être dans un dossier à part; elles vont par deux : "name x" et "name x tub"; le dossier "dossier_shuff" sera détruit
    14. suf = " tub"
    15. chemin = Application.GetOpenFilename(, , "Sélectionner un des fichiers à mélanger" )
    16. If chemin = "Faux" Then End
    17.  
    18. a = ""
    19. b = 1
    20. typ = Mid(chemin, Len(chemin) - 3)
    21. Do Until a = "/" Or a = "\"
    22. a = Mid(chemin, Len(chemin) - b, 1)
    23. b = b + 1
    24. Loop
    25. chemin = Mid(chemin, 1, Len(chemin) - b)
    26. a = ""
    27. b = 1
    28. Do Until a = "/" Or a = "\"
    29. a = Mid(chemin, Len(chemin) - b, 1)
    30. b = b + 1
    31. Loop
    32. dossier = Mid(chemin, Len(chemin) - b + 2)
    33. chemin = Mid(chemin, 1, Len(chemin) - b + 1)
    34.  
    35. Set fs = Application.FileSearch
    36. With fs
    37. .LookIn = chemin & dossier & "\"
    38. .Filename = "*"
    39. If .Execute(SortBy:=msoSortByFileName, _
    40. SortOrder:=msoSortOrderAscending) > 0 Then
    41. reponse = MsgBox(.FoundFiles.Count & _
    42. " fichier(s) " & typ & " trouvé(s)", vbOKCancel)
    43. If reponse = vbCancel Then End
    44.  
    45. nb = .FoundFiles.Count
    46.  
    47. For i = 1 To nb
    48. avant(i) = .FoundFiles(i)
    49. avant(i) = Mid(avant(i), Len(chemin & dossier) + 2)
    50. avant(i) = Mid(avant(i), 1, Len(avant(i)) - 4)
    51. Next i
    52.  
    53. Else
    54. MsgBox "Aucun fichier trouvé"
    55. End
    56. End If
    57.  
    58. End With
    59.  
    60. If Int(nb / 2) <> nb / 2 Then
    61. MsgBox "Le nombre de fichiers n'est pas pair..." & Chr(13) & "...interruption du programme.", vbOK, "*** ATTENTION ***"
    62. End
    63. End If
    64.  
    65. If Mid(avant(1), Len(avant(1)) - 3) = suf Then
    66. For f = 1 To nb Step 2
    67. interm = avant(f)
    68. avant(f) = avant(f + 1)
    69. avant(f + 1) = interm
    70. Next f
    71. End If
    72.  
    73. ChDir ".."
    74. compt = 1
    75. nouv_dossier = dossier & "_shuf" & compt
    76. Set fs = CreateObject("Scripting.FileSystemObject" )
    77. Do Until Not fs.folderexists(nouv_dossier)
    78. compt = compt + 1
    79. nouv_dossier = Mid(nouv_dossier, 1, Len(nouv_dossier) - 1) & compt
    80. Loop
    81. MkDir nouv_dossier
    82. fs.CopyFile chemin & dossier & "\*", chemin & nouv_dossier & "\"
    83. ChDir nouv_dossier
    84.  
    85. Call tableau_correspondance(nb)
    86.  
    87. ChDir ".."
    88.  
    89. MsgBox nouv_dossier, , "MELANGE EFFECTUE"
    90.  
    91. End Sub
    92.  
    93. Private Sub tableau_correspondance(n As Integer)
    94.  
    95. n = n / 2
    96.  
    97. ReDim choix(1 To n) As Integer
    98. ReDim interm(1 To n) As Integer
    99.  
    100. For f = 1 To n
    101. interm(f) = f
    102. Next f
    103. ni = n
    104.  
    105. compt = 0
    106. While ni > 0
    107. compt = compt + 1
    108. has = Int(Rnd * ni) + 1
    109. choix(compt) = interm(has)
    110. If has < ni Then
    111. For f = has To ni - 1
    112. interm(f) = interm(f + 1)
    113. Next f
    114. End If
    115. ni = ni - 1
    116. Wend
    117.  
    118. For f = 1 To n
    119. titre = "Fichier shuf " & f
    120. apres(1 + (f - 1) * 2) = titre
    121. apres(2 * f) = titre & suf
    122. Next f
    123.  
    124. Open "Correspondance.txt" For Output As #1
    125.  
    126. For f = 1 To n
    127. Print #1, apres(1 + (f - 1) * 2) & " = " & avant(1 + (choix(f) - 1) * 2)
    128. Print #1, apres(f * 2) & " = " & avant(choix(f) * 2)
    129. Print #1, ""
    130. Name avant(1 + (choix(f) - 1) * 2) & typ As apres(1 + (f - 1) * 2) & typ
    131. Name avant(choix(f) * 2) & typ As apres(f * 2) & typ
    132. Next f
    133.  
    134. Close #1
    135.  
    136. End Sub
    Expert Programmation

    Citation :
    Modifie (ne recommence pas tout, édite) ton message précédent et mon présent message s'autodétruira.
    Bon, ben puisque tu n'as pas modifié ton message, mais que tu as tout réécrit, je suis obligé de laisser mon message, pour rester cohérent. Du coup, ça c'est tout moche, mais c'est ton topic, après tout ! :o 



    :D 
    Expert Programmation

    Fiiiiiiiouuuuuuu !
    C'est coton tout truc.
    Pis y'a pas d'indentation, c'est donc difficilement lisible.
    Pis y'a pleins d'interactions pas demandées.

    Moi je me proposais de te proposer ( :D  ) ça :
    1. Ouvrir le fichier "correspondance" en ajout.
    2. Pour tous les dossiers du dossier courant faire :
    3. Retenir le nom du dossier
    4. Faire :
    5. Inventer un nom aléatoire
    6. Tant qu'aucun dossier ne porte déjà ce nom
    7. Ecrire le nom du dossier et le nom aléatoire dans le fichier
    8. Renommer le dossier
    9. Suivant
    10. Fermer le fichier


    Qu'en dis-tu ?

    Après, chaque fichier dossier/fichier_couleur est copié vers fichier_couleur_dossier et le tour est joué.

    Qu'en penses-tu ?
    Lassé par la pub ? Créez un compte