• 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.

ReDim Preserveble matrix van uit een dictionary benaderen kan dat?

Status
Niet open voor verdere reacties.

sylvester-ponte

Verenigingslid
Lid geworden
19 apr 2007
Berichten
6.620
ReDim Preserveble matrix van uit een dictionary benaderen kan dat?


voorbeeld:
in "test" probeer ik het met dictionary (de fout regel staat er als commentaar) haal het commentaar tekentje even weg om te testen
in "test2 staat het zonder dictionary" dat gaat wel
 

Bijlagen

Je kan de dictionary niet direct benaderen op die manier. Wel met een omweg. Volg de array van variabele c maar eens.

Code:
Sub test()
 Dim c
 Set d = CreateObject("scripting.dictionary")
 
 d("test") = Application.Transpose(Application.Transpose(Cells(1, 1).CurrentRegion))
 c = d("test")
 ReDim c(3): d("test") = c
 c = d("test")
End Sub
 
Code:
Sub test()Dim a
  Set d = CreateObject("scripting.dictionary")
  d("test") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Cells(1, 1).CurrentRegion))
  a = d("test")
   MsgBox a(UBound(a))
   MsgBox d("test")(4)
   MsgBox d(d.keys()(0))(3)
   MsgBox d.Item(d.keys()(0))(3)
 ReDim Preserve a(d("test")(2))
   MsgBox a(UBound(a))
 End Sub
 
Waarvoor denk je dit nodig te hebben ?
Alleen wat anders geschreven:

Code:
Sub M_snb()
  Dim a
  sn = Cells(1, 1).CurrentRegion.Resize(2)
   
  With CreateObject("scripting.dictionary")
    .Item("test") = Application.Index(sn, 1)
    MsgBox UBound(.Item("test"))
    MsgBox .Item("test")(4)
    MsgBox .Item(.keys()(0))(3)
   
    a = .Item("test")
    MsgBox a(UBound(a))
    ReDim Preserve a(.Item("test")(2))
  End With
   
  MsgBox a(UBound(a))   
 End Sub

PS. Gebruik geen 'worksheetfunction', dat geeft bij sommige funkties (bijv. Vlookup) onverklaarbare foutmeldingen.
Application.transpose is robuuster.
 
Laatst bewerkt:
Waarvoor denk je dit nodig te hebben ?
ik wil meerdere matrixen aan een dictionary koppelen.
eventueel wil ik deze kunnen vergroten. (anders moet ik ze op verdacht allemaal veel te groot maken)
om de een of andere rede moet ik doen wat JVeer heeft voorgesteld in post 2 . dat werkt .
ik hoopte nog dat er een mogelijkheid zo zijn, om het gelijk in de dictionary te doen.
hier nog even mijn probeersels.
Code:
Sub test()
  Set d = CreateObject("scripting.dictionary")
  d("test") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Cells(1, 1).CurrentRegion))
  c = d("test")(4)
  redim Preserve d("test")(5)  'dit werkt niet
End Sub
Sub test2()
  Dim A
  A = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Cells(1, 1).CurrentRegion))
  c = A(4)
  ReDim Preserve A(5)           'dit werkt wel
End Sub
Sub test werkt niet.
Sub test2 gaf mijn de hoop dat de Sub test misschien toch zou moeten werken.

Ps ik zal voortaan Application gebruiken.
 
Laatst bewerkt:
Ik dacht dat je er wel uit zou komen met het voorbeeld.

Code:
Sub test()
dim c
  Set d = CreateObject("scripting.dictionary")
  d("test") = application.Transpose(application.Transpose(Cells(1, 1).CurrentRegion))
  c = d("test")
  msgbox ubound(c)
    ReDim Preserve c(ubound(c) + 1) 
msgbox ubound(c)
End Sub
 
De zin ontgaat me nog steeds.
Natuurlijk kan het meteen:

Code:
Sub M_snb()
  sn = Cells(1, 1).CurrentRegion.Resize(2)
   
  With CreateObject("scripting.dictionary")
    .Item("test") = filter(Application.Index(sn, 1),"")
    MsgBox UBound(.Item("test"))

    .item("test")=array(.item("test")(0),.item("test")(1),.item("test")(2),.item("test")(3),"snb","hsv","jveer")
    MsgBox ubound(.Item("test"))
  End With
End Sub
 
Laatst bewerkt:
snb, grappig .
de bedoeling is niet dat er item voor item de oude items weer worden toegevoegd.

harry, die c is een kopie van de d("test")
als je c veranderd veranderd d("test") niet mee. zie voorbeeld. (harry sub)

ik denk dat ik de jveer sub ga gebruiken, maar ik zit er ook aan te denken om later een klasse module te maken die dit eenvoudig oplost.
 

Bijlagen

de bedoeling is niet dat er item voor item de oude items weer worden toegevoegd.

Dat hoeft met mijn methode toch ook helemaal niet, maar het simuleert ReDim Preserve.

Maar wat wil je dan met redim ?
ieder Ductionary item kun je vervangen met een (nieuwe) array; daar heb je geen redim voor nodig.

Een klasse in VBA kan nooit meer dan afzonderlijke VBA-Code (alleen een beetje code-efficiënter).
Dus daar kun je geen 'oplossing' vinden.

.
 
Laatst bewerkt:
Ik vind het prima, ik heb ook geen idee wat je met een lege matrix door de Redim van @JVeer wil.
 
Zet er preserve achter en je behoudt je matrix
 
Klopt helemaal, anders had ik het niet geschreven. ;)

Het verhaal is niet duidelijk.
Nog maar een poging.

Misschien zo
Code:
Sub test()
Dim c
Set d = CreateObject("scripting.dictionary")
  d.Item("test") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Cells(1, 1).CurrentRegion))
   c = d("test")
     ReDim Preserve c(UBound(c))
         For i = 1 To UBound(c) - 1
            c(i - 1) = d("test")(i)
         Next i
      c(UBound(c)) = "nieuw " & ubound(c)-3
   d("test") = c
 MsgBox Join(d("test"), vbLf)
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan