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 i

Elle 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).ClearContents

2. Corriger cette ligne -->

For i = 1 To DerLg

3. 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 Sub

Amicalement

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

2. Corriger cette ligne --> For i = 1 To DerLg

j'ai supprimé Step 1 ; c'est ça que tu voulais que je corrige, je ne comprends pas ?

Dan a dit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
ThisWorkbook.BuiltinDocumentProperties ("Last Save Time")
End Sub

et 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 Sub

ou

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Assuré").Activate
Worksheets("Assuré").Range("F18") = Now
End Sub

mais 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.

1595ss-vf02-2710.xlsm (126.73 Ko)

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.Activate

pour 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 Sub

modifie la Sub Formulaire comme suit

Sub Formulaire()
UserForm1.Show
End Sub

Il 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 With

cela 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 With

Alors 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...

1795ss-vf02.xlsm (193.14 Ko)

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 Sub

ou pour qu'il s'ouvre toujours sur le 2ème

...
Me.MultiPage1.Value = 1
End Sub

A+

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

Rechercher des sujets similaires à "boucle infinie procedure fonctionne pas seule"