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

Parcourir un tableau

9 réponses
Avatar
Droopy191
Salut,

Je cherche à parcourir un tableau en VBA ( ex range ("A1:D10") ), pour
chaque colonne, je dois en fonction de la valeur de la première ligne de
la colonne donner une valeur spécifique mais identique aux autres lignes
de la colonne, puis je passe à la colonne suivante.

pour le test et remplir les valeurs, je sais faire, mais je ne vois pas
comment parcourir le tableau.

Auriez vous un exemple ?

merci

--
DR

9 réponses

Avatar
MichD
Bonjour,

Essaie comme ceci :

'-----------------------------------------------------
Sub test()
Dim C As Range
'Nom de la feuille à adapter
With Worksheets("Feuil1").Range("A1:D10")
For Each C In .Rows(1).Cells
'tu fais le test que tu veux sur la
'valeur de c qui représente à tour
'de rôle chacune des valeurs de la première
'ligne de la plage de cellules.
If C = "????" Then
'la valeur que va prendre le reste de la colonne.
'si le test est bon
.Columns(C.Column).Offset(1).Resize(.Rows.Count - 1) = 25
End If
Next
End With
End Sub
'-----------------------------------------------------


MichD
------------------------------------------
"Droopy191" a écrit dans le message de groupe de discussion : 4eac31bb$0$27442$

Salut,

Je cherche à parcourir un tableau en VBA ( ex range ("A1:D10") ), pour
chaque colonne, je dois en fonction de la valeur de la première ligne de
la colonne donner une valeur spécifique mais identique aux autres lignes
de la colonne, puis je passe à la colonne suivante.

pour le test et remplir les valeurs, je sais faire, mais je ne vois pas
comment parcourir le tableau.

Auriez vous un exemple ?

merci

--
DR
Avatar
Droopy191
Merci pour aide, ca marche nickel
Je vais abuser, comment faire pour le faire pour plusieurs range dans
cette feuille ?
En fait, j'ai un plage de cellule pour chaque mois de l'année.

je pensais à faire une collection mais je ne vois pas trop comment
l'utiliser.

--
DR
Avatar
isabelle
bonjour Dr,

With Worksheets("Feuil1")
Set plg = Union(.Range("A1:A2"), .Range("B4:B5"), .Range("C6:C7"))
End With

For Each c In plg
x = c.Address
Next


--
isabelle


Le 2011-11-01 13:10, Droopy191 a écrit :
Merci pour aide, ca marche nickel
Je vais abuser, comment faire pour le faire pour plusieurs range dans cette feuille ?
En fait, j'ai un plage de cellule pour chaque mois de l'année.

je pensais à faire une collection mais je ne vois pas trop comment l'utiliser.

Avatar
MichD
Un autre exemple,

J'ai simplement ajouté une variable de type "tableau"(array) dans laquelle je
liste chacune des plages de cellules sur lesquelles je veux boucler sur chacune
des cellules de la première ligne.

'----------------------------------
Sub test1()
Dim C As Range, Arr(), Adr As String, Elt As Variant

'Tu liste toutes les plages de cellules dans une
'variable comme appelle Tableau (array),Tu peux en
'lister autant que tu veux!
Arr = Array("A1:D10", "K5:M10", "A25:G50")

'Nom de la feuille à adapter
With Worksheets("Feuil1")
'Pour chaque élément du tableau
For Each Elt In Arr
For Each C In .Range(Elt).Rows(1).Cells
'tu fais le test que tu veux sur la
'valeur de c qui représente à tour
'de rôle chacune des valeurs de la première
'ligne de la plage de cellules.
Adr = C.Address
If C = "????" Then
'la valeur que va prendre le reste de la colonne.
'si le test est bon
.Columns(C.Column).Offset(1).Resize(.Rows.Count - 1) = 25
End If
Next
Next
End With
End Sub
'----------------------------------


MichD
------------------------------------------
"Droopy191" a écrit dans le message de groupe de discussion : 4eb02819$0$656$

Merci pour aide, ca marche nickel
Je vais abuser, comment faire pour le faire pour plusieurs range dans
cette feuille ?
En fait, j'ai un plage de cellule pour chaque mois de l'année.

je pensais à faire une collection mais je ne vois pas trop comment
l'utiliser.

--
DR
Avatar
Droopy191
Merci à tous les deux, j'ai finalement réussi à faire ce que je voulais

'----------------------------------
Sub Btn_raz_calendrier_Cliquer()
' macro de remise à zero des évenements enregistrés dans le calendrier
' suppression des cp, rtt, recup placés dans le calendrier
' par des JT ou des cases vides pour les jours fériés ou WE

'Demande de confirmation ou sortie
If MsgBox("Etes vous certain de vouloir mettre à zéro le calendrier,
vous perdrez tous les événements saisis", vbOKCancel + vbExclamation,
"Confirmation") = 2 Then
Exit Sub
End If

' ne pas mettre à jour l'affichage
Application.ScreenUpdating = False

Dim C, Macellule As Range, Arr(), Adr, Type_jour As String, Elt As Variant

' Liste répresentant les différents mois
Arr = Array("C35:AG59", "C61:AG85", "C87:AG111", "C113:AG137", _
"C139:AG163", "C165:AG189", "C191:AG215", "C217:AG241", "C243:AG267", _
"C269:AG293", "C295:AG319", "C321:AG345")


With Worksheets("Conges RTT")
' pour chaque mois
For Each Elt In Arr
' passe en revue chaque cellule de la première ligne
With Worksheets("Conges RTT").Range(Elt)
For Each C In .Rows(1).Cells

If C = "" Then ' test si la cellule contient un jour valide
Type_jour = ""
Else
' test si le jour est un samedi ou un dimanche
If Weekday(C) = vbSaturday Or Weekday(C) = vbSunday
Then
Type_jour = ""
Else
' par défaut, c'est un jour travaillé
Type_jour = "JT"
'test si c'est un jour férié, Range("Holy_FR")
est la liste des jours fériés francais
For Each Macellule In Worksheets("Conges
RTT").Range("Holy_FR")
If Macellule = C Then Type_jour = ""
Next
End If
End If

' affectation du résultat à la colonne
.Columns(C.Column - .Column +
1).Offset(1).Resize(.Rows.Count - 1) = Type_jour

Next
End With
Next
End With

Application.ScreenUpdating = True

End Sub
'----------------------------------

Encore une question ;-)

ici je test si ma valeur de date appartient ou pas à une plage nommée
qui contient les jours fériés ( ca marche tel quel )

For Each Macellule In Worksheets("Conges RTT").Range("Holy_FR")
If Macellule = C Then Type_jour = ""
Next
N'aurait il pas une facon plus simple/plus élégante de vérifier ?

En tout cas merci.

--
DR
Avatar
MichD
Bonjour,

Je ne suis pas sûr d'avoir compris ta question...

Mais si tu veux trouver une date particulière sur la première ligne d'une plage nommée,
au lieu de boucler sur chacune des cellules tu peux faire ceci :

Supposons une plage nommée "Tata", Tu veux trouver si la date 5/11/11 existe sur la
première ligne de la plage nommée.

'-----------------------------------------
Sub Test()
Dim C As Variant, X As Long

'La date recherchée
X = CLng(DateSerial(2011, 11, 5))

With Range("Tata") 'Plage nommée
'C = numéro de la colonne ou une erreur
C = Application.Match(X, .Rows(1).Cells, 0)
If Not IsError(C) Then
MsgBox .Item(.Rows(1).Row, C).Value & " à cette adresse : " & .Item(1, C).Address
Else
MsgBox "Date non trouvée"
End If
End With

End Sub
'-----------------------------------------


MichD
------------------------------------------
"Droopy191" a écrit dans le message de groupe de discussion : 4eb166e9$0$2243$

Merci à tous les deux, j'ai finalement réussi à faire ce que je voulais

'----------------------------------
Sub Btn_raz_calendrier_Cliquer()
' macro de remise à zero des évenements enregistrés dans le calendrier
' suppression des cp, rtt, recup placés dans le calendrier
' par des JT ou des cases vides pour les jours fériés ou WE

'Demande de confirmation ou sortie
If MsgBox("Etes vous certain de vouloir mettre à zéro le calendrier,
vous perdrez tous les événements saisis", vbOKCancel + vbExclamation,
"Confirmation") = 2 Then
Exit Sub
End If

' ne pas mettre à jour l'affichage
Application.ScreenUpdating = False

Dim C, Macellule As Range, Arr(), Adr, Type_jour As String, Elt As Variant

' Liste répresentant les différents mois
Arr = Array("C35:AG59", "C61:AG85", "C87:AG111", "C113:AG137", _
"C139:AG163", "C165:AG189", "C191:AG215", "C217:AG241", "C243:AG267", _
"C269:AG293", "C295:AG319", "C321:AG345")


With Worksheets("Conges RTT")
' pour chaque mois
For Each Elt In Arr
' passe en revue chaque cellule de la première ligne
With Worksheets("Conges RTT").Range(Elt)
For Each C In .Rows(1).Cells

If C = "" Then ' test si la cellule contient un jour valide
Type_jour = ""
Else
' test si le jour est un samedi ou un dimanche
If Weekday(C) = vbSaturday Or Weekday(C) = vbSunday
Then
Type_jour = ""
Else
' par défaut, c'est un jour travaillé
Type_jour = "JT"
'test si c'est un jour férié, Range("Holy_FR")
est la liste des jours fériés francais
For Each Macellule In Worksheets("Conges
RTT").Range("Holy_FR")
If Macellule = C Then Type_jour = ""
Next
End If
End If

' affectation du résultat à la colonne
.Columns(C.Column - .Column +
1).Offset(1).Resize(.Rows.Count - 1) = Type_jour

Next
End With
Next
End With

Application.ScreenUpdating = True

End Sub
'----------------------------------

Encore une question ;-)

ici je test si ma valeur de date appartient ou pas à une plage nommée
qui contient les jours fériés ( ca marche tel quel )

For Each Macellule In Worksheets("Conges RTT").Range("Holy_FR")
If Macellule = C Then Type_jour = ""
Next
N'aurait il pas une facon plus simple/plus élégante de vérifier ?

En tout cas merci.

--
DR
Avatar
Droopy191
Le 02/11/2011 18:08, MichD a écrit :
Bonjour,

Je ne suis pas sûr d'avoir compris ta question...




En fait je cherche à savoir si ma date est un jour férié.
J'ai un plage nommée qui contient les fériés francais. Je voudrais donc
savoir si ma date contenue dans C est une des dates de ma plage nommée.


--
DR
Avatar
MichD
Bonjour,

Excel ne fait pas de miracle, tu dois avoir une liste de congés fériés définie dans ton classeur.

Admettons qu'en A1:A15, tu as la liste des dates fériées au format date reconnue par Excel.

Maintenant si tu veux savoir si la date en GS est un jour férié,

Tu utilises cette formule : =si(estnum(Equiv(G5;A1:A15;0));"Jour férié";"jour non férié")

En VBA, tu aurais quelque chose comme :

'-------------------------------------------
Sub test()

Dim D As Long, X As Variant
'Range("C2")'la cellule où est la date que tu vérifiée
'Range("A1:A15").Address : la plage où sont tes jours fériés
'Attention, pour les besoins j'ai supposé qu'elles étaient
'dans la même feuille... ce n'est peut-être pas le cas pour toi

With Worksheets("Feuil1")
D = .Range("C2") 'la cellule où est la date
X = Evaluate("IF(ISNUMBER(MATCH(" & D & "," & _
.Range("A1:A15").Address & ",0)),""Jour férié"",""jour non férié"")")
End With
MsgBox X
End Sub
'-------------------------------------------


MichD
------------------------------------------
"Droopy191" a écrit dans le message de groupe de discussion : 4eb28f3d$0$24972$

Le 02/11/2011 18:08, MichD a écrit :
Bonjour,

Je ne suis pas sûr d'avoir compris ta question...




En fait je cherche à savoir si ma date est un jour férié.
J'ai un plage nommée qui contient les fériés francais. Je voudrais donc
savoir si ma date contenue dans C est une des dates de ma plage nommée.


--
DR
Avatar
Droopy191
Le 03/11/2011 15:46, MichD a écrit :
Bonjour,

Excel ne fait pas de miracle, tu dois avoir une liste de congés fériés définie dans ton classeur.




Certainement,
j'espérais trouver une méthode directe de vérifier si une valeur donnée
est présente dans une liste.

Admettons qu'en A1:A15, tu as la liste des dates fériées au format date reconnue par Excel.

Maintenant si tu veux savoir si la date en GS est un jour férié,

Tu utilises cette formule : =si(estnum(Equiv(G5;A1:A15;0));"Jour férié";"jour non férié")




J'utilisais cette formule dans la feuille
NB.SI(plage_féries;date_a_tester)=1


merci pour votre patience et vos pistes.

--
DR