Macro VBA - Boucle avec n° chrono

Bilja

XLDnaute Nouveau
Bonjour à toutes et tous,

Je fais de nouveau appel à tous les pros et âmes charitables de ce forum pour m'aider sur la résolution de ce souci qui m'enquiquinne terriblement et dont je n'arrive pas à me défaire...
La problématique est liée à la rédaction d'ne macro VBA qui génère un n° de chrono avec une boucle et selon certaines conditions.
(cf le fichier joint pour plus d'explications)

En gros, il s'agit d'incrémenter la valeur d'une cellule dans un fichier à partir de conditions se trouvant dans le même fichier et dans un autre fichier également.
Ca a l'air confus, mais c'est plus clair dans le fichier joint.

Merci d'avance pour vos propositions ou vos pistes!
Bonne journée,
 

Pièces jointes

  • Exemple_attribuer_n_dossier.xls
    41 KB · Affichages: 271
G

Guest

Guest
Re : Macro VBA - Boucle avec n° chrono

Bonjour,

Dans le module de code de la feuille (click-droit sur le nom d'onglet/visualiser le code):
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = Range("num_dossier").Address Then
    If IsEmpty(Target) Then
        Target = Range("num_chrono") + 1
    Else
        'Appel de la macro macro2
        macro2
    End If
 End If
End Sub

Pour faire mieux:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = Range("num_dossier").Address Then
    If IsEmpty(Target) Then
        On Error Resume Next
        Application.EnableEvents = False
        Target = Range("num_chrono") + 1
        Application.EnableEvents = True
        On Error GoTo 0
    Else
        'macro2
    End If
 End If
End Sub

A+
 
Dernière modification par un modérateur:

Bilja

XLDnaute Nouveau
Re : Macro VBA - Boucle avec n° chrono

Rebonjour Hasco,
Je suis vraiment nullissime, puisque je ne sais même pas comment activer le petit programme que tu m'as rédigé.
J'avoue ma totale incompétence en la matière, je ne sais qu'activer des macros qui ont un nom et qui commencent par Sub_XXX.
Quand je relis ton petit programme, intuitivement je comprends ce que tu veux faire : copie de la valeur de num_chrono + 1 dans num_dossier (et c'est bien ce que je voulais, ça c'est top). En revanche, je ne vois pas de partie dans le programme qui ensuite recopie la nouvelle valeur de num_chrono dans num_dossier.
Est ce que tu peux encore m'aider?
Merci!
 
G

Guest

Guest
Re : Macro VBA - Boucle avec n° chrono

Re,

Il s'agit d'une provédure évènementielle qui est automatiquement lancée par excel lorsque la valeur d'une cellule change. C'est pourquoi il faut non pas la mettre dans un module de macro ordinaire mais dans le module de la feuille comme dit plus haut. Mais ce n'est peut-être pas ce que tu souhaites.

Sous forme de macro ordinaire

Code:
[COLOR=BLUE]Sub[/COLOR] SetNumDossier()
    [COLOR=BLUE]With[/COLOR] Sheets([i]"Feuil1"[/i])
        [COLOR=BLUE]If[/COLOR] IsEmpty(.Range([i]"num_dossier"[/i])) [COLOR=BLUE]Then[/COLOR]
            [COLOR=GREEN]'Pour num_chrono dans autre classeur ouvert[/COLOR]
            [COLOR=GREEN]'.Range([i]"num_dossier"[/i]) = WorkBooks([i]"NomDuClasseurOuvert.xls"[/i]).Sheets([i]"LaFeuilleDuChrono"[/i]).Range([i]"num_chrono"[/i])+1[/COLOR]
            [COLOR=GREEN]'Pour num_chrono dans ce classeur[/COLOR]
            .Range([i]"num_dossier"[/i]) = .Range([i]"num_chrono"[/i]) + 1
        [COLOR=BLUE]Else[/COLOR]
            [COLOR=GREEN]'Appel de la macro macro2[/COLOR]
            macro2
        [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]If[/COLOR]
    [COLOR=BLUE]End[/COLOR] [COLOR=BLUE]With[/COLOR]
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub[/COLOR]

A+
 

Bilja

XLDnaute Nouveau
Re : Macro VBA - Boucle avec n° chrono

Bonsoir Hasco,

Voilà, j'ai essayé ce que tu m'as dit, et ça marche bien sauf pour un petit truc.
En fait lorsque j'exécute la macro, le n° chrono s'incrémente bien, mais la copie de ce n° ne se fait pas dans le fichier d'origine = la partie de la macro appelée 'Enregistrement du n° chrono dans fichier d'archivage du n° de chrono
ne s'exécute pas. Je pensais qu'il n'arrivait pas à retrouver cet autre fichier, car il cale sur cette instruction, alors j'ai rajouté les instructions suivantes :

Windows("N° Chrono prérésa.xls").Activate
Application.Goto Reference:="Compteur_Chrono_Prérésa"
avant
.Range("Compteur_Chrono_Prérésa") = Workbooks("Formulaire pré réservation.xls").Sheets("Formulaire").Range("Num_dossier")

mais ça ne fonctionne toujours pas, j'ai pourtant bien vérifié la synthaxe, et je sèche...

Ci dessous la macro :
Sub Génération_num_chrono()
'
' Génération_num_chrono Macro
' Macro enregistrée le 17/11/2010 par Bilja
'

'
With Sheets("Formulaire")
If IsEmpty(.Range("Num_dossier")) Then
'Incrémentation du n° chrono dans formulaire de prérésa
.Range("Num_dossier") = Workbooks("N° Chrono prérésa.xls").Sheets("Num_chrono").Range("Compteur_Chrono_Prérésa") + 1
'Enregistrement du n° chrono dans fichier d'archivage du n° de chrono
.Range("Compteur_Chrono_Prérésa") = Workbooks("Formulaire pré réservation.xls").Sheets("Formulaire").Range("Num_dossier")
Else
'macro2
End If
End With
End Sub

Est ce que encore une fois tu peux m'aider?
Merci
Bilja
 
G

Guest

Guest
Re : Macro VBA - Boucle avec n° chrono

Bonsoir,

voici une autre façon de procéder qui te permets, en faisant une exécution pas à pas de vérifier le contenu des variables en faisant Affichage/Fenêtre variables locales.

Code:
Sub Génération_num_chrono()
    Dim c As Range 'cellule de 'num_dossier
    Dim cSource As Range 'cellule source du chrono
    
    Set c = Sheets("Formulaire").Range("Num_dossier")
    
    If IsEmpty(c) Then
        'Référencer la source du chrono, le classeur doit être ouvert,la feuille et le nom existants
        Set cSource = Workbooks("N° Chrono prérésa.xls").Sheets("Num_chrono").Range("Compteur _Chrono_Prérésa")
        
        'Si la source n'a pas été trouvée, avertir l'utilisateur (avorte l'exécution)
        If cSource Is Nothing Then
            
            MsgBox "La source du chrono n'a pas été trouvée!" & vbCrLf & "Exécution impossible!", vbExclamation, "Génération_num_chrono"
        
        Else
            
            'on incrémente d'abord la source du chrono
            cSource = cSource + 1
            'on applique sa valeur à num_dossier
            c.Value = cSource.Value
        
        End If
    Else
        'macro 2
    End If
End Sub

A+
 

Bilja

XLDnaute Nouveau
Re : Macro VBA - Boucle avec n° chrono

Bonjour Hasco, c'est toujours la même...
Alors voilà entre temps, je me suis un peu débrouillée et avec différents tests, j'en suis venue à la conclusion que ce qu'il aime pas c'est le fait que la deuxième copie de la valeur doit se faire dans un autre fichier et que la macro est enregistrée dans le premier fichier.
J'ai donc tout naturellement, introduit dans la macro : Windows("Nom du 2ème fichier".xls").Activate, et il aimait toujours pas.
J'ai alors fait la chose suivante : j'ai enregistré une macro identique à la première dans mon 2ème fichier et je fais appel à cette macro dans mon premier fichier, et là ça marche!
Mais c'est un peu du bricolage j'avoue, j'aurais bien aimé avoir un truc propre, en terme de rédaction de macro... Mais bon, ça marche, alorq si tu sais comment rédiger ce truc proprement, je suis preneuse...

En revanche, du coup ce dont j'aurais besoin pour compléter tout ce bazar, c'est de pouvoir automatiser dans la première macro, les actions suivantes :
- ouverture du fichier n°2 à partir de M:/...
- enregistrer le fichier n°2 dans un répertoire précis "M:/..."- en standard excel va me demander si je veux écraser le premier fichier et la réponse devra être oui
- fermer le fichier n°2
.... et bien entendu, tout ça je ne sais pas le rédiger en langage VBA.

Je crois qu'après j'aurais fini avec ce problème...
En tout cas, MILLE MERCIS d'avance, pour avoir pris le temps de me lire et de résoudre mon problème.
Du coup, j'ai aussi appris quleques trucs sur VBA et te remercie.
Peut être que tu as des noms de bouquins qui expliquent VBA, dont je pourrais m'inspirer???

Merci encore et bonne soirée,
Bilja
 
G

Guest

Guest
Re : Macro VBA - Boucle avec n° chrono

Bonsoir,

Tu devrais nous faire deux classeurs avec juste le minimum pour savoir de quoi il retourne. Il n'est pas normal que tu n'arrives pas à renseigner une cellule d'un classeur ouvert à partir d'un autre.

A+
 

Bilja

XLDnaute Nouveau
Re : Macro VBA - Boucle avec n° chrono

Hasco,
Alors voilà, je t'envoie donc 2 fichiers (dans la réalité j'aurais bien 2 fichiers distincts, et je ne pourrais pas gérer ce problème dans un même fichier) :
Fichier1 : contient num_dossier
Fichier2 : contient num_archivage

