Variable en input

Je suis un nouvel user de VBA pour Excel (2013), et j'ai été confronté à un problème pendant un bon moment.

Je veux créer une fonction qui, parmi les autres variables d'input que l'user doit fournir, a plusieurs gammes de cellules, qui devraient être variables et "facilement sélectionnables" par l'user lui-même. Il devrait être quelque chose comme (par exemple) la formule Excel "SUM", où vous pouvez entrer plusieurs plages telles que "A1: C1, F1: H1, …", en les sélectionnant avec votre souris.

En outre, je dois transférer les valeurs sélectionnées par l'user dans un tableau 2D. Toute gamme sélectionnée par l'user doit devenir une rangée de mon tableau 2D.

En plus de ce que j'ai dit jusqu'à présent, le nombre de gammes que les inputs d'user devrait être n'importe qui, et seul le premier devrait être obligatoire.

Compte tenu de la «structure» de ma feuille de calcul, toutes datatables que l'user doit sélectionner sont disposées en rangées. (Cela fait-il une différence s'ils sont organisés en rangées ou en colonnes?)

Veuillez noter que je ne devrais pas utiliser la "Boîte de saisie", car elle ralentit beaucoup la procédure lorsque je "traine vers le bas" une ligne pour appliquer la formule à plusieurs lignes en dessous de celle active.

Ci-dessous, je signale les seules parties du code que j'ai pu écrire (pas beaucoup …)

Function Trial_Version(MyRange1 As Range, MyRange2 As Range, MyRange3 As Range) As Double ''' The number of ranges that the user is be able to input '''should be anyone. Only the first Range should be mandatory Dim TotalArray()() As Double '''The user should be able to input as many "sub-arrays" as they want, '''so I do not know how many parentheses to write TotalArray = (MyRange1)(MyRange2) '''here, the same problem as the previous line RANGE_TO_ARRAY = TotalArray '''This is the output of my function End Function 

Merci beaucoup d'avance, Orlando

Pas la réponse complète, mais j'espère que vous vous diriez dans la bonne direction.

  • Un object Range standard peut déjà contenir plusieurs «zones» (par ex. C5: D9, G9: H16, B14: D18). Vous pouvez passer à travers ceux-ci en utilisant la propriété .Areas.

  • Vous pouvez facilement get un tableau 2D de valeurs à partir d'un object Range en utilisant une variable Variant (par exemple, Dim a as Variant, a = SomeRange). Toutefois, si plusieurs zones sont sélectionnées, cette méthode n'obtiendra que la première zone, de sorte que vous devrez faire une boucle dans chaque zone pour get toutes les valeurs.

  • Le code ci-dessous nécessite une validation ajoutée, plus éventuellement la gestion de tous les décalages colonne / ligne (c.-à-d., Voir le commentaire en boucle liée aux index).

 Fonction publique ProcessRange (ByRef rng As Range) 

'# PURPOSE: Process multi-area range Dim rngArea As Range ' Single area in multi-area selection Dim lngCol As Long ' Column in selected range(area), 1 based Dim lngRow As Long ' Row in selected range(area), 1 based Dim avarValues As Variant ' 2D variant array for range(area) values, 1 based ' --> Add validation here <-- ' Go through each area in selected range ' -------------------------------------- For Each rngArea In rng.Areas ' Store the values into 2d array (Row, Column), 1 based avarValues = rngArea ' Show each value held in the array For lngRow = 1 To UBound(avarValues, 1) For lngCol = 1 To UBound(avarValues, 2) ' Note row / column index is NOT necessarily the same as the row/column on the worksheet ' Index 1 will be the first cell in the selected area Debug.Print "Area " + rngArea.Address + ", value in AREA row " & lngRow & ", column " & lngCol & ": " & avarValues(lngRow, lngCol) Next lngCol Next lngRow Next rng End Function