Boucle infinie et procédure fonctionne avec F8 et pas seule
Bonjour
Je crois arriver à la fin, et ça ne marche plus. J’ai vraiment besoin d'aide, je débute et mon code doit laisser à désirer...
D’abord ma boucle ne s'arrête pas quand elle atteint sa limite
'CALCUL DES REVALs
j = 1
DerLg = Mas.Range("A" & Rows.Count).End(xlUp).Row 'détermination de la dernière ligne des dates de reval
For i = 1 To DerLg Step 1
If Mas.Range("A" & i) > DE And Mas.Range("A" & i) < FORCLU Then
'A1 entre >= DE et < Forclu
Mas.Range("G" & j + 6) = "REV" & j 'G7=Rev1
Mas.Range("H" & j + 6) = Mas.Range("A" & i) 'H7=DateReval1
Mas.Range("J" & j + 6) = Mas.Range("B" & i) 'I7 = Tx1
'Remplissage des dates de reval dans le tableau Cal
Cal.Range("B16").Offset(0, j) = Mas.Range("A" & i)
'Remplissage des dates de reval dans le tableau Ass
Ass.Range("B31").Offset(0, j) = Mas.Range("A" & i)
j = j + 1 'compteur +1
End If
Next iElle fonctionnait avant, je ne vois pas ce que j'ai écrit depuis qui la perturbe ?
Ensuite, en procédant pas à pas (F8 et en poussant le curseur quand j'arrive sur la fin de la boucle), ma procédure se déroule presque correctement ; Presque, car je dois me positionner sur les feuilles qui travaillent sinon j'ai des arrêts intempestifs qui repartent normalement simplement en activant la feuille de travaille.
Enfin, je ne sais pas si c’est normal, mais quand je suis en pas à pas, après chaque ligne lu (de la procédure Calcul()), la fonction DernièreSauvegarde() est exécutée ??
Comme je l'ai dit plus haut, je débute (2ème projet) n'hésitez pas à me corriger ou à me conseiller.
Merci encore
Bonjour,
Une rapide survol du fichier :
Dans la sub calcul :
1. corriger le code en mettant le point devant RANGE -->
If DerLg > 1 Then .Range("G2:L" & DerLg).ClearContents2. Corriger cette ligne -->
For i = 1 To DerLg3. A la ligne 50 de la feuille MASQUEE enlever la mention --> "Recevez, chère madame..."
Enfin, je ne sais pas si c’est normal, mais quand je suis en pas à pas, après chaque ligne lu (de la procédure Calcul()), la fonction DernièreSauvegarde() est exécutée ??
Logique. Pourquoi créer une fonction pour faire cela. Je metterai plutôt une ligne dans THISWORKBOOK pour enregister cette information à la fermeture du fichier.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
ThisWorkbook.BuiltinDocumentProperties ("Last Save Time")
End SubAmicalement
Bonjour,
Pour la boucle qui ne s'arrête pas. J'en doute un peu, mais je ne peux guère vérifier car je ne maîtrise pas du tout le processus. Sans doute DerLg n'a -t-elle pas la valeur que tu escomptes. Comme tu utilises la même variable colonne A et colonne G il y a un risque de confusion. Sur un code aussi long utilise des variables différentes et "parlantes" pour chaque colonne.
par exemple iLRA pour colonne A ; iLRG pour colonne G...
Sinon je ne vois pas de code trivial.
Pour la DernièreSauvegarde c'est normal c'est une fonction perso et volatile donc elle se rafraichit à chaque recalcul de ta feuille :
Ou tu bloques le recalcul de la feuille (Application.Calculation = xlManual) au début de la macro et tu le débloques à la fin (xlCalculationAutomatic). Ou tu utilises un autre système pour dater [F18]
Probablement que inscrire la Date "en dur" à l'ouverture du classeur suffirait ?
Il en va un peu de même pour toutes les formules que tu injectes. A quoi ça sert que tu codes en VBA pour mettre toutes ces formules ? Tu peux pas valoriser directement en dur ? Je suis sur que ton code y gagnerait largement en lisibilité ?
Hum... Mébon. Là encore comme je ne sais pas tester donc je suis peut-être à coté de la plaque...
Comme on ne sait pas quelle est la feuille active, difficile de te suivre : Tu as instancié des variables pour tes feuilles mais tu ne t'en sert pas systématiquement . ça donne un code flou.
particulièrement signalé : Trop de Range ne sont pas précédé d'un . ou d'une variable affectée Mas. Ass. Cal...
Toi ça te suffit peut-être mais...
Généralités : les noms de variables trop courts ou trop longs sont à proscrire. 'à l'exception peut-être de i,j,k,x,Y
Difficile de faire une recherche sur tes variables car on tombe souvent sur des chaines non pertinentes
WsM, WsA, WsC sont plus pertinents que Mas. Ass. Cal
Deff, DDeb, Dfin sont meilleurs que DE, DD, DF
Revoit en particulier le point signalé et le système de datation et dit nous.
A+
Merci Dan et Galopin,
Galopin a dit
"A quoi ça sert que tu codes en VBA pour mettre toutes ces formules ? Tu peux pas valoriser directement en dur ? Je suis sur que ton code y gagnerait largement en lisibilité ?"
J'aurai préféré, mais les données à appliquer aux calculs sont des extraits de code, les taux ne sont jamais les même, les calculs se font dans des fourchettes de dates qui changent aussi...
Galopin a dit
Comme on ne sait pas quelle est la feuille active, difficile de te suivre
En principe, on a pas besoin de changer de feuille : la userforme est un formulaire que l'utilisateur remplit pour donner les données principales. Quand il clique sur Ok, les données sont affectées et ça lance la procédure Calcul(). La feuille calcul est pour une pièce comptable qui permet de vérifier toutes les phases de calcul.
Galopin a dit
Trop de Range ne sont pas précédé d'un .Fait
Galopin a dit "Différencier les variables DerLg pour les tableauxs : Fait (j'ai pas compris tes sigles iRLA et iRlG, donc j'ai pris DerLgA et DerLgG)...
Dan a dit
j'ai supprimé Step 1 ; c'est ça que tu voulais que je corrige, je ne comprends pas ?2. Corriger cette ligne --> For i = 1 To DerLg
Dan a dit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
ThisWorkbook.BuiltinDocumentProperties ("Last Save Time")
End Subet j'ai supprimé la fonction du coup, je n'ai plus la date de sauvegarde, quand tout sera Ok, j'essaierai les conseils de Galopin.
Avec tout ça ça fonctionnait bien tout à l'heure, mais depuis, les utilisateurs viennent de me communiquer une nouvelle règle de calcul, alors là je fais un break...
En tout cas déjà 1000 merci pour votre aide et surtout vos explications.
Votre soutien me touche beaucoup.
Sans ce Forum, je crois que j'aurai abandonné VBA...
DerLgA et DerLgG conviennent très bien.
Oui le le Step 1 est inutile, mais ce n'est pas grave.
Dans ton ThisWorkbook tu peux rajouter :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
Worksheets("Assuré").Range("F18")= ThisWorkbook.BuiltinDocumentProperties ("Last Save Time")
End Subou
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
Worksheets("Assuré").Range("F18") = Now
End Submais depuis, les utilisateurs viennent de me communiquer une nouvelle règle de calcul, alors là je fais un break...
A+
Bonjour Galopin,
J'apprécie ton humour..
mais je commence à rire jaune
Merci pour tes nouvelles précisions qui fonctionnent très bien ; mais j'ai un nouveau pb, quand j'ouvre le fichier (ou lance le UsF avec le bouton Saisie) et que je valide (en modifiant qq chose ou pas) l'onglet 'Coordonnées Maison'. Ca ne le fait pas à chaque fois ?
Pour mon Pb de procédure qui ne fonctionne pas si je ne suis pas sur la feuille de travail, j'ai toujours le pb en laçant la procédure Calcul depuis VBE en aillant la feuille 'Asssuré' active : 'Erreur 1004' la méthode .Select de la classe Range a échoué'.
Le débogage renvoie à la partie
With Mas
'TRI des périodes de calcul
.Range("G1").CurrentRegion.Select
DerLgG = .Range("G" & Rows.Count).End(xlUp).Row
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range("H1:H" & DerLgG), SortOn:=xlSortOnValues, _En laçant la procédure comme elle devrait être lancée, à partir du formulaire en cliquant sur le bouton valider avec 'Call Calcul', j'ai le même pb, au même moment.
Donc quand ça bug, il me suffit de me positionner sur la feuille 'Masquée', revenir sur VBE et appuyer sur F5 pour que tout se termine bien.
Apparemment tout le reste se déroule correctement maintenant, plus de souci de boucle infinie ; il semble que Dan et toi aviez raison avec les .Range (je ne sais pas pourquoi, je ne voulais pas en mettre après if...)
Merci de ton aide ; je renvoie un fichier avec toutes les modifs.
Hi x 3 !
Ah... la joie des Select, CurrentRegion et autres ActiveSheet : Encore du "code flou"
Je te donne que la fin de la proc... Bon c'est pas testé... Encore une fois je maîtrise pas assez le process donc je te le fais sans filet.
Supprimé...en travaux...Edit :
J'ai du supprimer le code que j'avais travaillé : je suis un peu perdu.
Il faut que tu précise un peu cette section : Tu ne peux pas sélecter un range dans une feuille inactive.
Essaie simplement :
With Mas
'TRI des périodes de calcul
.Activate
.Range("G1").CurrentRegion.Select...le reste sans changement
A+
Je pense que tu as trouvé la solution qui solutionne la procédure...
A la fin de la procédure, j'ai ajouté
Mas.Activatepour que l'utilisateur ne voit pas le passage sur la feuille Masquée.
Voilà une 20e de fois que je lance ma Usf, que je modifie des dates, des montants, des coordonnées, ou rien, que je valide ou que j'annule, je ne perds plus d'onglet.
Sauf quand je ferme et rouvre le fichier que j'annule ou que je valide, je perds l'onglet 'Maison', puis tout est ok, jusqu'à l'ouverture svte...
Je ne comprends même pas comment c'est possible..
je perds l'onglet 'Maison'
ça veut dire quoi l'onglet 'Maison' ?
Oui ton USF réagit bizarrement.
A+
Désolée,
Il s'agit de l'onglet Coordonnées Maison, le 2ème de la UserForm.
Merci
Re...
Modifie Ton Workbook_Open comme suit :
Private Sub Workbook_Open()
On Error Resume Next
Worksheets("Assuré").Activate
Formulaire
End Submodifie la Sub Formulaire comme suit
Sub Formulaire()
UserForm1.Show
End SubIl ne doit pas y avoir d'autre Show concernant cet USF dans aucun autre module...
En particulier dans ton USF, modifie le Initialize comme suit :
Private Sub UserForm_Initialize()
'initialisation de UsF à partir des saisies antérieures
With Worksheets("Assuré")
OpB_Mme = .Range("E8") = "Madame"
OpB_M = .Range("E8") = "Monsieur"
If .Range("F8") <> "" Then TxB_Np = .Range("F8")
If .Range("E9") <> "" Then TxB_Ad = .Range("E9")
If .Range("B7") <> "" Then TxBCnavAgt = .Range("B7")
If .Range("B8") <> "" Then TxBCnavN°Agc = .Range("B8")
If .Range("B9") <> "" Then TxBCnavTel = .Range("B9")
If .Range("B10") <> "" Then TxBCnavNir = .Range("B10")
If .Range("B31") <> "" Then TxB_DE = .Range("B31")
End With
With Worksheets("Masquée")
If .Range("E2") <> "" Then TxB_DAd = .Range("E2")
If .Range("E3") = "DD" Then
OpB_DdS = True
OpB_DdA = True
End If
End With
With Worksheets("Calcul")
If .Range("B17") <> "" Then TxB_Ret_S = .Range("B17")
If .Range("B22") <> "" Then TxB_Ret_A = .Range("B22")
If .Range("B18") <> "" Then TxB_CmS = .Range("B18")
If .Range("B19") <> "" Or .Range("B24") <> "" Then
OpB_MeO = True
Else
OpB_MeN = True
End If
If .Range("B23") <> "" Then TxB_CmA = .Range("B23")
If .Range("B12") = Worksheets("Masquée").Range("E7") Then 'Si B12 = Tx faible on coche Tx faible
OpB_Faible = True
ElseIf .Range("B12") = Worksheets("Masquée").Range("E8") Then
OpB_Fort = True
ElseIf .Range("B12") = Worksheets("Masquée").Range("E9") Then
OpB_Ni = True
Else
OpB_Am = True
End If
End With
'Coordonnées Assuré - Adresse
With TxB_Ad 'Format de la boite Adresse
' 'Ecriture majuscule
' .SetFocus
.SelStart = 0
.SelLength = Len(TxB_Ad.Text)
'Autoriser à aller à la ligne
.MultiLine = True
'Accepter Entrer pour aller à la ligne
.EnterKeyBehavior = True
End With
'Coordonnées Maison
'Met le nom de l'agent par défaut
TxBCnavAgt = ActiveWorkbook.BuiltinDocumentProperties("author")
'Tab automatique après la saisie du code agence
TxBCnavN°Agc.MaxLength = 4 'saisie de l'agence sur 4 caractères
TxBCnavN°Agc.AutoTab = True 'tabulation automatique
TxBCnavTel.MaxLength = 16 'saisie du Tel Agt sur 10 caractères
TxBCnavTel.AutoTab = True 'tabulation automatique
TxBCnavNir.MaxLength = 18 'saisie le N° de Ret sur 13 caractères
TxBCnavNir.AutoTab = True 'tabulation automatique
With Me
.MultiPage1.Pages(1).Visible = False
End With
End Sub(L'important c'est les 4 dernières lignes)... mais tu peux t'inspirer du reste aussi : Tout ce qui rend le code plus lisible est préférable.
Je crois que j'ai fait le tour de la question.
Plus de problème ?
Bon après midi
A+
Merci Galopin,
En effet je ne perds plus d'onglet, il a complètement disparu !
J'ai fait toutes les modifs, enregistré, fermé, relancé, la UsF s'ouvre sans l'onglet "Coordonnées Maison".
En attentant 1000 merci pour tes conseils sur mon code.
A toutes fins utiles, je renvoie le fichier modifié
NB : je me suis permise de supprimer le
'With Me
' .MultiPage1.Pages(1).Visible = False
'End Withcela a pour résultat de rétablir l'onglet, mais ça le met par défaut, c'est à dire que quand la UsF s'ouvre, elle s'ouvre sur cet onglet
Du coup j'ai essayé avec
With Me
.MultiPage1.Pages(1).Visible = True
End WithAlors si en VBE la UsF est sur un onglet autre que "Coordonnées Assuré", alors le formulaire s'ouvre sur cet onglet, Donc si je veux qu'il s'ouvre sur Assuré, je dois veiller dans VBE, à ce que le UsF soit bien sur l'onglet 'Coordonnées Assuré".
C'est pas l'idéal, mais c'est déjà ça...
Bonjour,
Comme je n'avais pas compris j'ai supposé que c'était voulu comme ça.
Pour que l'USF s'ouvre toujours sur le premier onglet met :
...
Me.MultiPage1.Value = 0
End Subou pour qu'il s'ouvre toujours sur le 2ème
...
Me.MultiPage1.Value = 1
End SubA+
5000 Mercis Galopin.
C'est tellement merveilleux quand ça fonctionne, j'ai tellement galéré pour en arriver là...
Maintenant je peux passer à la dernière étape
A partir du tableau trié je dois prendre chaque montant revalorisé, les multiplier par chaque intervalle qui le concerne pour chaque période de majoration.
C'est pas gagné, mais je sais que je peux toujours compter sur ce forum.
Merci encore, c'est vraiment sympa