Taas aivan yksinkertainen ongelma. Miksi aliohjelmaan viittaava joku(1, 1) ei toimi? Jos viitataan funktioon tulos = joku(1, 1), koodi toimii. Samoin toimii aliohjelmaan viittaava joku(1). Kaksi muuttujaa sisältävä aliohjelma kuitenkaan ei.
Option Explicit Private Sub Form_Load() joku(1, 1) End Sub Sub joku(i As Integer, j As Integer) MsgBox "HEI!" End Sub
Sulla on ylimääräiset sulut tuossa.
Eli:
Joku 1, 1 'Toimii 'tai Jotain = joku(1, 1) 'Toimii 'Mutta ei sekaisin joku(1, 1) 'Ei toimi 'Toisaalta yksittäisen arvon voi laittaa sulkuihin joten Joku 1 'Toimii Joku (1) 'Sama asia Joku 1, 1 'Toimii Joku (1), (1) 'Sama asia
Tässä on vielä yksi tapa:
Call joku(1, 1)
Tuodaan tässä samalla esille ero ByRefin ja ByValin välillä:
Option Explicit Private Sub Form_Load() Dim i As Integer, j As Integer i = 1 j = 2 joku i, j MsgBox "i = " & i & vbNewLine & "j = " & j i = 1 j = 2 jokutoinen i, j MsgBox "i = " & i & vbNewLine & "j = " & j End Sub ' tämä on sama kuin Sub joku(ByRef i As Integer, ByRef j As Integer) Sub joku(i As Integer, j As Integer) i = 0 j = 0 End Sub Sub jokutoinen(ByVal i As Integer, ByVal j As Integer) i = 0 j = 0 End Sub
ByRef: muutat sitä samaa muuttujaa, joka on syötetty proseduuriin (viitattu).
ByVal: muutat kopiota muuttujasta, joka on syötetty proseduuriin (arvo kopioitu).
Yleensä ByVal on parempi, sillä se vähentää kömmähdyksiä. ByRef on parempi silloin, kun halutaankin muuttaa muuttujien arvoja. Tietyissä tapauksissa kuten merkkijonojen käsittelyssä ByRef voi olla parempi sen vuoksi, ettei muuttujasta tarvitse tehdä kopiota, joka hidastaisi käsittelyä erityisesti suurien merkkijonojen kohdalla.
Suuret kitokset, paljon hyödyllistä tietoa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.