Aide sur macro

  • Initiateur de la discussion vincent
  • Date de début
V

vincent

Guest
Bonjour,
voila j aimerai savoir le code pour dire ca en language vba :
si la celllue 'e3' = no + nom de la feuille alors selectionner la feuille
pour l instant j en suis la et ca ne marrche pas
If Sheet.Range('E3') = 'NO ' & Sheet.Name Is Nothing Then
Sheets(Sheet.Name).Activate

car je ne sais pas pourquoi au debut ca marchait tres bien avec une recherche du style sheet.cell.find('no' & sheet.name) mais maintenant au lieu de lire le resultat dans la celulle, vba li la formule et la of course rien ne s imprime car dans les cellules e1 j ai une formule avec si donc j ai ma requete NO + nom de la feuille si mon si n'est pas respecte.
Aussi ce que je ne comprend pas c est que je fais cette meme requete sur une autre feuille et la vba lis le resultat
je vous montre
Dim jobcard As Object
Set jobcard = Sheets(Array(1, 2, 3, 4, 5))

For Each Sheet In jobcard
If Sheet.cells.find('NO ' & Sheet.Name) Is Nothing Then 'la ca lis_ la formule.
If Sheets('PRESENTATION').Cells.Find('CAR 2#') Is Nothing_ Then 'la ca lis le resultat
Sheets(Sheet.Name).PrintOut copies:=1
Else
Sheets(Sheet.Name).PrintOut copies:=2
End If
End If
Next
End Sub

merci de m aider car comme on dit un regard exterieur nous fait svt voire des choses que l on ne voit pas tout seul
 

ThomasR

XLDnaute Occasionnel
bonjour vincent, le forum,

je présume que le debut de ton code est le même que pour imprimer ?

sinon c'est normal que cela ne marche pas

moi je suis plus adepte des boucles for i que Each (mais c'est un defaut de ma par :eek: )

je serait plus sur

Code:
for i = 1 to Sheets.Count
if sheets(i).range('E3') = 'NO' & Sheet(i).Name then
sheets(i).activate

pour autant je pense que si tu as plusieurs feuille qui ramplisse cette condition il ne t'affichera que la derniere car dans sa boucle il affichera la feuille 1 puis 2 (mais trop vite pour que tu puisses le voir)

je debute alors si quelqu'un peut trouver une autre solition

courrage
Thomas®
 
V

vincent

Guest
merci a toi thomas de me repondre si vite,
c'est bon je viens de trouver un compromis a mon probleme a savoir
If Sheet.Range('E1') = ('NO ' & Sheet.Name) Then
else
et ce ke je desire et ca marche alors...
sinon ton i = 1 to sheets.count ke cela signifie t il?
surtout le sheets.count car le reste j ai bien compris je pense
est ce cela est un code qui te permet de compter ton nombre de feuille ou simplement cea signifie jusqu a la derniere feuille?
je suis novice aussi et j aime apprendre alors voila
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Thomas, Vincent le Forum

Ta première macro, Vincent, n'est pas très 'Orthodoxe', mais du coup j'ai même du mal à comprendre ce qu'elle est sensée faire...

Voici traduit en VBA, ce que j'ai compris :

Sub TestVincentSearchWorkSheets()
Dim FeuilleCible As Worksheet
Dim FeuilleSource As Worksheet
Dim CelluleCible As Range
Dim CelluleSource As Range
Dim TexteCible As String
Dim TexteSource As String

TexteSource = 'CAR 2#'
Set FeuilleSource = Sheets('PRESENTATION')


   
For Each FeuilleCible In ThisWorkbook.Worksheets
        TexteCible = 'NO ' & FeuilleCible.Name
   
       
With FeuilleCible.Cells
       
         
Set CelluleCible = .Find(TexteCible, LookIn:=xlValues)
           
If CelluleCible Is Nothing Then
               
Set CelluleSource = FeuilleSource.Cells.Find(TexteSource, LookIn:=xlValues)
                   
If CelluleSource Is Nothing Then
                        MsgBox 'Action Pas Trouvé d
'Occurrence'
                       
'FeuilleCible.PrintOut Copies:=1
                   
Else
                        MsgBox 'Action une Occurrence Trouvée pour TextSource'
                   
End If
           
Else
               
Set CelluleSource = FeuilleSource.Cells.Find(TexteSource, LookIn:=xlValues)
                   
If CelluleSource Is Nothing Then
                        MsgBox 'Action une Occurrence Trouvée pour TextCible'
                   
Else
                        MsgBox 'Action Occurrences Trouvées pour TextSource et TextCible'
                       
'FeuilleCible.PrintOut Copies:=2
                   
End If
           
End If
       
       
End With
   
Next FeuilleCible
End Sub



Sinon pour Thomas, les deux Type de boucles, dans le cas de faire une colection sur WorkSheets, sont casiment similaires, mis à part que l'on travaille directement sur un Object Worksheet, ce qui est plus facile pour des manipulations ultérieures dans la Boucle, exemple simple :


Sub OnImprimeToutesLesFeuilles()
Dim WS As Worksheet

For Each WS In ThisWorkbook.Worksheets
   
With WS
    .PrintPreview
    .PrintOut
   
End With
Next
End Sub

pour Vincent, le Sheets.Count est tout simple :

Sub ClasseurCompteWorkSheets()

MsgBox 'Le Classeur actif contient ' & Worksheets.Count & ' WorkSheets'

End Sub


Par contre une collection Sheets peut contenir des objets Chart ou Worksheet.

Sub ClasseurCompteObjetsChartOuSheets()

MsgBox 'Le Classeur actif contient ' & Sheets.Count & ' Objets'

End Sub

Bon Week End
@+Thierry
 

ThomasR

XLDnaute Occasionnel
re,

enfait count donne le nombre total

donc une boucle sur toutes les feuilles.


je te disais que c'est moins bien que each car each travail sur des objet dans ton cas les feuilles (pour chaque feuille de mon fichier)

in worksheets (ce qui évite de declarer des variable tel que tu le fais 'Set jobcard = Sheets(Array(1, 2, 3, 4, 5))'

ta facon est util si tu souhaite éviter des feuilles (1, 4, 5, 6, ))

essai ce code qui est je pense plus proche de ta facon de faire




Code:
Dim wd As Worksheet

For Each wd In Worksheets

If wd.Range('E1') = ('NO ' & wd.Name) Then

Next

sinon dans for i (tu peux boucler sur tout et pas que des objets donc plus souple mais plus lent car il crée un objet à chaque foi que i change donc si 5 feuilles je cré 5 objet alors que each exploite des objets existant (dans ton cas pas de diff mais si grosse boucle la dif est significative).

@+
Thomas®
 

_Thierry

XLDnaute Barbatruc
Repose en paix
re Bonjour Thomas,

Il n'y a pas de mal, puisque tu vas dans mon sens, et tu t'expliques très bien aussi.

Pour le cas d'exclusion, on peut aussi en restand sur une Collection WorkSheets se permettre ceci :

Sub OnImprimeToutesLesFeuillesDontlIndexEstImpair()
Dim WS As Worksheet
Dim i As Byte

   
For Each WS In ThisWorkbook.Worksheets
       
For i = 1 To Worksheets.Count Step 2
           
If WS.Index = i Then
               
With WS
                    .PrintPreview
       
'            .PrintOut
               
End With
           
End If
       
Next i
   
Next WS
End Sub


Ou encore celà :

Sub OnImprimeToutesLesFeuillesDontLeNomNeCommencePasParF()
Dim WS As Worksheet
Dim i As Byte

   
For Each WS In ThisWorkbook.Worksheets
           
If Left(WS.Name, 1) <> 'F' Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
With WS
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .PrintPreview
&nbsp; &nbsp; &nbsp; &nbsp;
'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .PrintOut
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End With
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next WS
End Sub

Enfin il y de quoi s'amuser ;)

Bon Samedi sur VBA lol
@+Thierry
 
V

vincent

Guest
merci a tous les deux,
thomas : le truc c est que oui j evite des feuilles donc en faite le each est obligatoire
thierry :
tu me dis ke ce ne st pas orthodoxe alors si ca marche de temps a autre c est qu excel aurait une intelligence artificielle...

j ai optimise ma macro et je suis fier de moi ca marche sans probleme comme koi...

sub toto()
Dim jobcard As Object
Set jobcard = Sheets(Array(3, 4, 5, 6, 7, 8))

For Each Sheet In jobcard
If Sheet.Range('E1') = ('NO ' & Sheet.Name) Then
Else
If Sheets('PRESENTATION').range('B9') = '' Then
Sheets(Sheet.Name).PrintOut copies:=1
Else
Sheets(Sheet.Name).PrintOut copies:=2
End If
End If
Next
End Sub

Je vous repose ma question, avait vous une explication rationnelle pour qu excel prenne en compte soit la formule soit le resultat dans une cellule et cela par la meme instruction a savoir sheets.cells.find( 'ce ke tu cherche') mis a part ke c est une tete de mule ki fait ce ki lui plait.
merci
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Vincent

Je ne voulais pas t'offenser avec les Orthodoxes ou les Catholiques !!! Je suis comme ça depuis plus de trois ans sur ce Forum, je ne peux m'empêcher d'essayer d'obtenir toujours 'le plus' de tous les intervenants, de les faire s'épanouir en VBA... Et je pense que pas mal peuvent confirmer que je ne leur ai pas 'cassé les pieds' pour rien.


Sinon ce que je peux te dire, c'est que tout comme les outils de TRI ou donc, pour le cas présent, de RECHERCHE, certains paramètres d'Excel restent en mémoire quand tu ne les précises pas dans ton Code...

Par exemple ici, pour le Find, si tu vas manuellement dans les Menus d'Excel :
&nbsp;&nbsp;&nbsp;=> Edition
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> Rechercher
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> Que tu 'bascules' l'Option 'Dans' sur 'Valeur' au lieu de 'Formules' ou encore 'Commentaires'

Tu n'auras pas du tout le même effet en exécutant ta Macro....

Alors que si, comme je t'ai conseillé tu précise :
.Find(TexteCible, LookIn:=xlValues)

Quelque soit dans 'l'état' où tu auras laissé les paramètres de la Boite de Dilaog pour l'Outil de Recherche.... Ce n'est pas de l'intelligence artificielle, c'est juste des années d'expérience sur le fonctionnement d'Excel.

Bonne Après Midi
@+Thierry
 

ChTi160

XLDnaute Barbatruc
Salut Vincent
Bonjour @+Thierry
Bonjour Thomas®
Vincent il faut savoir resté zen ,car lorsque l'on se lance dans ce genre
de procédure et que l'on est pas au top
il faut te dire qu'Ici sur le Forum @+Thierry est une Référence
et qu'il ne loupe jamais une Occasion de te faire avancer en même temps que ton Projet
tu pourrais le constater en faisant une recherche par nom et là tu verrais que @+Thierry sait de quoi il parle
je suis un fervent admirateur et consommateur de tout ce que @+Thierry et quelques autres D'ailleurs, peuvent produirent sur ce Forum.
J’apprécie comme beaucoup les remarques et commentaires qu’il peut faire afin de nous faire avancer (Epanouir comme il dit) et quelques soient ces remarques qui peuvent avoir trait, à l’utilisation appropriée ou pas d’une procédure ,la présentation du texte d’une macro,l’optimisation d’un code qui pourtant fonctionne très bien ,mais dont on a pas tiré le meilleur des tas de petites choses qui font que j’avance et j’apprends et que de plus en plus souvent, je me lance à aider (comme j’ai pu le faire pour toi)des personnes en quête de la réponse, qui résoudra leur problème.
donc j’interviens là plus, pour marquer une fois encore, mon intérêt pour ce que @+Thierry fait pour nous, passionnés que nous sommes ,Que pour te dire que ta façon de faire n’est pas très Sympa, mais bon tu le constateras très vite @+Thierry est un très bon pédagogue et tu pourras compter sur lui à chaque fois qu’il seras parmi nous bien sûr .
bon Week-end à toutes et à tous
PS
Thierry me disait il y a peu Lol
Et oui Jean-Marie, j'ai un peu arrangé le sujet... J'ai aussi amélioré le code, plutôt que de passer par des Array 'Fixes' en dur dans le code :

Sinon oui pas bête l'idée de gérer les erreurs (If i = 1 Then Exit For) , mais dans ce cas je m'y prendrai ainsi :

Ah pardon, oui je n'avais pas fait gaffe à la mise en forme...

En fait ton erreur se Situe dans la Colonne 4 du Tablo2 soit 'E' sur la Feuille...

C'est dû à : Tablo2 (4, x) = Item

Car là tu écrases la Colonne 4 alors que ton Tablo2 (Qui est en Base 0) devrait contenir en champs la valeur contenue dans la Colonne 5 de Tablo (qui lui est en Base 1)...

Bon enfin bon mal de tête cet aprèm pour toi Jean-Marie

Message édité par: ChTi160, à: 11/06/2005 15:54
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 611
Messages
2 090 226
Membres
104 452
dernier inscrit
hamzamounir