Macro "Génération_num_dossier" dans Fichier1:
si num_dossier est vide, alors :
num_dossier = num_archivage + 1
num_archivage = num_dossier

Tu verras qu'il bugge sur l'action num_archivage = num_dossier

Ce que je souhaiterais aussi, pour que ce bazar soit complet, c'est rajouter les actions auto d'ouverture, enregistrement et fermeture de fichier comme suit :
- ouverture de Fichier2 à partir de répertoire M:/... (l'utilisateur va travailler sur Fichier1 qui sera ouvert manuellement)
- exécution de la macro Génération_num_dossier
- enregsitrement auto du Fichier2 sur répertoire M:/...
- fermeture de Fichier2

Merci
Bilja
 

Pièces jointes

  • Fichier1.xls
    19.5 KB · Affichages: 116
  • Fichier2.xls
    15 KB · Affichages: 97
  • Fichier1.xls
    19.5 KB · Affichages: 115
  • Fichier2.xls
    15 KB · Affichages: 97
  • Fichier1.xls
    19.5 KB · Affichages: 123
  • Fichier2.xls
    15 KB · Affichages: 99
G

Guest

Guest
Re : Macro VBA - Boucle avec n° chrono

Bonsoir,

Dans le fichier joint il te reste à remplacer 'ThisWorkBook.Path' par le bon chemin.

Mais pour essai décompresse les deux fichiers du zip dans le même répertoire et ouvre h_bilja_1.xls.

Pour que le compteur soit incrémenté il faut qu'à l'ouverture de h_bilja_1.xls num_dossier soit vide, comme demandé initialement. (C'est peut-là qu'il y a confusion)

Voir également WorkBook_Open

Si tu veux vider automatiquement num_dossier à la fermeture du fichier1 (h_bilja_1.xls dans le zip) rajoute sous la précédure Workbook_Open :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("Sheet_Num_dossier").Range("Num_dossier").ClearContents
End Sub

A+
 
Dernière modification par un modérateur:

Bilja

XLDnaute Nouveau
Re : Macro VBA - Boucle avec n° chrono

Bonjour Hasco,

Tu es formidable, ça marche tout bien !
Si je peux encore abuser de tes compétences, un dernier petit truc, mais c'est vraiment du fignolage..., alors si c'est pas possible, c'est pas grave.
Je commence toutes mes macros par Applicationscreen.updating = false pour ne pas que l'utilisateur voit à l'écran des actions qui sont éxécutées.
Quand j'ajoute cette fonction dans la macro ""Génération_num_dossier", il aime pas et boque dessus. Alors j'ai essayé de l'insérer avant "Dim..." puis après "Set.." et juste après le "With ThisWorkbook...", rien n'y fait, il aime vraiment pas.
Ca me gene un peu que l'utilisateur voit que le fichier n° 2 s'ouvre puis revient sur le fichier n°1...
Si c'est pas possible, c'est vraiment pas grave encore une fois.

En tout cas, c'est déjà parfait, et un grand merci à toi pour avoir répondu à mon problème.
Au fait, tu peux me conseiller des noms de bouquins pour que j'apprenne le language VBA?
A bientôt certainement sur le forum,

Bon week end,
Bilja
 

Discussions similaires

Statistiques des forums

Discussions
312 700
Messages
2 091 131
Membres
104 777
dernier inscrit
BrankyBresil