XL 2016 syntaxe VBA

didier09

XLDnaute Occasionnel
Bonjour le forum,

J'ai un souci de syntaxe VBA:

Une macro s'exécute sur plusieurs feuilles pour alimenter des relevés automatiques, cela fonctionne parfaitement. J'ai ajouté des feuilles au classeur pour compléter les données et je voudrais que cette boucle ne se fasse pas sur certaines feuilles. J'ai essayé plusieurs solutions, dont celle ci dessous mais ça bloque. A l'origine seule la feuille "CSV" était ignorée, du coup mes essais sont en commentaires.


For Each Ws In .Worksheets 'boucle sur chacune des feuilles

If Ws.Name <> "Csv" Then
' If Ws.Name <> "EBD" Then
' If Ws.Name <> "BAO" Then
' If Ws.Name <> "T111" Then
' If Ws.Name <> "ET" Then
' If Ws.Name <> "TOUYRE" Then 'si la feuille ne porte pas le nom "-----" <===============================
Set Rel = Ws.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)

Do 'débute une boucle infinie

Etc....


Si un spécialiste VBA pouvait m'aider, merci d'avance.

Didier
 

Efgé

XLDnaute Barbatruc
Bonjour didier09, Patrice33740

Une autre version pour éviter les And
Code:
Sub test()
Dim Ws As Worksheet, Rel As Range
Dim Liste$
Liste = "Csv§EBD§BAO§T111§ET§TOUYRE§"

For Each Ws In Worksheets 'boucle sur chacune des feuilles
    If InStr(Liste, Ws.Name & "§") <> 0 Then
        Set Rel = Ws.Range("b8")
       'Do Etc...
    End If
Next Ws
End Sub

Cordialement
 

Patrice33740

XLDnaute Impliqué
Bonjour didier09, Patrice33740

Une autre version pour éviter les And ...
Pour limiter les risques d'erreur il serait préférable d'ajouter aussi un § devant le nom :
Code:
Sub test()
Dim Ws As Worksheet, Rel As Range
Dim Liste$
Liste = "§Csv§EBD§BAO§T111§ET§TOUYRE§"

For Each Ws In Worksheets 'boucle sur chacune des feuilles
    If InStr(Liste,"§" & Ws.Name & "§") <> 0 Then
        Set Rel = Ws.Range("b8")
       'Do Etc...
    End If
Next Ws
End Sub
 

didier09

XLDnaute Occasionnel
pour plus de clarté pour vous je vous copie la Sub complète:

Sub Mise_A_Jour_Bilan()

'DECLARATION DES VARIABLES
Dim Data As Range, DerLigData&, Mini#, Maxi#, Col%, PremColTrouve As Boolean, Premier As Double
Dim DerCol As Byte, PremCol As Byte, Rel As Range, VeilleCol As Byte
Dim Mois$, An$, Calcul As Boolean, Wb As Workbook, csvOuvert As Boolean, v As Byte
Dim TabCol(31)
Dim Liste$
Liste = "§Csv§EBD§BAO§T111§ET§TOUYRE§"

Application.ScreenUpdating = False 'fige l'affichage écran pendant le traitement de la macro

'RECHERCHE DES DATES LIMITES DU MOIS
With ThisWorkbook
Mois = Mid(.Name, Len(.Name) - 8, 2) 'extraction du mois à partir du nom de fichier
An = Mid(.Name, Len(.Name) - 5, 2) 'extraction de l'année à partir du nom de fichier
'Vérification de la cohérence des données extraites
If Not (IsNumeric(Mois) And IsNumeric(An)) Then _
MsgBox "Le nom de ce fichier ne permet pas son traitement": Exit Sub
If Mois < 1 Or Mois > 12 Then MsgBox "Numéro de mois incohérent dans le nom de fichier": Exit Sub
Mini = CDate("01/" & Mois & "/" & An) 'premier jour du mois
Maxi = CDate("01/" & Mois + 1 & "/" & An) - 1 'dernier jour du mois(veille du premier jour du mois suivant)
End With

'TRAVAIL SUR LE FICHIER "Report.xls"
' csvOuvert = False 'initialise la variable à False (faux)
For Each Wb In Application.Workbooks 'boucle sur chacun des fichiers ouverts
If Wb.Name = "Report.xls" Then csvOuvert = True: Exit For 'change la variable si le fichier est ouvert
Next Wb
'message et abandon de la procédure si le fichier Report.xls n'est pas ouvert
If Not csvOuvert Then MsgBox "Vous devez d'abord ouvrir le fichier Report.xls": Exit Sub
Windows("Report.xls").Activate 'Active la fenêtre du fichier xls
DerLigData = Range("d65536").End(xlUp).Row '- 1 'recherche le numéro de la dernière ligne utile
Set Data = ActiveSheet.Range("d3:ah" & DerLigData) 'Définit le champ attribué à la variable

'ANALYSE DES DATES DU CHAMP DATA
' PremColTrouve = False ': DeuxiemeTrouve = False 'initialise les variables à False (faux)
'si une ou plusieurs date(s) du mois sont dans le fichier csv
With Data
If Maxi >= WorksheetFunction.Small(.Rows(1), 1) And Mini <= WorksheetFunction.Large(.Rows(1), 1) Then
For Col = 1 To 31 'boucle sur les 31 cellules du champ
'crée un tableau de 31 cellules dans lequel les n° des colonnes répondant aux critères s'inscrivent
If .Cells(1, Col) >= Mini And .Cells(1, Col) <= Maxi Then
'cherche le N° de colonne de la première date correcte trouvée, enregistre sa valeur et sa position
If Not PremColTrouve Then
PremColTrouve = True: Premier = .Cells(1, Col): PremCol = Col
If Col = 1 Then 's'il s'agit du premier jour du mois
For v = 28 To 31 'boucle sur les colonnes 28 à 31
'si un de ces jours correspond à la veille du prmier jour du mois
'mémorise le N° colonne dans la variable VeilCol puis sort de la boucle
If .Cells(1, v) = Premier - 1 Then VeilleCol = v: Exit For ' Else VeilleCol = 0
Next v
End If
End If
TabCol(Col) = Col: DerCol = Col 'ajoute dans le tablo fictif e mémorise le dernier numéro de colonne
End If
Next Col
Else: MsgBox "Aucune donnée dans Report.xls correspondante à ce mois": Exit Sub
End If
End With

With ThisWorkbook
Windows(.Name).Activate 'active ce classeur
For Each Ws In .Worksheets 'boucle sur chacune des feuilles
If InStr(Liste, "§" & Ws.Name & "§") <> 0 Then
Set Rel = Ws.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)
Do 'débute une boucle infinie
If Rel > 3 And Rel <= DerLigData Then 'vérifie la cohérence de la valeur de la ligne
Calcul = IIf(Rel.Offset(1, 0) > 0, True, False) 'affecte vrai ou faux à la variable Calcul
'boucle sur chacune des colonnes de Data répondant au critère de date de ce fichier
For Col = PremCol To DerCol
'si Rev n'est pas vide et qu'un numéro de colonne est dans le TabCol
If Rel.Offset(Col + 3, 0) = "" And TabCol(Col) > 0 Then
With Data 'applique les instructions suivantes à la variable Data
If Calcul Then 's'il s'agit d'une donnée à calculer
's'il s'agit du premier jour du mois et que des valeurs sont dispo pour la veille _
report de la valeur du jour - la valeur dans la colonne VeilleCol
If Col = 1 And VeilleCol > 0 Then _
Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col) - .Cells(Rel - 2, VeilleCol)
's'il ne s'agit ni premier jour du mois, ni du premier trouvé,report de la valeur _
du jour - la valeur dans la colonne immédiatement à gauche
If Col > 1 And Col <> PremCol Then _
Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col) - .Cells(Rel - 2, Col - 1)
'report directe de la donnée (pour les données sans calcul)
Else: Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col)
End If
End With
End If
Next Col
Else: MsgBox "La valeur en " & Rel.Address & " de la feuille " & Ws.Name & " n'est pas cohérente"
End If
Set Rel = Rel.Offset(0, 1) 'décale l'affectation de la variable d'une colonne vers la droite
Loop While Rel > 0 'poursuit la boucle tant qu'un N° de ligne est précisé
End If
Next Ws 'poursuit la boucle sur la feuille suivante
End With

End Sub
 

bayosky

XLDnaute Nouveau
Bonjour le forum,

J'ai un souci de syntaxe VBA:

