Plage de recherche variable dans macro VBA
Tout d'abord, Bonjour à tous ceux qui passeront sur ce fil !
Je coince sérieusement sur une partie de ma macro...:(
J'ai 3 colonnes A, B et C
Ligne 1 les titres
Ligne 2 à N(N variable définie au début de ma macro) :
-Colonne A, des temps en seconde.
-Colonne B, des temps en seconde, qui sont initialement rangés par ordre croissant, MAIS quand la macro travaille ils ne sont plus rangés de la sorte.
-Colonne C, des entiers positifs
Ce que je voudrais faire, c'est définir un plage de cellule qui serait ma plage de recherche initiale ( toute la colonne B de la ligne 2 à N)
Ensuite faire une boucle de i=2 jusqu'à N qui :
Va chercher la plus petite des valeurs des cellules comprises dans la plage de recherche ET entre cellule(2,"B") et cellule (i,-1,"B")(Intersection), par exemple cellule (j,"B")
Si la valeur de la cellule (i,"A") est > à la valeur de la cellule (j,"B"), alors la valeur de la cellule (i,"C") prend la valeur de la cellule (j,"C") ET la cellule (j,"B") est éliminée de la plage de recherche. C'est à dire qu'au i suivant, elle ne sera pas prise en compte lors de la recherche de la plus petite des valeurs.
Sinon la cellule (i,"C") prend la valeur de la cellule (i-1,"C") + 1.
Dans l'idée, je voudrais faire quelque chose du genre :
Code:
maplage=Range(Cells(2,"B"),Cells(N,"B"))
Et dans la boucle, redéfinir maplage à chaque fois que nécessaire
Code:
maplage= maplage - Range (Cells(j,"B")
Il n'est apparemment pas possible de faire de telles opérations sur les Range, mais si quelqu'un a une idée je suis preneur !
Merci.
CampaSC
Excel VBA WorksheetFunction.Min(rngTime)
Bonjour CampaSC,
1. Min d'un Range
Mine de rien, Excel propose en standard la fonction WorksheetFunction.Min() d'un Range.
Cliquez dans le VBE menu "Insérer" > "Module".
Dans la fenêtre d'édition du module, copier-coller et compléter avec des noms à vous et commentaires la définition des constantes suivantes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Option Explicit
Public Const rowTitle = 1
Public Const rowTitle1 = rowTitle + 1
Public Const rowTitleMax = 50
Public Const colTime = 1 ' temps en seconde
Public Const colSecSort = colTime + 1 ' temps en seconde trié
Public Const colInt = colSecSort + 1 ' des entiers positifs. Qu'est-ce qu'ils représentent ?
Function PlageMin(ByVal indRow As Integer) As Integer
Dim rngTime As Range
Set rngTime = Range(Cells(rowTitle1, colSecSort), Cells(indRow, colSecSort))
PlageMin = WorksheetFunction.Min(rngTime)
End Function
Sub PlageInit()
Dim indRow As Integer
For indRow = rowTitle1 To rowTitleMax
Cells(indRow, colSecSort) = CInt(Rnd(100) * 100) ' Valeur aléatoire
Next
End Sub |
Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
Code:
? PlageMin(rowTitleMax)
2
Si la plus petite valeur est 2 dans les lignes rowTitle1 à rowTitleMax, colonne colSecSort.
Dans une feuille de calcul vide, on peut optionnellement initialiser la 2eme colonne avec :
qui génère 50 valeurs aléatoire entre 0 et 100 dans les lignes rowTitle1 à rowTitleMax, colonne colSecSort.
_____________
2. Postez votre code VBA
Entre les balises [CODE] et [/CODE] postez votre tentative de code VBA que vous pouvez bien évidemment commenté plutôt que de décrire du pseudo-code avec une syntaxe étrange telle que le tableau de cellule à trois ou quatre dimensions :
Citation:
Envoyé par
CampaSC
cellule (i,-1,"B")(Intersection),
Car la 1ere série de trois indices entre parenthèse est collée avec l'ouverture d'une nouvelle parenthèse introduisant l'index Intersection.
J'ai récemment utilisé la syntaxe d'Array d'Array dans 1. Initialisation d'une barre d'outils avec Excel VBA
_____________
3. Basculez en module de référence de colonne numérique
Cliquez sur l'Excel menu "Outils" > "Options" onglet "Général"
[x] R1C1 reference style
Cette option vous permettra de convertir les lettres de colonne en position numérique dans l'alphabet. Vous pourrez ainsi réécrire :
Code:
maplage=Range(Cells(2,"B"),Cells(N,"B"))
Par :
Code:
1 2 3
| Dim rngTime As Range
Set rngTime = Range(Cells(rowTitle1, colSecSort), Cells(rowTitleMax, colSecSort)) |
Voir la Function PlageMin().
_____________
4. Opération sur les Range
Remplacez la soustraction de Range :
Code:
maplage= maplage - Range (Cells(j,"B"),...)
par une opération arithmétique au niveau de leurs indices de rangée et de colonne ou une Union de Range comme suggéré par oOVaveOo.