• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

functie van haakjes rond een array

Status
Niet open voor verdere reacties.

cow18

Terugkerende gebruiker
Lid geworden
24 mei 2008
Berichten
4.276
Besturingssysteem
Windows
Office versie
Excel365
ik zt eventjes te knoeien om een array aan te maken om de duplicates te verwijderen in een array en het wilde maar niet lukken.
Toen vond ik deze macro, waarbij er een array cols wordt aangemaakt en in de Removeduplicates-regel wordt die dan tussen haakjes geplaatst.
Dat bleek de clue te zijn, maar waarom ? Wat gebeurt er dan eigenlijk intern ?

Code:
Sub DeDupeCols() 'Excel VBA to remove duplicates from all columns
Dim rng As Range
Dim cols As Variant
Dim i As Integer

Set rng=[A1].CurrentRegion
ReDim cols(0 To rng.Columns.Count - 1)
For i=0 To UBound(cols) 'Loop for all columns
cols(i)=i + 1
Next i

rng.RemoveDuplicates Columns:=(cols), Header:=xlYes
End Sub
 
Als je alle kolommen wil gebruiken is jouw code overbodig, omdat dat de default van removeduplicates is:

Code:
Sub M_snb()
  [A1].currentregion.RemoveDuplicates ,1
End Sub
Het vreemde is, dat removeduplicates wel erg kieskeurig is.
Bij mij werkt alleen de variant met Array(1,2,3)
De versies die ik geprobeerd heb, maar niet werken, heb ik 'uitgekommentaard'.

Code:
Sub M_DeDupeCols()
   sn = Evaluate("transpose(row(1:" & [A1].CurrentRegion.Columns.Count & "))")
   MsgBox Join(sn, vbLf)

'   [A1].CurrentRegion.RemoveDuplicates sn, 1

   [A1].CurrentRegion.RemoveDuplicates Array(1, 2, 3), 1
   
'   [A1].CurrentRegion.RemoveDuplicates Split("1 2 3"), 1
   sn = Split("1 2 3")
'   [A1].CurrentRegion.RemoveDuplicates sn, 1
End Sub
 
Het veroorzaakt een "evaluate". Probeer deze code maar eens:
Code:
Sub TestHaakjes()
    Dim rng As Range
    Set rng = Range("A1")
    TestHaakjes2 rng
    TestHaakjes2 (rng)
End Sub
Sub TestHaakjes2(arg As Variant)
    MsgBox TypeName(arg)
End Sub
 
@snb: split werkt niet omdat het een array van string waarden geeft.
 
@jkp

Array("1","2","3") werkt wel.
 
@SNB, dat kieskeurige, dat was ook mijn probleem en ik had ook alle variaties op jouw voorbeelden ook al de revue laten passeren, met dezelfde conclusies, dus het waren die haakjes die het op een onverklaarbare reden, die nu een evaluate blijkt te zijn, deed.

@JKPieterse, maar een variant blijft een variant na die evaluate, toch gek.
Code:
Sub TestHaakjes()
     Dim rng   As Range
     Set rng = Range("A1")
     TestHaakjes2 rng
     TestHaakjes2 (rng)
     
     
     Dim arr(10)     'base 0!
     For i = 0 To 10: arr(i) = i + 1: Next
     TestHaakjes2 arr
     TestHaakjes2 (arr)
     
End Sub
Sub TestHaakjes2(arg As Variant)
     MsgBox TypeName(arg)
End Sub
 
gek, doe je het buiten de regel dan werkt het ook niet
Code:
     ReDim Cols(UBound(aE, 2))
               For i = 0 To UBound(Cols): Cols(i) = i + 1: Next i
               Cols1 = (Cols)
               LO.DataBodyRange.RemoveDuplicates Columns:=Cols1, Header:=xlNo     'supprimer les doublons
 
Deze heb ik een keer precies zo opgelost op een Duits forum met:
Code:
Sub hsv()
Dim x
 With Cells(1).CurrentRegion
    x = Evaluate("transpose(row(1:" & .Columns.Count & "))")
    ReDim Preserve x(0 To UBound(x) - 1)
   .RemoveDuplicates (x), xlYes
 End With
End Sub
 

Bijlagen

  • array.xlsb
    14,5 KB · Weergaven: 11
@HSV, mooi gebruik van die redim !!!
ik wist niet dat je de LBound van de laatste dimension ook zo kon aanpakken !
 
my 2 cents:
In tegenstelling tot Split("1 2 3") blijven Array(1, 2, 3) & Array("1", "2", "3") zero-based arrays waarbij de afzonderlijke items variant blijven (subtype in dit geval integer/ string)
Hieronder maak ik van die split middels een index en een redim een zero based array met afzonderlijke variant types ==> a
dit is het enige verschil met ==> d welke automatisch String meekrijgt voor de afzonderlijke items

Code:
Sub testing()
Dim a As Variant
Dim d As Variant
a = Application.Index(Split("1 2 3"), 0, 0)
d = Split("1 2 3")
ReDim Preserve a(0 To 2)
' [A1].CurrentRegion.RemoveDuplicates (d), 1
  [A1].CurrentRegion.RemoveDuplicates (a), 1
End Sub
 
Zo heb ik het geleerd:

VBA onderscheidt 2 soorten variabelen:
1. een Array variabele: de variable is een Array
2. een Variant variabele die een Array kan bevatten: de variabele bevat een Array

Ik vermoed dat Removeduplicates alleen een Arrayvariable accepteert.
Wat de achtergrond voor de haakjes is blijft echter een raadsel en lijkt me ook overbodig.

Een Array-variabele moet altijd als zodanig gedeclareerd zijn.
Een Variantvariabele die een Array kan bevatten hoeft niet gedeclareerd te zijn.

Array-variabele
Als je een Arrayvariabele declareert kun je aangeven welke soort gegevens (string, integer, long, date, object) de array moet bevatten.
Het is niet mogelijk een anderssoortig gegeven in zo'n Array te zetten dan aangegeven bij de declaratie.
Het karakter van de Arrayvariabele (vartype, typename, Isarray) wijzigt niet door de waarden die in de Array terechtkomen.
Als je het gegevenstype voor de Arrayvariable niet declareert kun je waarden aan de Array toewijzen met de methode Array(x,y,z). Met de methode Split("a...z") kun je geen waarden aan een Arrayvariabele toewijzen.

Variantvariabele
Een Variantvariable die een Array bevat kan van karakter veranderen.
De vartype Kan van 'Variant()' in 'String()' wijzigen: bijv. met de split opdracht.

Ieder element van de Array in de variantvariabele kun je onbeperkt wijzigen: een datum, een long, een object, een array. De elementen in zo'n Array kunnen qua soort volledig uiteenlopen.

Om het een en ander te illustreren

Code:
Sub M_snb()
   Dim sn, sp()
  
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn)
   MsgBox TypeName(sp) & vbTab & VarType(sp) & vbTab & IsArray(sp)
   sn = Array(1, 2, 3)
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn) & vbTab & UBound(sn)
   sn = Split("1 2 3")
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn) & vbTab & UBound(sn)
   sn = Array(Date, Date + 10, Date - 1)
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn) & vbTab & UBound(sn)
   sn = Array(12, Range("A1:D10").Value, 8899098)
   x3 = UBound(sn(1))
   
   ReDim Preserve sn(12)
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn) & vbTab & UBound(sn) & vbTab & Join(sn, "_")
   Erase sn
   MsgBox TypeName(sn) & vbTab & VarType(sn) & vbTab & IsArray(sn)

   sp = Array(1, 2, 3)
   MsgBox TypeName(sp) & vbTab & VarType(sp) & vbTab & IsArray(sp) & vbTab & UBound(sp)
   
'   sp = Split("1 2 3")
   ReDim sp(12)
   sp(0) = "1"
   sp(1) = "2"
   sp(3) = "3"
   MsgBox TypeName(sp) & vbTab & VarType(sp) & vbTab & IsArray(sp) & vbTab & UBound(sp)
   ReDim Preserve sp(6)
   sp(0) = Date
   sp(1) = "snb"
   sp(3) = 26
   MsgBox TypeName(sp) & vbTab & VarType(sp) & vbTab & IsArray(sp) & vbTab & UBound(sp) & vbTab & Join(sp, "_")
   Erase sp
   MsgBox TypeName(sp) & vbTab & VarType(sp) & vbTab & IsArray(sp)
 End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan