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

VBA : inscrire date dans x cellules selectionnées aleatoirement...

14 réponses
Avatar
Domi
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides de la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la chose
sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi

10 réponses

1 2
Avatar
Domi
Merci Joel...
Mais là moi non plus je comprends pas bien.
Je vais tout de même essayer d'expliquer mon but.
Dans la colonne A (A10: A1000), il y a des noms. Je veux chaque semaine
éditer une liste de 150 noms tirés au hasard, en conservant une trace du
jour de tirage...(d'où la date dans la colonne B..., d'où les 150...) Chaque
nom ne doit être tiré qu'un fois... d'où la sélection d'une cellule vide
(n'ayant pas fais l'objet d'un précédent tirage.
En espérant avoir éclairci un peu ma chose ;o)

Domi

"Joel" a écrit dans le message de
news:cdh5c6$f7u$
Bonsoir Domi,

comme je ne vois pas trop l'objectif de la première partie de la question,
voici un axe de recherche pour la seconde partie :

Range("B10:B1000").SpecialCells(xlCellTypeBlanks)

--

Bien cordialement,

Joël GARBE
www.joelgarbe.fr
"Domi" a écrit dans le message de
news:ux%
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de


la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi








Avatar
Michel Gaboly
Bonsoir,

Voici une base de départ :

Sub DatesAlea()
Dim Ref As Range, NbCellVides As Long, c As Range, Debut As Range, Delta As Long, i As Integer
Set Ref = Range("Plage")
NbCellVides = Evaluate("SUMPRODUCT(ISBLANK(Plage) * 1)")
If NbCellVides <= 150 Then
For Each c In Ref
If IsEmpty(c) Then c = Date
Next c
Else
Set Debut = Range("B" & Ref.Row)
Delta = Ref.Rows.Count - 1
Randomize ' Initialisation du générateur de nombres au hasard
Do
Set c = Debut.Offset(Delta * Rnd)
If IsEmpty(c) Then
c = Date
' c.Select
i = i + 1
End If
Loop Until i = 150
End If
End Sub

Il faut que la plage concernée (ici B10:B1000) ait été nommée "Plage".

NbCellVides permet de déterminer si le nombre de cellules vides est
inférieur ou non à 150. Si oui, la date est inscrite dans toutes les cellules
vides de "Plage".

Sinon, une succession de tirages au hasard permet de déterminer 150
cellules vides dans la plage, dans lesquelles on entre la date.

NB - Pour simplifier j'ai considéré que la plage concernée est toujours
en colonne B (définition de Début).



Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides de la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la chose
sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi


--
Cordialement,

Michel Gaboly
http://www.gaboly.com

Avatar
garnote
Salut Domi,

Un essai sur une plage plus modeste :

Sub Remplir_De_Dates_Par_Paquet_De_10()
Set ici = Range("A1:H20")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
NL = ici.Rows.Count
NC = ici.Columns.Count
n = 0
Do Until n = 10
ligne = Int(NL * Rnd + 1)
colonne = Int(NC * Rnd + 1)
If ici(ligne, colonne) = "" Then
ici(ligne, colonne) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Cela fait-il sens ? :-)

Serge


"Domi" a écrit dans le message de
news:ux%
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides de
la

plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la chose
sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi




Avatar
Domi
J'ai testé les deux propositions, qui semblent fonctionner parfaitement bien
(après une petite adaptation pour celle de serge).
Impec ;o)
Merci à tous deux.
Domi

"garnote" a écrit dans le message de
news:NKVKc.78245$

Salut Domi,

Un essai sur une plage plus modeste :

Sub Remplir_De_Dates_Par_Paquet_De_10()
Set ici = Range("A1:H20")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
NL = ici.Rows.Count
NC = ici.Columns.Count
n = 0
Do Until n = 10
ligne = Int(NL * Rnd + 1)
colonne = Int(NC * Rnd + 1)
If ici(ligne, colonne) = "" Then
ici(ligne, colonne) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Cela fait-il sens ? :-)

Serge


"Domi" a écrit dans le message de
news:ux%
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de


la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi








Avatar
garnote
Salut Domi,

Par curiosité, c'est quoi ta petite adaptation ?
Yé veux sawoir :-)

Serge

