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

Per kolom een twee dimensionele array

Status
Niet open voor verdere reacties.

Jeroen1000

Gebruiker
Lid geworden
15 jan 2008
Berichten
40
Hallo iedereen,

Nu zou ik graag hetvolgende willen doen in Excel (en het liefst zelf uitzoeken, zo leer ik nog eens iets bij):

Ik zou graag per kolom (kolommen A tot F) een (twee dimensionele) array willen vullen met de cellen die een valuta bevallen. De cellen die géén valuta bevatten zullen de waarde 99999 krijgen (bv. lege cellen of cellen geformateerd als tekst of getal).

De array zou er dan zo uitzien: Array x [C][1] = 133. Array x [C][5]= 222. Stel dat cel C10 blanco is, dan zou Array x [C][10] = 99999 bevatten.

Daarna loop ik door de array (met bv een for loopje) check ik of de waarde 99999 is en pas ik op elk element dat NIET de waarde 99999 bevat een wiskundige bewerking toe. Daarna schrijf ik de gewijzigde Array (waarbij ik elementen met de waarde 99999 oversla) terug naar Excel.

Natuurlijk moet ik ook de lengte van gevulde Array kunnen bepalen. A - F is natuurlijk altijd 6. Maar het aantal rijen kan verschillen. Zie hier hoe mijn code in java er zou uitzien mbt een bewerking op een reeds gevult array:

bij de variabele i, staat i = 0 voor de (kolom)letter A, i = 1 voor de (kolom) letter B enzoverder...


Code:
For (int i = 0; i < 6; i++)  
 {
     for (int j =0; j < array.length; j++){
        
        if (array x [i][j] !=99999){
          
           array x[i][j] = array x[i][j] + 50;} (if lus afsluiten)
      
   } // eerste for afsluiten
 }  // tweede for afsluiten

Mijn probleem: ik ken de VBA syntax, objecten, en methodes niet. Googlen op VBA toturial en curussen bleek niet echt vruchtbaar. Wie weet bestaat een twee dimensionaal array wel in VBA:confused:

Kunnen jullie een goede, uitgebreide cursus aanraden die alles omvat?
 
Laatst bewerkt door een moderator:
Is niet zo moeilijk hoor. "De accolades hoeven niet in VBA, en ook geen puntkomma's.
Accolades (einde van een groep code) geef je aan via "end loop", "end if", "next ..." etc. Arrays geef je aan via haakjes: array(i,j)
Code:
Dim x(0 to 100, 0 to 1) as long 'voor alleen gehele getallen...
Dim i as integer

For i = 0 to ubound(x,1)
   for j  = 0 to ubound(x,2)
      If x(i,j) <> 99999 Then
         array x(i,j) = x(i,j) + 50
      endif
   next j
next i
 
Is niet zo moeilijk hoor. "De accolades hoeven niet in VBA, en ook geen puntkomma's.
Accolades (einde van een groep code) geef je aan via "end loop", "end if", "next ..." etc. Arrays geef je aan via haakjes: array(i,j)
Code:
Dim x(0 to 100, 0 to 1) as long 'voor alleen gehele getallen...
Dim i as integer

For i = 0 to ubound(x,1)
   for j  = 0 to ubound(x,2)
      If x(i,j) <> 99999 Then
         array x(i,j) = x(i,j) + 50
      endif
   next j
next i

Het is vast erg soortgelijk (bijna al die programmeertoestanden) maar ik wist bv als niet dat dim een variabele declaratie was. != is blijkbaar <>:D. Maar hoe ben jij er bv achtergekomen hoe je cellen moet kopieren naar een array? Ik vind amper deftige VBA & Excel tutorials via google. Of ik zoek op de foute plek. :-)
 
Visual BAsic for Application (VBA) is een dialect van het 'normale' Visual Basic 6.0 (VB 6.0). Het enige verschil is dat er binnen Excel bijvoorbeeld bepaalde objecten standaard beschikbaar zijn, zoals Worksheet, Workbook, etc. En sommige zaken gaan andersom juist weer lastiger (als je bijvoorbeeld met formulieren wilt gaan werken).

Je zou een (tweedehands?) cursusboek Visual Basic 6.0 kunnen kopen en daarmee aan de slag gaan. In VB6.0 boeken staan de grondbeginselen vaak beter uitgelegd, terwijl een VBA boek sneller ingaat op praktijkvoorbeelden.

Zelf heb ik een VB achtergrond en daardoor minder moeite met VBA...
Maar als je vragen hebt, stel ze dan gerust. Grote kans dat je heel snel een antwoord krijgt!
 
Het is vast erg soortgelijk (bijna al die programmeertoestanden) maar ik wist bv als niet dat dim een variabele declaratie was.
Met Dim declareer je variabelen. Een array kun je opnieuw declareren (voor 1 dimensie!) met ReDim. Bijvoorbeeld:
Code:
Dim x() as long

'maak plaats voor 11 waarden (standaard begint een array bij 0: 0 t/m 10 is 11 waarden) 
Redim x(10)

'maak plaats voor 21 waarden 
Redim x(20)

'maak plaats voor 11 waarden en behoud de reeds ingevulde waarden 
Redim Preserve x(10)


!= is blijkbaar
De '!' betekent 'Not'. Je zou dus ook kunnen programmeren:
Code:
      If not(x(i,j) = 99999) Then
         array x(i,j) = x(i,j) + 50
      endif
Maar dit vind ik persoonlijk lastiger leesbaar. Voor booleans (bevatten alleen de waarden True of False) is het wel weer handig:
Code:
Dim bWaarde as Boolean

bWaarde = True
If Not bWaarde Then 
   'doe hier iets
Else
   'doe hier iets anders
Endif
 
Applicatie is bijna af:-). Ik heb bepaalde bereiken van mijn Excel sheet ingelezen in een array

Code:
Sub test()
Dim Bedragen As Variant
Bedragen = Range("C9:C39").Value

  For i = 1 To UBound(Bedragen)
  
    If Bedragen(i, 1) = "" Then
       
       Else
       Bedragen(i, 1) = Bedragen(i, 1) * 21 / 100 + Bedragen(i, 1)
       
       
       
       MsgBox Bedragen(i, 1)
       End If
    Next i

End Sub

Hoe krijg ik de herberekende waarde van de Bedragen array met subscript (i,1) in de desbetreffende rij van kolom C ( Nu toon ik voorlopig het resultaat in een MsgBox)
Als ik dit af heb ga ik aan de slag gaan met een boek. De wondere wereld van Visual Basic verkennen:). Ik wil jullie nu niet met elke vraag lastig vallen lol. Het is niet zo lastig maar de juist methode aanspreken is een hele klus:)
 
Laatst bewerkt:
De code kan volgens mij nog iets strakker:
Code:
Public Sub test()
   Dim Bedragen As Range
   Dim i As Long
  
   Set Bedragen = Range("C9:C39")

   For i = 1 To UBound(Bedragen.Value)
  
      If Bedragen(i, 1).Value <> "" Then

         Bedragen(i, 1).Value = Bedragen(i, 1).Value * 121 / 100
         'MsgBox Bedragen(i, 1)
      
      End If
   Next i

End Sub

De waarden worden automatisch in Excel teruggezet omdat je via het Range object ook direct in die cellen de getallen aan het wijzigen bent...
 
De code kan volgens mij nog iets strakker:
Code:
Public Sub test()
   Dim Bedragen As Range
   Dim i As Long
  
   Set Bedragen = Range("C9:C39")

   For i = 1 To UBound(Bedragen.Value)
  
      If Bedragen(i, 1).Value <> "" Then

         Bedragen(i, 1).Value = Bedragen(i, 1).Value * 121 / 100
         'MsgBox Bedragen(i, 1)
      
      End If
   Next i

End Sub

De waarden worden automatisch in Excel teruggezet omdat je via het Range object ook direct in die cellen de getallen aan het wijzigen bent...

Dus dit is een Call by referece object?
 
@Jeroen1000 Alle mensen die hier een vraag posten hebben een "vraag". Wees duidelijk in je probleem stelling. Titel aangepast.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan