Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

reconstituer une base par alea

OlivGM

XLDnaute Occasionnel
Bonjour,

J'ai une base et en face la même base comportant des "trous" , je voudrais, par un code VBA, remplir ces cellules vides aléatoirement avec les nombres manquant .

je joins un exemple.

merci de votre aide.
 

Pièces jointes

  • Classeur15.xlsx
    11.2 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Bonsoir OlivGM, Pierre,

Pour obtenir un remplissage aléatoire :

Code:
Sub RemplissageAleatoire()
Dim ncol%, P1 As Range, P2 As Range, c As Range
Dim lig1 As Range, lig2 As Range, cible
ncol = 5 'à adapter
Set P1 = [A:A].Resize(, ncol) 'à adapter
Set P2 = [G:G].Resize(, ncol) 'à adapter
Application.ScreenUpdating = False
[Vides] = "" 'RAZ de la plage nommée
Randomize
For Each c In [Vides]
  Set lig1 = Intersect(c.EntireRow, P1)
  Set lig2 = Intersect(c.EntireRow, P2)
  Do
    cible = lig1(1, Int(Rnd * ncol) + 1)
  Loop While Application.CountIf(lig2, cible)
  c = cible
Next
End Sub
Fichier joint.

Bonne fin de soirée.
 

Pièces jointes

  • Remplissage aléatoire(1).xlsm
    22.3 KB · Affichages: 39
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : reconstituer une base par alea

Bonjour à tous,

Un autre essai. Le code est dans le module de Feuil1.

Edit: version v1a plus efficace.
 

Pièces jointes

  • OlivGM- reconstituer une base par alea- v1a.xlsm
    23.1 KB · Affichages: 30
Dernière édition:

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Bonjour OlivGM, Pierre, mapomme, le forum,

Ici le nom Vides est créé par la macro.

Bien sûr il faut au tout début que les cellules à remplir soient vides :

Code:
Sub RemplissageAleatoire()
Dim ncol%, P1 As Range, P2 As Range, c As Range
Dim lig1 As Range, lig2 As Range, cible
ncol = 5 'à adapter
Set P1 = [A1].CurrentRegion.Resize(, ncol) 'à adapter
Set P2 = [G1].Resize(P1.Rows.Count, ncol) 'à adapter
Application.ScreenUpdating = False
If IsError([Vides]) Then _
  P2.SpecialCells(xlCellTypeBlanks).Name = "Vides"
[Vides] = "" 'RAZ de la plage nommée
Randomize
For Each c In [Vides]
  Set lig1 = Intersect(c.EntireRow, P1)
  Set lig2 = Intersect(c.EntireRow, P2)
  Do
    cible = lig1(1, Int(Rnd * ncol) + 1)
  Loop While Application.CountIf(lig2, cible)
  c = cible
Next
End Sub
Fichier joint.

Nota : sur l'exemple la macro s'exécute en 3 millièmes de seconde.

J'ai regardé ce que cela donne en utilisant des tableaux VBA (matrices).

Avec le pourcentage de "trous" de l'exemple (12%) on ne gagne rien sur la durée d'exécution.

Ce serait sans doute différent avec un pourcentage plus élevé.

A+
 

Pièces jointes

  • Remplissage aléatoire(2).xlsm
    22.1 KB · Affichages: 28
Dernière édition:

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Re,

Dans ce fichier voici la macro avec des tableaux VBA (matrices) :

Code:
Sub RemplissageAleatoire()
Dim ncol%, P1 As Range, P2 As Range, t1, t2
Dim i&, j%, lig1, lig2, cible
ncol = 5 'à adapter
Set P1 = [A1].CurrentRegion.Resize(, ncol) 'à adapter
Set P2 = [G1].Resize(P1.Rows.Count, ncol) 'à adapter
Application.ScreenUpdating = False
If IsError([Vides]) Then _
  P2.SpecialCells(xlCellTypeBlanks).Name = "Vides"
[Vides] = "" 'RAZ de la plage nommée
t1 = P1: t2 = P2 'matrices, plus rapides
Randomize
For i = 1 To UBound(t1)
  For j = 1 To ncol
    If t2(i, j) = "" Then
      lig1 = Application.Index(t1, i, 0)
      lig2 = Application.Index(t2, i, 0)
      Do
        cible = lig1(Int(Rnd * ncol) + 1)
      Loop While IsNumeric(Application.Match(cible, lig2, 0))
      t2(i, j) = cible
    End If
Next j, i
P2 = t2 'restitution
End Sub
A+
 

Pièces jointes

  • Remplissage aléatoire par tableaux VBA(1).xlsm
    22.8 KB · Affichages: 27
Dernière édition:

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Re,

On aura sans doute remarqué qu'il est impossible de nommer une plage de plus de 150 (environ) cellules disjointes.

Dans ce cas il faut mémoriser tout le 2ème tableau dans une feuille de calcul.

Voyez les fichiers joints avec des tableaux de 10500 lignes (6000 cellules vides à remplir).

Et là surprise, grosse surprise chez moi (Win 8 - Excel 2013) :

- la méthode traitant les cellules une par une s'exécute en 1 seconde

- la méthode par tableaux VBA en 115 secondes !!!

Si Jacques BOISGONTIER passe par là il saura nous dire pourquoi...

A+
 

Pièces jointes

  • Remplissage aléatoire 10500 lignes(1).xlsm
    716.1 KB · Affichages: 28
  • Remplissage aléatoire par tableaux VBA 10500 lignes(1).xlsm
    715.9 KB · Affichages: 37

laetitia90

XLDnaute Barbatruc
Re : reconstituer une base par alea

bonjour OlivGM job pierrejean mapomme

peut être

Code:
Do
        cible = lig1(Int(Rnd * ncol) + 1)
      Loop While IsNumeric(Application.Match(cible, lig2, 0))

qui pose pb????

job as tu essaye avec un dico ???
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : reconstituer une base par alea

Bonsoir OlivGM , à tous,

Un fichier avec les deux méthodes de job75 (que je salue ), la méthode de pierrejean (que je salue aussi ) qui ne semble pas remplir aléatoirement les cellules vides (mais qui 'pulse') ainsi que celle de mapomme. Je salue aussi bien sûr laetitia90 .

A mon humble avis, ce sont les appels aux fonctions d'Excel qui ralentissent fortement le bouzin. La méthode avec tableaux y fait bien plus appel que la méthode sans tableau.

job75 : j'ai mis en commentaire la ligne de RAZ de P2 puisque l'initialisation des cellules se fait par les boutons et ajouté une gestion d'erreur au cas où aucune cellule ne serait vide.

Edit : avec la version très très rapide de job75 - v1b.
 

Pièces jointes

  • OlivGM- reconstituer une base par alea- v1b (10500 lig).xlsm
    808 KB · Affichages: 28
Dernière édition:

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Re,

Ce sont les fonctions Application.Index qui plombent ma solution par tableaux VBA.

Je vais tâcher d'y remédier.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : reconstituer une base par alea

Re,

Avec ce fichier (2) l'honneur des tableaux VBA est sauf, exécution en 0,20 seconde :

Code:
Sub RemplissageAleatoire()
Dim x, ncol%, P1 As Range, P2 As Range, t1, t2
Dim i&, j%, cible, flag As Boolean, k%
x = Timer
ncol = 5 'à adapter
Set P1 = [A1].CurrentRegion.Resize(, ncol) 'à adapter
Set P2 = [G1].Resize(P1.Rows.Count, ncol) 'à adapter
t1 = P1 'matrice, plus rapide
t2 = Feuil2.[A1].Resize(P2.Rows.Count, ncol) 'RAZ, rapide
Randomize
For i = 1 To UBound(t1)
  For j = 1 To ncol
    If t2(i, j) = "" Then
      Do
        cible = t1(i, Int(Rnd * ncol) + 1)
        flag = False
        For k = 1 To ncol
          If t2(i, k) = cible Then flag = True: Exit For
        Next
      Loop While flag
      t2(i, j) = cible
    End If
Next j, i
P2 = t2 'restitution
MsgBox "Durée " & Format(Timer - x, "0.00 \s")
End Sub
Edit : j'ai simplifié l'initialisation, ce qui fait gagner 7 centièmes de seconde.

A+
 

Pièces jointes

  • Remplissage aléatoire par tableaux VBA 10500 lignes(2).xlsm
    716.3 KB · Affichages: 25
Dernière édition:

Discussions similaires

Réponses
1
Affichages
276
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…