"Domi" a écrit dans le message de
news:ewPn%
J'ai testé les deux propositions, qui semblent fonctionner parfaitement
bien

(après une petite adaptation pour celle de serge).
Impec ;o)
Merci à tous deux.
Domi

"garnote" a écrit dans le message de
news:NKVKc.78245$

Salut Domi,

Un essai sur une plage plus modeste :

Sub Remplir_De_Dates_Par_Paquet_De_10()
Set ici = Range("A1:H20")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
NL = ici.Rows.Count
NC = ici.Columns.Count
n = 0
Do Until n = 10
ligne = Int(NL * Rnd + 1)
colonne = Int(NC * Rnd + 1)
If ici(ligne, colonne) = "" Then
ici(ligne, colonne) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Cela fait-il sens ? :-)

Serge


"Domi" a écrit dans le message de
news:ux%
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de


la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas
150



cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi












Avatar
Michel Gaboly
De rien ;-))


J'ai testé les deux propositions, qui semblent fonctionner parfaitement bien
(après une petite adaptation pour celle de serge).
Impec ;o)
Merci à tous deux.
Domi

"garnote" a écrit dans le message de
news:NKVKc.78245$

Salut Domi,

Un essai sur une plage plus modeste :

Sub Remplir_De_Dates_Par_Paquet_De_10()
Set ici = Range("A1:H20")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
NL = ici.Rows.Count
NC = ici.Columns.Count
n = 0
Do Until n = 10
ligne = Int(NL * Rnd + 1)
colonne = Int(NC * Rnd + 1)
If ici(ligne, colonne) = "" Then
ici(ligne, colonne) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Cela fait-il sens ? :-)

Serge


"Domi" a écrit dans le message de
news:ux%
Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de


la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi








--
Cordialement,

Michel Gaboly
http://www.gaboly.com



Avatar
garnote
Salut Domi et Michel,

Question pour Michel :

IsEmpty(c) est-il toujours équivalent à c=""

Serge

Sub Remplir_De_Dates_Alea_Par_Paquet_De_150()
Dim ici As Range, n As Integer, L As Integer
Set ici = Range("B10:B1000")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
Do Until n = 150
L = Int(991 * Rnd + 1)
If ici(L, 1) = "" Then
ici(L, 1) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Serge
"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Voici une base de départ :

Sub DatesAlea()
Dim Ref As Range, NbCellVides As Long, c As Range, Debut As Range, Delta
As Long, i As Integer

Set Ref = Range("Plage")
NbCellVides = Evaluate("SUMPRODUCT(ISBLANK(Plage) * 1)")
If NbCellVides <= 150 Then
For Each c In Ref
If IsEmpty(c) Then c = Date
Next c
Else
Set Debut = Range("B" & Ref.Row)
Delta = Ref.Rows.Count - 1
Randomize ' Initialisation du générateur de nombres au hasard
Do
Set c = Debut.Offset(Delta * Rnd)
If IsEmpty(c) Then
c = Date
' c.Select
i = i + 1
End If
Loop Until i = 150
End If
End Sub

Il faut que la plage concernée (ici B10:B1000) ait été nommée "Plage".

NbCellVides permet de déterminer si le nombre de cellules vides est
inférieur ou non à 150. Si oui, la date est inscrite dans toutes les
cellules

vides de "Plage".

Sinon, une succession de tirages au hasard permet de déterminer 150
cellules vides dans la plage, dans lesquelles on entre la date.

NB - Pour simplifier j'ai considéré que la plage concernée est toujours
en colonne B (définition de Début).



Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de la


plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Michel Gaboly
Re,

Si c est une cellule, oui.


Cependant IsEmpty est d'usage plus général : IsEmpty(Var) renvoie
True, si Var est une variable non encore initialisée, OU si Var est
égal à une chaine vide dans un contexte de chaîne, OU si Var est égal
à 0 dans un contexte numérique.

Attention toutefois, IsEmpty() ne renvoie une info pertinente que
pour les variables de type Variant, comme tu peux le voir avec
cette procédure, où aucune des 2 variables Var et Num n’est
initialisée, mais où IsEmpty(Var) renvoie True, alors que
IsEmpty(Num) renvoie False :

Sub Toto()
Dim Var As Variant, Num As Integer
MsgBox IsEmpty(Var) & vbNewLine & IsEmpty(Num)
End Sub
.


Salut Domi et Michel,

Question pour Michel :

IsEmpty(c) est-il toujours équivalent à c=""

Serge

Sub Remplir_De_Dates_Alea_Par_Paquet_De_150()
Dim ici As Range, n As Integer, L As Integer
Set ici = Range("B10:B1000")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
Do Until n = 150
L = Int(991 * Rnd + 1)
If ici(L, 1) = "" Then
ici(L, 1) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Serge
"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Voici une base de départ :

Sub DatesAlea()
Dim Ref As Range, NbCellVides As Long, c As Range, Debut As Range, Delta
As Long, i As Integer

Set Ref = Range("Plage")
NbCellVides = Evaluate("SUMPRODUCT(ISBLANK(Plage) * 1)")
If NbCellVides <= 150 Then
For Each c In Ref
If IsEmpty(c) Then c = Date
Next c
Else
Set Debut = Range("B" & Ref.Row)
Delta = Ref.Rows.Count - 1
Randomize ' Initialisation du générateur de nombres au hasard
Do
Set c = Debut.Offset(Delta * Rnd)
If IsEmpty(c) Then
c = Date
' c.Select
i = i + 1
End If
Loop Until i = 150
End If
End Sub

Il faut que la plage concernée (ici B10:B1000) ait été nommée "Plage".

NbCellVides permet de déterminer si le nombre de cellules vides est
inférieur ou non à 150. Si oui, la date est inscrite dans toutes les
cellules

vides de "Plage".

Sinon, une succession de tirages au hasard permet de déterminer 150
cellules vides dans la plage, dans lesquelles on entre la date.

NB - Pour simplifier j'ai considéré que la plage concernée est toujours
en colonne B (définition de Début).



Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de la


plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com



Avatar
Michel Gaboly
Serge,

Une précision :

IsEmpty(c) n’est pas équivalent à c="", mais à c.Formula = ""

Si tu entres dans une cellule, la formule ="", la cellule paraîtra vide,
mais isEmpty renverra False.

IsEmpty, pour une cellule correspond à la fonction Excel ESTVIDE().



Re,

Si c est une cellule, oui.

Cependant IsEmpty est d'usage plus général : IsEmpty(Var) renvoie
True, si Var est une variable non encore initialisée, OU si Var est
égal à une chaine vide dans un contexte de chaîne, OU si Var est égal
à 0 dans un contexte numérique.

Attention toutefois, IsEmpty() ne renvoie une info pertinente que
pour les variables de type Variant, comme tu peux le voir avec
cette procédure, où aucune des 2 variables Var et Num n’est
initialisée, mais où IsEmpty(Var) renvoie True, alors que
IsEmpty(Num) renvoie False :

Sub Toto()
Dim Var As Variant, Num As Integer
MsgBox IsEmpty(Var) & vbNewLine & IsEmpty(Num)
End Sub
.


Salut Domi et Michel,

Question pour Michel :

IsEmpty(c) est-il toujours équivalent à c=""

Serge

Sub Remplir_De_Dates_Alea_Par_Paquet_De_150()
Dim ici As Range, n As Integer, L As Integer
Set ici = Range("B10:B1000")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
Do Until n = 150
L = Int(991 * Rnd + 1)
If ici(L, 1) = "" Then
ici(L, 1) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Serge
"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Voici une base de départ :

Sub DatesAlea()
Dim Ref As Range, NbCellVides As Long, c As Range, Debut As Range, Delta
As Long, i As Integer

Set Ref = Range("Plage")
NbCellVides = Evaluate("SUMPRODUCT(ISBLANK(Plage) * 1)")
If NbCellVides <= 150 Then
For Each c In Ref
If IsEmpty(c) Then c = Date
Next c
Else
Set Debut = Range("B" & Ref.Row)
Delta = Ref.Rows.Count - 1
Randomize ' Initialisation du générateur de nombres au hasard
Do
Set c = Debut.Offset(Delta * Rnd)
If IsEmpty(c) Then
c = Date
' c.Select
i = i + 1
End If
Loop Until i = 150
End If
End Sub

Il faut que la plage concernée (ici B10:B1000) ait été nommée "Plage".

NbCellVides permet de déterminer si le nombre de cellules vides est
inférieur ou non à 150. Si oui, la date est inscrite dans toutes les
cellules

