OVH Cloud OVH Cloud

Erreur #valeur! par endroit en appliquant une formule

19 réponses
Avatar
Phenix21
Bonjour,

Dans mon code VBA, j'appelle une fonction numeropage() de Laurent
Longre.

Jusque ce matin tout marchait bien, il affichait les num=E9ros de pages.
Et puis depuis ce matin et une de mes manips (je ne l'ai fait
num=E9roter que les cellules qui m'int=E9resse, je gagnais du temps), la
formule s'applique bien sur les premi=E8res valeurs, puis m'affiche
#valeur!, puis refonctionne sur les derni=E8res valeurs.
Lorsque le d=E9roulement de ma macro est termin=E9, j'ai laiss=E9 les
formules dans les cases. En faisant un double clic sur les #valeur!,
certaines cellules se recalculent, d'autres continuent d'afficher
#valeur!.

Toutes les cellules ont le m=EAme format, je comprends pas... Est-ce un
probl=E8me de recalcul automatique ? Quelqu'un a-t-il une solution ?

Merci d'avance pour vos r=E9ponses

9 réponses

1 2
Avatar
Ardus Petus
Oui, mais pas sytématiquement.
Avant, on ne "voyait" pas le plantage parce que c'était Excel qui appelait
la fonction NumeroPage.
Maintenant, c'est VBA qui l'appelle directement.
L'erreur est la même
(l'indice n'appartient pas à la sélection) et reste inexplicable.

Cordialement,
--
AP

"Phenix21" a écrit dans le message de news:

J'ai appliqué ta correction, et là VBA a carrément planté ! lol
Avatar
docm
Bonjour à vous.

La technique suivante, qui consiste à insérer les sauts de pages, semble
fonctionner.

'---------------------------------------------------
'CREATION DU SOMMAIRE
'---------------------------------------------------

'Numérotation des pages
Sheets("BPU").Select

'Insertion des sauts de page
memview = ActiveWindow.View
Worksheets("BPU").PageSetup.PrintArea = ""
Worksheets("BPU").PageSetup.Zoom = 100
ActiveWindow.View = xlPageBreakPreview

plageBPU_fin.Select
For i = 1 To nb_val_fin
Cells(i, 1).Select
If Selection.Style = "Titre1" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
ElseIf Selection.Style = "Titre2" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
End If
Next
ActiveWindow.View = memview

Amicalement

docm


"Phenix21" wrote in message
news:
Bonjour,

Dans mon code VBA, j'appelle une fonction numeropage() de Laurent
Longre.

Jusque ce matin tout marchait bien, il affichait les numéros de pages.
Et puis depuis ce matin et une de mes manips (je ne l'ai fait
numéroter que les cellules qui m'intéresse, je gagnais du temps), la
formule s'applique bien sur les premières valeurs, puis m'affiche
#valeur!, puis refonctionne sur les dernières valeurs.
Lorsque le déroulement de ma macro est terminé, j'ai laissé les
formules dans les cases. En faisant un double clic sur les #valeur!,
certaines cellules se recalculent, d'autres continuent d'afficher
#valeur!.

Toutes les cellules ont le même format, je comprends pas... Est-ce un
problème de recalcul automatique ? Quelqu'un a-t-il une solution ?

Merci d'avance pour vos réponses
Avatar
Ardus Petus
Bravo docm!

J'ai intégré ta modif et la mienne dans la version suivante, qui MARCHE!
http://cjoint.com/?fulCsWDl6I

Cordialement,
--
AP

"docm" a écrit dans le message de news:
%
Bonjour à vous.

La technique suivante, qui consiste à insérer les sauts de pages, semble
fonctionner.

'---------------------------------------------------
'CREATION DU SOMMAIRE
'---------------------------------------------------

'Numérotation des pages
Sheets("BPU").Select

'Insertion des sauts de page
memview = ActiveWindow.View
Worksheets("BPU").PageSetup.PrintArea = ""
Worksheets("BPU").PageSetup.Zoom = 100
ActiveWindow.View = xlPageBreakPreview

plageBPU_fin.Select
For i = 1 To nb_val_fin
Cells(i, 1).Select
If Selection.Style = "Titre1" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
ElseIf Selection.Style = "Titre2" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
End If
Next
ActiveWindow.View = memview

Amicalement

docm


"Phenix21" wrote in message
news:
Bonjour,

Dans mon code VBA, j'appelle une fonction numeropage() de Laurent
Longre.

Jusque ce matin tout marchait bien, il affichait les numéros de pages.
Et puis depuis ce matin et une de mes manips (je ne l'ai fait
numéroter que les cellules qui m'intéresse, je gagnais du temps), la
formule s'applique bien sur les premières valeurs, puis m'affiche
#valeur!, puis refonctionne sur les dernières valeurs.
Lorsque le déroulement de ma macro est terminé, j'ai laissé les
formules dans les cases. En faisant un double clic sur les #valeur!,
certaines cellules se recalculent, d'autres continuent d'afficher
#valeur!.

Toutes les cellules ont le même format, je comprends pas... Est-ce un
problème de recalcul automatique ? Quelqu'un a-t-il une solution ?

Merci d'avance pour vos réponses




Avatar
docm
Bonjour Ardus Petus.
Effectivement, la commande
ActiveWindow.View = xlPageBreakPreview
semble être impérative avant de faire appel à HPageBreaks ou VPageBreaks.
Cela semble solutionner le prétendu bug décrit ici par Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;fr;210663

docm



"Ardus Petus" wrote in message
news:OGGPM$#
Bravo docm!

J'ai intégré ta modif et la mienne dans la version suivante, qui MARCHE!
http://cjoint.com/?fulCsWDl6I

Cordialement,
--
AP

"docm" a écrit dans le message de news:
%
Bonjour à vous.

La technique suivante, qui consiste à insérer les sauts de pages, semble
fonctionner.

'---------------------------------------------------
'CREATION DU SOMMAIRE
'---------------------------------------------------

'Numérotation des pages
Sheets("BPU").Select

'Insertion des sauts de page
memview = ActiveWindow.View
Worksheets("BPU").PageSetup.PrintArea = ""
Worksheets("BPU").PageSetup.Zoom = 100
ActiveWindow.View = xlPageBreakPreview

plageBPU_fin.Select
For i = 1 To nb_val_fin
Cells(i, 1).Select
If Selection.Style = "Titre1" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
ElseIf Selection.Style = "Titre2" Then
Cells(i, 4).FormulaR1C1 = "=NumeroPage(RC[-3])"
End If
Next
ActiveWindow.View = memview

Amicalement

docm


"Phenix21" wrote in message
news:
Bonjour,

Dans mon code VBA, j'appelle une fonction numeropage() de Laurent
Longre.

Jusque ce matin tout marchait bien, il affichait les numéros de pages.
Et puis depuis ce matin et une de mes manips (je ne l'ai fait
numéroter que les cellules qui m'intéresse, je gagnais du temps), la
formule s'applique bien sur les premières valeurs, puis m'affiche
#valeur!, puis refonctionne sur les dernières valeurs.
Lorsque le déroulement de ma macro est terminé, j'ai laissé les
formules dans les cases. En faisant un double clic sur les #valeur!,
certaines cellules se recalculent, d'autres continuent d'afficher
#valeur!.

Toutes les cellules ont le même format, je comprends pas... Est-ce un
problème de recalcul automatique ? Quelqu'un a-t-il une solution ?

Merci d'avance pour vos réponses









Avatar
Phenix21
Je reviens de weekend, et vous avez trouvé la solution à mon
problème !

Un grand merci à vous deux pour votre efficacité ;)

Phenix21
Avatar
docm
C'est un plaisir.

"Phenix21" wrote in message
news:
Je reviens de weekend, et vous avez trouvé la solution à mon
problème !

Un grand merci à vous deux pour votre efficacité ;)

Phenix21
Avatar
Phenix21
Re-bonjour !

Tant que je vous tiens, une autre petite question ;)

Dans mon code (voir fichier joint ci dessus), j'ai une boucle for qui
parcourt toute la plage. Elle recherche des termes (U, F, m3,...) pour
les remplacer par "unité", "forfait", "mètre cube",... Elle fait
également de la mise en page avec de l'insertion de ligne et
l'application d'un style.

Cette boucle for prend beaucoup de temps, notamment à cause d'une
douzaine de ElseIf (correspondant à U, ...) à l'intérieur de la for.
J'aurais aimé l'accélerer le code en faisant sauter tous les tests
ElseIf pour les cellules vides. J'ai rajouté un goto, soit :


For i = 1 To 3000
If Cells(i, 3) = "" Then
GoTo line1
ElseIf Cells(i, 3) = "U" Then
j = 1
While Cells(i + j, 1) = ""
j = j + 1
Wend
Cells(i + j, 1).Select
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Cells(i + j, 2) = "L'unité : "
Cells(i, 3) = ""
Range(Cells(i + j, 2), Cells(i + j, 3)).Select
Selection.Style = "unite"

ElseIf Cells(i, 3) = "ml" Then
...

End If
line1:
Next

Qu'en pensez-vous ?

Merci
Avatar
docm
C'est très bien d'éviter les opérations inutiles mais les ElseIf n'ont pas
d'impact visible sur la vitesse car Visual Basic lui-même est extrêmement
rapide.
Ce qui ralentit de façon très significative, ce sont les appels à excel,
tels les .Select et les .Insert qu'il faut éviter le plus possible si la
rapidité d'exécution est importante.

Amicalement

docm

"Phenix21" wrote in message
news:
Re-bonjour !

Tant que je vous tiens, une autre petite question ;)

Dans mon code (voir fichier joint ci dessus), j'ai une boucle for qui
parcourt toute la plage. Elle recherche des termes (U, F, m3,...) pour
les remplacer par "unité", "forfait", "mètre cube",... Elle fait
également de la mise en page avec de l'insertion de ligne et
l'application d'un style.

Cette boucle for prend beaucoup de temps, notamment à cause d'une
douzaine de ElseIf (correspondant à U, ...) à l'intérieur de la for.
J'aurais aimé l'accélerer le code en faisant sauter tous les tests
ElseIf pour les cellules vides. J'ai rajouté un goto, soit :


For i = 1 To 3000
If Cells(i, 3) = "" Then
GoTo line1
ElseIf Cells(i, 3) = "U" Then
j = 1
While Cells(i + j, 1) = ""
j = j + 1
Wend
Cells(i + j, 1).Select
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Cells(i + j, 2) = "L'unité : "
Cells(i, 3) = ""
Range(Cells(i + j, 2), Cells(i + j, 3)).Select
Selection.Style = "unite"

ElseIf Cells(i, 3) = "ml" Then
...

End If
line1:
Next

Qu'en pensez-vous ?

Merci
Avatar
Phenix21
OK je prends note. Merci
1 2