Une macro s'exécute sur plusieurs feuilles pour alimenter des relevés automatiques, cela fonctionne parfaitement. J'ai ajouté des feuilles au classeur pour compléter les données et je voudrais que cette boucle ne se fasse pas sur certaines feuilles. J'ai essayé plusieurs solutions, dont celle ci dessous mais ça bloque. A l'origine seule la feuille "CSV" était ignorée, du coup mes essais sont en commentaires.


For Each Ws In .Worksheets 'boucle sur chacune des feuilles

If Ws.Name <> "Csv" Then
' If Ws.Name <> "EBD" Then
' If Ws.Name <> "BAO" Then
' If Ws.Name <> "T111" Then
' If Ws.Name <> "ET" Then
' If Ws.Name <> "TOUYRE" Then 'si la feuille ne porte pas le nom "-----" <===============================
Set Rel = Ws.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)

Do 'débute une boucle infinie

Etc....


Si un spécialiste VBA pouvait m'aider, merci d'avance.

Didier

Bonsoir,

Je ne suis pas certain d'avoir compris...
Mais

Si il y a beaucoup de feuilles et si seulement certaines doivent subir un certain traitement
mieux vaudrait avoir une procédure pour ce traitement (avec en entrée le nom de la feuille en tant qu'objet)
et une première procédure pour lancer ou pas ce traitement...

qqchose du type

Sub EnPremier()
For Each Ws In ThisWorkBook.Worksheets

select case Ws
case "Truc"
Ensuite(Ws)
case "bidule"
Ensuite(Ws)
end Select

End Sub


Sub Ensuite(WW as worksheet)
Set Rel = WW.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)

' traitement ... prévu

End Sub

Ce type de structure permet plus facilement les évolution sans tomber dans d'infernales usines à gaz ;o)

Cordialement,

HB
 

bayosky

XLDnaute Nouveau
Bonsoir,

Je ne suis pas certain d'avoir compris...
Mais

Si il y a beaucoup de feuilles et si seulement certaines doivent subir un certain traitement
mieux vaudrait avoir une procédure pour ce traitement (avec en entrée le nom de la feuille en tant qu'objet)
et une première procédure pour lancer ou pas ce traitement...

qqchose du type

Sub EnPremier()
For Each Ws In ThisWorkBook.Worksheets

select case Ws
case "Truc"
Ensuite(Ws)
case "bidule"
Ensuite(Ws)
end Select

END FOR

End Sub


Sub Ensuite(WW as worksheet)
Set Rel = WW.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)

' traitement ... prévu

End Sub

Ce type de structure permet plus facilement les évolution sans tomber dans d'infernales usines à gaz ;o)

Cordialement,

HB
 

didier09

XLDnaute Occasionnel
Bonjour le forum,

Merci Bayosky, je ne suis pas capable de reprendre le fichier selon tes préconisations. J'essaie de travailler dans l'autre sens style :

If Ws.Name = "Ws a traiter1" Then
Set Rel = WW.Range("b8") 'affecte la cellule "b8" à lavariable
Rel (Relevé)
'Traitement prévu
End if
If Ws.Name = "Ws a traiter2" Then
Set Rel = WW.Range("b8") 'affecte la cellule "b8" à lavariable
Rel (Relevé)
'Traitement prévu
End if
If Ws.Name = "Ws a traiter3" Then
Set Rel = WW.Range("b8") 'affecte la cellule "b8" à lavariable
Rel (Relevé)
'Traitement prévu
End if

Ainsi de suite pour toutes mes feuilles. J'essaie ça en espérant que cela fonctionne. J'en conviens c'est pas joli du côté code....

Didier
 

didier09

XLDnaute Occasionnel
Bonjour le forum,

Juste un petit retour sur ma problématique. La solution proposée en #3 et améliorer en #4 fonctionne parfaitement. Je l'ai utilisé pour automatiser un effacement de cellules sur certaines feuilles. Du coup j'ai repris mon code pour le remplissage et ça fonctionne. J'avais dû faire une faute de frappe...

Encore merci à tous pour le coup de main.
Didier
 

Patrice33740

XLDnaute Impliqué

JM27

XLDnaute Barbatruc
Bonjour a toi aussi
sa réponse c'est ca
Merci Jean Marie et JM27 pour vos envois. Je regarde vos fichiers, je reviens vers vous au plus tôt.
penses tu que cela est une réponse ?
alors qu'il a déja posté d'autre questions ?
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 145
Membres
103 129
dernier inscrit
Atruc81500