vides de "Plage".

Sinon, une succession de tirages au hasard permet de déterminer 150
cellules vides dans la plage, dans lesquelles on entre la date.

NB - Pour simplifier j'ai considéré que la plage concernée est toujours
en colonne B (définition de Début).



Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules vides
de la


plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler la
chose


sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste pas 150
cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


--
Cordialement,

Michel Gaboly
http://www.gaboly.com




Avatar
garnote
Me semblait aussi que tes explications
manquaient de précisions précises :-)))

Serge

"Michel Gaboly" a écrit dans le message de
news:
Serge,

Une précision :

IsEmpty(c) n'est pas équivalent à c="", mais à c.Formula = ""

Si tu entres dans une cellule, la formule ="", la cellule paraîtra vide,
mais isEmpty renverra False.

IsEmpty, pour une cellule correspond à la fonction Excel ESTVIDE().



Re,

Si c est une cellule, oui.

Cependant IsEmpty est d'usage plus général : IsEmpty(Var) renvoie
True, si Var est une variable non encore initialisée, OU si Var est
égal à une chaine vide dans un contexte de chaîne, OU si Var est égal
à 0 dans un contexte numérique.

Attention toutefois, IsEmpty() ne renvoie une info pertinente que
pour les variables de type Variant, comme tu peux le voir avec
cette procédure, où aucune des 2 variables Var et Num n'est
initialisée, mais où IsEmpty(Var) renvoie True, alors que
IsEmpty(Num) renvoie False :

Sub Toto()
Dim Var As Variant, Num As Integer
MsgBox IsEmpty(Var) & vbNewLine & IsEmpty(Num)
End Sub
.


Salut Domi et Michel,

Question pour Michel :

IsEmpty(c) est-il toujours équivalent à c=""

Serge

Sub Remplir_De_Dates_Alea_Par_Paquet_De_150()
Dim ici As Range, n As Integer, L As Integer
Set ici = Range("B10:B1000")
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
Do Until n = 150
L = Int(991 * Rnd + 1)
If ici(L, 1) = "" Then
ici(L, 1) = Date
n = n + 1
If WorksheetFunction.CountIf(ici, "") = 0 Then Exit Sub
End If
Loop
End Sub

Serge
"Michel Gaboly" a écrit dans le message de
news:
Bonsoir,

Voici une base de départ :

Sub DatesAlea()
Dim Ref As Range, NbCellVides As Long, c As Range, Debut As Range,
Delta




As Long, i As Integer
Set Ref = Range("Plage")
NbCellVides = Evaluate("SUMPRODUCT(ISBLANK(Plage) * 1)")
If NbCellVides <= 150 Then
For Each c In Ref
If IsEmpty(c) Then c = Date
Next c
Else
Set Debut = Range("B" & Ref.Row)
Delta = Ref.Rows.Count - 1
Randomize ' Initialisation du générateur de nombres au
hasard




Do
Set c = Debut.Offset(Delta * Rnd)
If IsEmpty(c) Then
c = Date
' c.Select
i = i + 1
End If
Loop Until i = 150
End If
End Sub

Il faut que la plage concernée (ici B10:B1000) ait été nommée
"Plage".





NbCellVides permet de déterminer si le nombre de cellules vides est
inférieur ou non à 150. Si oui, la date est inscrite dans toutes les
cellules

vides de "Plage".

Sinon, une succession de tirages au hasard permet de déterminer 150
cellules vides dans la plage, dans lesquelles on entre la date.

NB - Pour simplifier j'ai considéré que la plage concernée est
toujours




en colonne B (définition de Début).



Bonsoir à tous,

Big pb... (au moins pour moi ! )
L'énoncé est simple... la solution l'est moins me semble-t-il...
Je voudrais, par VBA, inscrire la date du jour dans 150 cellules
vides





de la
plage B10:B1000.
J'insiste sur le "vides", car le but serait ensuite de renouveler
la





chose
sur la plage jusqu'à ce que toute la plage soit sélectionnée.
Cela me permet de soulever dès maintenant le cas ou il ne reste
pas 150





cellules vides...il faudrait que cela sélectionne ce qui reste...

Merci
Domi


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


--
Cordialement,

Michel Gaboly
http://www.gaboly.com








1 2