[VBA Outlook 2010] Array zonder lege rijen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Anand
  • Registratie: Februari 2001
  • Laatst online: 20-01 08:05

Anand

Thank you, come again!

Topicstarter
Ik vul een Array vanuit een Excel-bestand. Sommige rijen hebben een enkele lege cel. De eerste kolom in de Array wordt gebruikt om ComboBoxen mee te bevolken. De zes andere kolommen bevatten returnwaarden.

De code die ik nu gebruik is:


Private Sub UserForm_Initialize()

Set xlApp = CreateObject("Excel.Application")
Set xlWB = xlApp.Workbooks.Open("Z:\informatie.xlsx")
Set xlWS = xlWB.Worksheets(1)

cfsData = xlWS.Range("A1:G100").Value

ComboBox1.List = cfsData

xlApp.Quit
Set xlWS = Nothing
Set xlWB = Nothing
Set xlApp = Nothing

End Sub


Het probleem met deze code is dat er bij minder dan 100 rijen, lege plaatsen ontstaan in de ComboBox.

Omdat het aantal rijen kan veranderen, heb ik een dynamische inleesmogelijkheid nodig. Ik zoek naar een manier om een Array te vullen vanuit het Excel-bestand, waarbij rekening wordt gehouden met het wisseldende aantal rijen. Zonder dat daarmee rijen die enkele lege cellen hebben, in het gevaar komen.

Dus ofwel worden de lege rijen gedropt wanneer ik de Array vul, ofwel wanneer ik de ComboBox vul. Nu is er in Excel iets wat UsedRange heet, maar dat is niet beschikbaar binnen Outlook.

Tweakers, uw gedachten in de vrije loop graag :)

Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:47
Via [google=vba array remove empty entries] kom je op Remove blank entries from an array loaded by a range. Hierin is de methodiek om van een array met lege waarden een array zonder lege waarden te maken vrij concreet uitgelegd.

Hierbij worden dus ook tussenliggende lege waarden verwijderd.

Je hebt het over UsedRange in Excel maar waarom zou die in Outlook niet beschikbaar zijn? Je hebt immers al een referentie naar de worksheet, dus xlWS.UsedRange zou in principe al moeten werken. Ook kun je een referentie naar de Excel-bibliotheek leggen waarna je gebruik kan maken van intellisense.

Alleen zou ik deze functie niet gebruiken omdat 1) dit een worksheet property is (en niet binnen de kolom kijkt) en de resultaten m.i. nogal onbetrouwbaar zijn na row/column inserts/deletions.

Kom je niet verder met het voorbeeld dat ik je geef, zou je dan aan kunnen geven wat je hebt geprobeerd en waar je vastloopt.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Anand
  • Registratie: Februari 2001
  • Laatst online: 20-01 08:05

Anand

Thank you, come again!

Topicstarter
Dank je wel voor je snelle antwoord en het meedenken!

Toen ik zelf aan het googelen was, sloeg ik oplossingen voor 1D arrays over. Iets met aannames...

Je hebt me wel de tip gegeven; ik bleek UsedRange verkeerd te gebruiken:

xlWS.UsedRange("A1:G100").Value

Dat is nu zonder ("A1:G100") geworden, en werkt. De tussenliggende lege cellen heb ik "nvt" of "niet gedeeld" gemaakt, waardoor UsedRange een prima oplossing is.

Bedankt, ik kan weer verder!

[ Voor 0% gewijzigd door Anand op 10-08-2015 09:00 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:47
Zit inmiddels in Excel en UsedRange lijkt inderdaad te doen wat het belooft.

Mocht je je selectie willen beperken tot A1:G100 dan kun je ook de functie Intersect gebruiken:

Visual Basic .NET:
1
2
3
4
5
6
Dim ws As Worksheet
Set ws = Me.ActiveSheet

ws.UsedRange.Select ' Selects entire used range

Intersect(Range("A1:G100"), ws.UsedRange).Select ' Selects used range between A1 and G100

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Anand
  • Registratie: Februari 2001
  • Laatst online: 20-01 08:05

Anand

Thank you, come again!

Topicstarter
Dus Range("A1:G100") en .UsedRange gaan samen via Intersect.

Heel goed om te weten, bedankt!