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

code incorrect: besoin d'un avis

10 réponses
Avatar
gilles
bonjour,
ci dessous un code qui ne plante pas mais qui ne fonctionne pas terrible:
Dans un fichier qui comporte env 25 onglets et une fiche recap
depuis la fiche recap qui est un tableau, je veux
- selectionner le nombre de feuilles à copier a partir des onglets
- effacer les onglets qui ne sont pas utiles

Sub essai3()
On Error Resume Next
Dim Name As String, Cal As Range, cell As Range, NomFeuille As String
Sheets("recap").Select
Set Cal = Range("F5:H5")
For Each cell In Cal
If cell <> "" Then

‘avec QU. De feuilles necessaires>1
NomFeuille = Cal.Offset(0, -2).Value
Cal.Offset(0, -3).Select
If Cal.Offset(0, -3) > 1 Then
Sheets(NomFeuille).Copy after:=Sheets(NomFeuille) 'ça marche
ActiveSheet.Range("A4").Value = cell.Offset(-2, 0) 'changer -2 pour ligne
suivante
Name = cell.Offset(0, -2) & cell.Offset(-2, 0).Value 'changer -2 pour ligne
suivante
ActiveSheet.Name = (Name)

‘avec QU. De feuilles necessaires=1
Cal.Offset(0, -3).Select
If Cal.Offset(0, -3) = 1 Then
Cal.Offset(0, -2).Select
NomFeuille = ActiveCell.Value
ActiveSheet.Range("A4").Value = cell.Offset(-2, 0) 'changer -2 pour ligne
suivante
Name = cell.Offset(0, -2) & cell.Offset(-2, 0).Value 'changer -2 pour ligne
suivante
'Name = [A50] & " " & cell.Offset(-3, 0).Value 'ça marche - définit le nom
de la feuille
End If

‘avec QU de feuilles necessaires =0
If Cal.Offset(0, -3) < 1 Then
Cal.Offset(0, -2).Select
Sheets(NomFeuille).Delete
End If
End If

Sheets("recap").Select
cell.Select
End If
Next cell

Sheets("recap").Select
Application.ScreenUpdating = False
End Sub

ça ne marche pas
si je n'ai que d'une feuille, je ne dois pas recopier l'onglet selectionné
mais le code le recopie quand même--
Si un puissant vbatiste voit ou mon modeste code plante ...
merci
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...

10 réponses

Avatar
FFO
Salut gilles

Ton exposé sucite en moi cette réflexion

Si la recopie s'effectue c'est que la condition qui concerne la partie du
code qui en est à l'origine est vérifiée soit :

If Cal.Offset(0, -3) > 1 Then

Il faudrait vérifier la valeur de la cellule déterminé par Cal.Offset(0, -3)

Mets juste avant par exemple ceci :

MsgBox(Cal.Offset(0, -3))

Tu auras cette valeure à chaque tour de boucle
Et ainsi de statuer sur le bien fondé de la copie

Fais des essais et dis moi

Tu peux aussi transmettre ton fichier avec le code par ce biais :

http://www.cijoint.fr/index.php

Communiques nous le lien pour le récupérer

Et ainsi de l'analyser

Tiens nous informé !!!!!
Avatar
gilles
bonjor FFO et merci
http://www.cijoint.fr/cjlink.php?file=cj200904/cijqA4lmbh.xls

la macro se trouve en module 5
elle est un peu tarabiscotée car je fais pas mal d'essais infructueux
merci dans tous les cas, de ton aide
--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"FFO" a écrit :

Salut gilles

Ton exposé sucite en moi cette réflexion

Si la recopie s'effectue c'est que la condition qui concerne la partie du
code qui en est à l'origine est vérifiée soit :

If Cal.Offset(0, -3) > 1 Then

Il faudrait vérifier la valeur de la cellule déterminé par Cal.Offset(0, -3)

Mets juste avant par exemple ceci :

MsgBox(Cal.Offset(0, -3))

Tu auras cette valeure à chaque tour de boucle
Et ainsi de statuer sur le bien fondé de la copie

Fais des essais et dis moi

Tu peux aussi transmettre ton fichier avec le code par ce biais :

http://www.cijoint.fr/index.php

Communiques nous le lien pour le récupérer

Et ainsi de l'analyser

Tiens nous informé !!!!!



Avatar
gilles
Salut MICHEL
merci de tes conseils avisés
Je suis un bricoleur/vbatiste occasionnel et j'ai du mal à progresser
je regarde tout ça et je vous donne réponse, à toi et FFO
Pour info, j'ai posté le fichier dans la précedente réponse
merci bien
gilles
--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"MichDenis" a écrit :

Bonjour Gilles,

Ton code est difficile à lire comme il est écrit.
Voici quelques remarques...

A ) L'indentation est un "must"

B ) Il faut éviter lors du développement d'une procédure de
mettre sur la première ligne "On Error Resume Next
Il faut d'abord s'assurer que dans les meilleures conditons le
code écrit s'exécute sans anicroche !

à titre d'exemple :
Tu as défini ta variable "NomFeuille" As String
Dans ta procédure, tu lui affectes ceci :
NomFeuille = Cal.Offset(0, -2).Value
La variable Set Cal = Range("F5:H5")
Cela signifie que Cal.Offset(0, -2).Value
fait référence aux cellules D5:F5

La résultante, cela génère une erreur car tu essaies d'attribuer à
une variable String
un tableau D5:F5.

Fait le test suivant chez toi dans une procédure à part et observe
la
plage de cellules sélectionnées à la fin de procédure... et
l'erreur générée.
Dim NomFeuille As String
Sheets("recap").Select
Set Cal = Range("F5:H5")
Cal.Offset(0, -2).Select
NomFeuille = Cal.Offset(0, -2).Value

Pour faire référence seulement à la cellule D5, il aurait fallu que
tu utilises ceci
Cal.Offset(0, -2)(1,1).Select OU
Cal.Offset(0, -2).item(1,1).Select

Il n'est pas surprenant que tu éprouves des difficultés.

C ) Dans ton code, au lieu de faire référence à la feuille active,
utilise
une variable Objet Worksheet .... comme ça tu es certain de toujours
faire référence à cette feuille dans ton code :
Dim Sh As Workheets
Set Sh = ThisWorkbook.Worksheets("Recap")
et tout au long de ton code au lieu d'écrire :
ActiveSheet.Range("A4").Value = cell.Offset(-2, 0)
tu saisis:
Sh.Range("A4").Value = cell.Offset(-2, 0)
Cela sera bon peu importe la feuille active au moment de l'exécution
de la ligne de code.


Voilà .





"gilles" a écrit dans le message de
groupe de discussion :

bonjour,
ci dessous un code qui ne plante pas mais qui ne fonctionne pas terrible:
Dans un fichier qui comporte env 25 onglets et une fiche recap
depuis la fiche recap qui est un tableau, je veux
- selectionner le nombre de feuilles à copier a partir des onglets
- effacer les onglets qui ne sont pas utiles

Sub essai3()
On Error Resume Next
Dim Name As String, Cal As Range, cell As Range, NomFeuille As String
Sheets("recap").Select
Set Cal = Range("F5:H5")
For Each cell In Cal
If cell <> "" Then

‘avec QU. De feuilles necessaires>1
NomFeuille = Cal.Offset(0, -2).Value
Cal.Offset(0, -3).Select
If Cal.Offset(0, -3) > 1 Then
Sheets(NomFeuille).Copy after:=Sheets(NomFeuille) 'ça marche
ActiveSheet.Range("A4").Value = cell.Offset(-2, 0) 'changer -2 pour ligne
suivante
Name = cell.Offset(0, -2) & cell.Offset(-2, 0).Value 'changer -2 pour
ligne
suivante
ActiveSheet.Name = (Name)

‘avec QU. De feuilles necessaires=1
Cal.Offset(0, -3).Select
If Cal.Offset(0, -3) = 1 Then
Cal.Offset(0, -2).Select
NomFeuille = ActiveCell.Value
ActiveSheet.Range("A4").Value = cell.Offset(-2, 0) 'changer -2 pour ligne
suivante
Name = cell.Offset(0, -2) & cell.Offset(-2, 0).Value 'changer -2 pour
ligne
suivante
'Name = [A50] & " " & cell.Offset(-3, 0).Value 'ça marche - définit le
nom
de la feuille
End If

‘avec QU de feuilles necessaires =0
If Cal.Offset(0, -3) < 1 Then
Cal.Offset(0, -2).Select
Sheets(NomFeuille).Delete
End If
End If

Sheets("recap").Select
cell.Select
End If
Next cell

Sheets("recap").Select
Application.ScreenUpdating = False
End Sub

ça ne marche pas
si je n'ai que d'une feuille, je ne dois pas recopier l'onglet
selectionné
mais le code le recopie quand même--
Si un puissant vbatiste voit ou mon modeste code plante ...
merci
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire
aujourd'hui,
mais à chaque jour suffit sa peine...



Avatar
MichDenis
Une petite correction :

Dim Sh As Workheets , évidemment vous aurez lui Dim Sh As Workheet sans "S"
Avatar
FFO
Rebonjour Gilles

Changes la ligne :

If Cal.Offset(0, -3) > 1 Then

par

If ActiveCell > 1 Then

de même pour

If Cal.Offset(0, -3) = 1
et
If Cal.Offset(0, -3) < 1

par

If ActiveCell = 1
et
If ActiveCell < 1

Celà devrait mieux fonctionner

Dis moi !!!!!
Avatar
gilles
RE bonjour
Merci de ton suivi
ci dessous la dernière version qui tient comte des observations de MICHDENIS
module 5
je regarde tes observations ce soir
merci encore à toi et Michel
http://www.cijoint.fr/cjlink.php?file=cj200904/cijmZCjJfc.xls

--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"FFO" a écrit :

Rebonjour Gilles

Changes la ligne :

If Cal.Offset(0, -3) > 1 Then

par

If ActiveCell > 1 Then

de même pour

If Cal.Offset(0, -3) = 1
et
If Cal.Offset(0, -3) < 1

par

If ActiveCell = 1
et
If ActiveCell < 1

Celà devrait mieux fonctionner

Dis moi !!!!!



Avatar
FFO
Rebonjour Gilles

Tans ta nouvelle version l'avant dernier End If est en trop
Donc à supprimer
Avec cette ultime modification celà semble fonctionner

Donnes nous des nouvelles !!!!!!
Avatar
gilles
Bonjour,
désolé pour le retard
ci joint la dernière mouture qui tient compte de votre aide.
ça marche pas mal mais il subsiste les pb suivants:
- si j'ai besoin d'une seule feuille, j'utilise et renomme l'onglet de
base (ex: plateforme devient plateformeAMENAGTGX)
de ce fait là l'onglet d'origine n'existe plus et quand la boucle repasse
elle ne trouve pas l'onglet
- Quand cal F5:H5 est fini, je dois attaquer la ligne suivante soit F6:H6
et ainsi de suite
Puis-je renommer cal et à quel moment le mettre

http://www.cijoint.fr/cjlink.php?file=cj200904/cijN865Aif.xls


Si vous êtes encore sur le fil merci de votre aide à venir, sinon un grand
merci pour vos remarques de pro
à+
--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"FFO" a écrit :

Rebonjour Gilles

Tans ta nouvelle version l'avant dernier End If est en trop
Donc à supprimer
Avec cette ultime modification celà semble fonctionner

Donnes nous des nouvelles !!!!!!



Avatar
gilles
Re bonjour
en fait mon truc ne marche pas si bien que ça:
dans cal F5:X5 la boucle saisit chaque cellule et copie et renomme l' onglet
dont le nom est en cal.offset (-2,0)
...sauf que quand il passe de F5 à H5 ça devrait êtreoffset(-4 ,0)...et (-6,
0) pour J5
Comment puis-je lui imposer de toujours se référer à D5 ?
Merci
Gilles
--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"MichDenis" a écrit :

Une petite correction :

Dim Sh As Workheets , évidemment vous aurez lui Dim Sh As Workheet sans
"S"






Avatar
gilles
merci MICHEL
OK je regarde ça
j'ai trouvé des soluces en tenant compte de tes observations
mais il reste des trucs bizarres
à+
--
en VBA aussi, ne remettons pas au lendemain ce qu'on peut faire aujourd'hui,
mais à chaque jour suffit sa peine...


"MichDenis" a écrit :

Une petite correction :

Dim Sh As Workheets , évidemment vous aurez lui Dim Sh As Workheet sans
"S"