Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur 9 : l'indice n'appartient pas à la sélection

13 réponses
Avatar
PYR
Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance

10 réponses

1 2
Avatar
MichDenis
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance
Avatar
PYR
Merci MichDenis de t'occuper de mon cas.
J'ai effectué ton remplacement et je plante de la même manière.
Err vaut bien 9 après la tentative 'Worksheets(Base).Activate'

On dirait que l'instruction précédente 'On Error Resume Next', gestionnaire
de l'erreur, n'est pas prise en compte ...


"MichDenis" a écrit dans le message de
news:%
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas
qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite
à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la
proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance




Avatar
MichDenis
Je fais référence à quelque chose dans le genre ou
GestionOnglet est une procédure et non une référence
à une erreur.

Il ne te reste plus qu'à mettre ceci dans ta boucle.


Private Sub Traitement()
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Worksheets(Base).Activate
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub
End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------



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

Merci MichDenis de t'occuper de mon cas.
J'ai effectué ton remplacement et je plante de la même manière.
Err vaut bien 9 après la tentative 'Worksheets(Base).Activate'

On dirait que l'instruction précédente 'On Error Resume Next', gestionnaire
de l'erreur, n'est pas prise en compte ...


"MichDenis" a écrit dans le message de
news:%
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas
qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite
à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la
proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance




Avatar
PYR
Bonjour.

Après essai de la nouvelle possibilité, toujours le plantage sur
Worksheets(Base).Activate, le passage à l'instruction 'If Err <> 0 Then' ne
se réalise pas.
Je ne comprends vraiment pas pourquoi cela ne veut pas s'exécuter !!!

Je vais être obligé de voir avec une boucle de parcours des onglets
existants.
Je pensais qu'il y avait une méthode plus rapide mais comme elle ne
fonctionne pas ...

A moins que cela marcherait avec une autre instruction que le activate (par
exemple, création d'une feuille, puis la renommer, et si le nom existe déjà
cela plantera peut être et la gestion de l'erreur marchera.

Maintenant, s'il existe dans les esprits de ce forum, d'autres idées pour
détecter l'absence ou la présence d'un onglet d'après un nom donné, je suis
forcément preneur.

Merci pour les contributions passées et à venir


"MichDenis" a écrit dans le message de
news:%
Je fais référence à quelque chose dans le genre ou
GestionOnglet est une procédure et non une référence
à une erreur.

Il ne te reste plus qu'à mettre ceci dans ta boucle.


Private Sub Traitement()
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Worksheets(Base).Activate
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub
End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------



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

Merci MichDenis de t'occuper de mon cas.
J'ai effectué ton remplacement et je plante de la même manière.
Err vaut bien 9 après la tentative 'Worksheets(Base).Activate'

On dirait que l'instruction précédente 'On Error Resume Next',
gestionnaire
de l'erreur, n'est pas prise en compte ...


"MichDenis" a écrit dans le message de
news:%
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas
qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite
à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la
proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour
de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice
n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance








Avatar
MichDenis
Habituellement, au lieu d'utiliser ceci :
Worksheets(Base).Activate
(Problème si la feuille est masquée... elle existe mais non accessible...!

On utilise ceci :

Dim Sh as Worksheet

Set Sh = ThisWorkbook.Worksheets(base)

Cependant pour que le nom d'une nouvelle feuille puisse être créé,
attention, la chaîne de caractère que représente la variable "Base"
ne peut contenir plus de 31 caractères qui est le mximum de caractères
admissibles pour le nom d'un onglet de feuille.

De même, tu dois t'assurer que la chaîne de caractère ne contient pas un des
7 éléments interdits pour le nom d'onglet d'une feuille comme : * ? / [ ] ::

Ceci fonctionne... de même que la procédure hier ...
à toi d'insérer ceci dans ta boucle
'----------------------------------
Private Sub Traitement()
Dim Sh As Worksheet
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Set Sh = ThisWorkbook.Worksheets(Base)
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"

End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------






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

Bonjour.

Après essai de la nouvelle possibilité, toujours le plantage sur
Worksheets(Base).Activate, le passage à l'instruction 'If Err <> 0 Then' ne
se réalise pas.
Je ne comprends vraiment pas pourquoi cela ne veut pas s'exécuter !!!

Je vais être obligé de voir avec une boucle de parcours des onglets
existants.
Je pensais qu'il y avait une méthode plus rapide mais comme elle ne
fonctionne pas ...

A moins que cela marcherait avec une autre instruction que le activate (par
exemple, création d'une feuille, puis la renommer, et si le nom existe déjà
cela plantera peut être et la gestion de l'erreur marchera.

Maintenant, s'il existe dans les esprits de ce forum, d'autres idées pour
détecter l'absence ou la présence d'un onglet d'après un nom donné, je suis
forcément preneur.

Merci pour les contributions passées et à venir


"MichDenis" a écrit dans le message de
news:%
Je fais référence à quelque chose dans le genre ou
GestionOnglet est une procédure et non une référence
à une erreur.

Il ne te reste plus qu'à mettre ceci dans ta boucle.


Private Sub Traitement()
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Worksheets(Base).Activate
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub
End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------



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

Merci MichDenis de t'occuper de mon cas.
J'ai effectué ton remplacement et je plante de la même manière.
Err vaut bien 9 après la tentative 'Worksheets(Base).Activate'

On dirait que l'instruction précédente 'On Error Resume Next',
gestionnaire
de l'erreur, n'est pas prise en compte ...


"MichDenis" a écrit dans le message de
news:%
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas
qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou suite
à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la
proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour
de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice
n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance








Avatar
PYR
Je suis désolé mais je reste toujours sur la même erreur ce coup-ci sur le
'Set Sh = ThisWorkbook.Worksheets(base)'.
Je dois avoir un souci dans ma config bien que dans un autre programme, le
'On Error Resume Next' fonctionne mais c'est sur une lecture
d'enregistrement de fichier TXT.

J'ai donc fait une boucle de parcours des onglets présents pour tenter de
détecter la présence ou non de mon onglet 'Base' et agir en conséquence.

Je te remercie d'avoir porté attention à mon souci
C'est sûr, il n'y a pas péril en la demeure car j'ai une solution de repli
(ma boucle) mais c'est pour la compréhension du néophite du VBA que je suis


"MichDenis" a écrit dans le message de
news:
Habituellement, au lieu d'utiliser ceci :
Worksheets(Base).Activate
(Problème si la feuille est masquée... elle existe mais non accessible...!

On utilise ceci :

Dim Sh as Worksheet

Set Sh = ThisWorkbook.Worksheets(base)

Cependant pour que le nom d'une nouvelle feuille puisse être créé,
attention, la chaîne de caractère que représente la variable "Base"
ne peut contenir plus de 31 caractères qui est le mximum de caractères
admissibles pour le nom d'un onglet de feuille.

De même, tu dois t'assurer que la chaîne de caractère ne contient pas un
des
7 éléments interdits pour le nom d'onglet d'une feuille comme : * ? /
[ ] ::

Ceci fonctionne... de même que la procédure hier ...
à toi d'insérer ceci dans ta boucle
'----------------------------------
Private Sub Traitement()
Dim Sh As Worksheet
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Set Sh = ThisWorkbook.Worksheets(Base)
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"

End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------






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

Bonjour.

Après essai de la nouvelle possibilité, toujours le plantage sur
Worksheets(Base).Activate, le passage à l'instruction 'If Err <> 0 Then'
ne
se réalise pas.
Je ne comprends vraiment pas pourquoi cela ne veut pas s'exécuter !!!

Je vais être obligé de voir avec une boucle de parcours des onglets
existants.
Je pensais qu'il y avait une méthode plus rapide mais comme elle ne
fonctionne pas ...

A moins que cela marcherait avec une autre instruction que le activate
(par
exemple, création d'une feuille, puis la renommer, et si le nom existe
déjà
cela plantera peut être et la gestion de l'erreur marchera.

Maintenant, s'il existe dans les esprits de ce forum, d'autres idées pour
détecter l'absence ou la présence d'un onglet d'après un nom donné, je
suis
forcément preneur.

Merci pour les contributions passées et à venir


"MichDenis" a écrit dans le message de
news:%
Je fais référence à quelque chose dans le genre ou
GestionOnglet est une procédure et non une référence
à une erreur.

Il ne te reste plus qu'à mettre ceci dans ta boucle.


Private Sub Traitement()
Dim Base As String
Base = "Feuil4" 'Pour les besoins de l'exemple.
On Error Resume Next
Worksheets(Base).Activate
If Err <> 0 Then
Err = 0
GestionOnglet Base
End If
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub
End Sub

'---------------------------------
Sub GestionOnglet(Base As String)
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
End Sub
'---------------------------------



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

Merci MichDenis de t'occuper de mon cas.
J'ai effectué ton remplacement et je plante de la même manière.
Err vaut bien 9 après la tentative 'Worksheets(Base).Activate'

On dirait que l'instruction précédente 'On Error Resume Next',
gestionnaire
de l'erreur, n'est pas prise en compte ...


"MichDenis" a écrit dans le message de
news:%
Remplace ceci

On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0

Par

On Error Resume next
Worksheets(Base).Activate
if err <>0 then
err=0
GestionOnglet:
end if



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

Bonsoir à tous,
Venant, il y a peu de temps, de me mettre au VBA sur Excel, j'ai un cas
qui
me tracasse.
Je viens donc vous le soumettre à votre sagacité car je ne vois pas la
solution bien qu'ayant tout bien fait comme dit la documentation ou
suite
à
recherches sur internet.
J'ai joint mon code apuré au minimum pour la compréhension.

L'idée générale :
J'ai une liste de fichiers à traiter.
Chaque fichier est ouvert, j'en tire un nom de base.
Chaque base doit correspondre à un onglet.
S'il existe, j'y accède et je poursuis mon traitement.
S'il n'existe pas, je crée l'onglet et je fais comme la ligne ci-dessus
Pour savoir si l'onglet existe, je fais d'office un
'Worksheets(Base).Activate'
Si j'ai une erreur, c'est signe de l'absence donc je dois aller dans la
proc
GestionOnglet qui va me le créer.
J'ai donc initialisé un 'On Error GoTo GestionOnglet et suite au retour
de
la gestion de l'erreur, un 'On Error GoTo 0'.

Lors de l'exécution, je tombe en erreur sur la ligne
'Worksheets(Base).Activate' avec le code "Erreur 9 : l'indice
n'appartient
pas à la sélection" alors que justement tout est fait pour qu'il aille
en
gestionOnglet et là il n'y va pas.
Quelque'un aurait-il l'explication à mon problème?
Et pourquoi pas, une autre méthode de test de présence d'un onglet ?
----------------------------------------------------------------------------------------------
Private Sub Traitement()
Dim NomFichierEntreeTXT As String, LigneLue As String, Base As
String,
Objet, Fichier
NomFichierEntreeTXT = Dir("*TOTO*.TXT", vbNormal)
Do While NomFichierEntreeTXT <> ""
Set Fichier = Objet.OpenTextFile(NomFichierEntreeTXT, 1, -2)
LigneLue = Fichier.ReadLine
Base = Trim(Mid(LigneLue, 9, 90))
On Error GoTo GestionOnglet
Worksheets(Base).Activate
On Error GoTo 0
.
.
.
Loop
MsgBox "Le traitement est terminé !", vbInformation, "INFO"
Exit Sub

GestionOnglet:
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = Base
Resume Next
End Sub
---------------------------------------------------------------------------------------------------

En vous remerciant par avance












Avatar
PYR
Bonsoir à tous.

J'ai beau avoir cherché, je n'ai trouvé que des post traitant partiellement
de mon souci du moment.
Voici mon cas (pour faire simple) car cela s'applique sur plus de 500 000
lignes (je dispose d'Excel 2007 permettant cette facilité)
En colonne A, j'ai des numéros de compte et en colonne B des codes
A B
1 130040128 1D4C
2 130040128 1D77
3 130040128 1D4C
4 130040128 1D4C
5 130060321 1D77

J'aurais aimé quand je saisis dans H1 par exemple 1D77, j'obtienne en H2 la
valeur 2 => 2 comptes distincts (de la colonne A) ont ce code.
Autre saisie : toujours en H1, si je saisis 1D4C, en H2 je devrais obtenir
1 => 1 seul compte distinct (de la colonne A) a ce code (on trouve 3 fois le
même).

Je n'ai aucun souci quand ce que je cherche et où je cherche correspondent à
la même colonne mais quand plusieurs colonnes (au moins 2 ici) entrent en
jeu, je n'ai pas trouvé de solution d'où votre sollicitude.

Je voudrais, pour être complet sinon je sais faire, éviter d'utiliser une
colonne de travail qui teste le cas ligne par ligne et retourne une info du
style oui/non que je n'aurais pus qu'à comptabiliser surtout que le nombre
de lignes augmentent chaque jour un peu plus et que mon fichier fait déjà
plus de 100 Mo.

Voilà l'exposé du problème

Si vous avez un peu de temps à me consacrer, je vous en serai reconnaissant.

Merci d'avance
Avatar
Daniel.C
Bonjour.
Essaie la formule matricielle suivante (valider avec CTRL+MAJ+Entrée) :
=SOMME((A1:A5<>INDEX(A1:A5;EQUIV(H1;B1:B5;0)))*(B1:B5=H1))+1
Cordialement.
Daniel
"PYR" a écrit dans le message de news:
%
Bonsoir à tous.

J'ai beau avoir cherché, je n'ai trouvé que des post traitant
partiellement de mon souci du moment.
Voici mon cas (pour faire simple) car cela s'applique sur plus de 500 000
lignes (je dispose d'Excel 2007 permettant cette facilité)
En colonne A, j'ai des numéros de compte et en colonne B des codes
A B
1 130040128 1D4C
2 130040128 1D77
3 130040128 1D4C
4 130040128 1D4C
5 130060321 1D77

J'aurais aimé quand je saisis dans H1 par exemple 1D77, j'obtienne en H2
la valeur 2 => 2 comptes distincts (de la colonne A) ont ce code.
Autre saisie : toujours en H1, si je saisis 1D4C, en H2 je devrais
obtenir 1 => 1 seul compte distinct (de la colonne A) a ce code (on trouve
3 fois le même).

Je n'ai aucun souci quand ce que je cherche et où je cherche correspondent
à la même colonne mais quand plusieurs colonnes (au moins 2 ici) entrent
en jeu, je n'ai pas trouvé de solution d'où votre sollicitude.

Je voudrais, pour être complet sinon je sais faire, éviter d'utiliser une
colonne de travail qui teste le cas ligne par ligne et retourne une info
du style oui/non que je n'aurais pus qu'à comptabiliser surtout que le
nombre de lignes augmentent chaque jour un peu plus et que mon fichier
fait déjà plus de 100 Mo.

Voilà l'exposé du problème

Si vous avez un peu de temps à me consacrer, je vous en serai
reconnaissant.

Merci d'avance


Avatar
PYR
Bonsoir

Merci Daniel pour ta formule mais il existe des situations où elle ne
fonctionne pas.
Ex :
En A4, mets le contenu de A5 et en B4, mets le contenu de B5 ==>> (ligne
4=ligne 5)
En H1, tu saisis 1D77 et en H2 j'obtiens 3 au lieu de 2 (ta formule me
compte 2 fois les lignes 4 et 5 alors que c'est le même N° de compte)

Une indication que je n'avais précisée : ma colonne est triée (si cela peut
aider).
Je n'arrive pas à dire en matricielle : ne pas tenir compte d'une ligne si
le N° de compte de cette ligne = le N° de compte de la ligne précédente ou
alors ne prendre en compte que les lignes dont le N° de compte est différent
du N° de compte de la ligne précédente.

Si vous avez des idées ...

Encore merci


"Daniel.C" a écrit dans le message de
news:O6Q0%
Bonjour.
Essaie la formule matricielle suivante (valider avec CTRL+MAJ+Entrée) :
=SOMME((A1:A5<>INDEX(A1:A5;EQUIV(H1;B1:B5;0)))*(B1:B5=H1))+1
Cordialement.
Daniel
"PYR" a écrit dans le message de news:
%
Bonsoir à tous.

J'ai beau avoir cherché, je n'ai trouvé que des post traitant
partiellement de mon souci du moment.
Voici mon cas (pour faire simple) car cela s'applique sur plus de 500 000
lignes (je dispose d'Excel 2007 permettant cette facilité)
En colonne A, j'ai des numéros de compte et en colonne B des codes
A B
1 130040128 1D4C
2 130040128 1D77
3 130040128 1D4C
4 130040128 1D4C
5 130060321 1D77

J'aurais aimé quand je saisis dans H1 par exemple 1D77, j'obtienne en H2
la valeur 2 => 2 comptes distincts (de la colonne A) ont ce code.
Autre saisie : toujours en H1, si je saisis 1D4C, en H2 je devrais
obtenir 1 => 1 seul compte distinct (de la colonne A) a ce code (on
trouve 3 fois le même).

Je n'ai aucun souci quand ce que je cherche et où je cherche
correspondent à la même colonne mais quand plusieurs colonnes (au moins 2
ici) entrent en jeu, je n'ai pas trouvé de solution d'où votre
sollicitude.

Je voudrais, pour être complet sinon je sais faire, éviter d'utiliser une
colonne de travail qui teste le cas ligne par ligne et retourne une info
du style oui/non que je n'aurais pus qu'à comptabiliser surtout que le
nombre de lignes augmentent chaque jour un peu plus et que mon fichier
fait déjà plus de 100 Mo.

Voilà l'exposé du problème

Si vous avez un peu de temps à me consacrer, je vous en serai
reconnaissant.

Merci d'avance






Avatar
Daniel.C
Exact. La formule est erronée.
Désolé, je n'en ai pas d'autre.
Daniel
"PYR" a écrit dans le message de news:

Bonsoir

Merci Daniel pour ta formule mais il existe des situations où elle ne
fonctionne pas.
Ex :
En A4, mets le contenu de A5 et en B4, mets le contenu de B5 ==>> (ligne
4=ligne 5)
En H1, tu saisis 1D77 et en H2 j'obtiens 3 au lieu de 2 (ta formule me
compte 2 fois les lignes 4 et 5 alors que c'est le même N° de compte)

Une indication que je n'avais précisée : ma colonne est triée (si cela
peut aider).
Je n'arrive pas à dire en matricielle : ne pas tenir compte d'une ligne si
le N° de compte de cette ligne = le N° de compte de la ligne précédente ou
alors ne prendre en compte que les lignes dont le N° de compte est
différent du N° de compte de la ligne précédente.

Si vous avez des idées ...

Encore merci


"Daniel.C" a écrit dans le message de
news:O6Q0%
Bonjour.
Essaie la formule matricielle suivante (valider avec CTRL+MAJ+Entrée) :
=SOMME((A1:A5<>INDEX(A1:A5;EQUIV(H1;B1:B5;0)))*(B1:B5=H1))+1
Cordialement.
Daniel
"PYR" a écrit dans le message de news:
%
Bonsoir à tous.

J'ai beau avoir cherché, je n'ai trouvé que des post traitant
partiellement de mon souci du moment.
Voici mon cas (pour faire simple) car cela s'applique sur plus de 500
000 lignes (je dispose d'Excel 2007 permettant cette facilité)
En colonne A, j'ai des numéros de compte et en colonne B des codes
A B
1 130040128 1D4C
2 130040128 1D77
3 130040128 1D4C
4 130040128 1D4C
5 130060321 1D77

J'aurais aimé quand je saisis dans H1 par exemple 1D77, j'obtienne en H2
la valeur 2 => 2 comptes distincts (de la colonne A) ont ce code.
Autre saisie : toujours en H1, si je saisis 1D4C, en H2 je devrais
obtenir 1 => 1 seul compte distinct (de la colonne A) a ce code (on
trouve 3 fois le même).

Je n'ai aucun souci quand ce que je cherche et où je cherche
correspondent à la même colonne mais quand plusieurs colonnes (au moins
2 ici) entrent en jeu, je n'ai pas trouvé de solution d'où votre
sollicitude.

Je voudrais, pour être complet sinon je sais faire, éviter d'utiliser
une colonne de travail qui teste le cas ligne par ligne et retourne une
info du style oui/non que je n'aurais pus qu'à comptabiliser surtout que
le nombre de lignes augmentent chaque jour un peu plus et que mon
fichier fait déjà plus de 100 Mo.

Voilà l'exposé du problème

Si vous avez un peu de temps à me consacrer, je vous en serai
reconnaissant.

Merci d'avance









1 2