Toon posts:

[VB] array vullen *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een kalender waarin de dagen invulvelden zijn verdeeld over tabbladen, gelijk aan de maanden.

Ik heb niet zo veel ervaring met array's vandaar de volgende vraag.

Ik probeer een array te declareren met 2 dimensies als volgt

code:
1
2
3
4
5
6
Dim lngMax As Long
    lngMax = DateDiff("d", "1/1/" & cboYear.Text, "31/12/" & cboYear.Text, vbMonday, vbFirstJan1)

Dim arrData() As Variant
Dim i As Integer
ReDim arrData(lngMax, 1)


Afhankelijk van het 'dagnummer' t.o.v. 1 januari wil ik de array vullen met waarden uit de velden. Pas als het formulier gesloten wordt ga ik de waarden opslaan.

Nu dacht ik de waarden op de onderstaande manier op te slaan maar hij geeft geen waarden in de array wanneer ik debug.....weet iemand wat ik verkeerd doe?

code:
1
2
3
4
5
6
    For i = txtVeld.LBound To txtVeld.UBound
        If txtVeld(i).Text <> "" Then
        MsgBox Day(lblDagNummer(i).Caption)
            arrData(Day(lblDagNummer(i).Caption), 0) = txtVeld(i).Text
        End If
    Next i


Bedankt voor de moeite,

Richard _/-\o_

[ Voor 6% gewijzigd door Verwijderd op 04-04-2004 10:25 ]


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ik zie niet in waarom dit niet zou werken.
Tevens zie ik niet in hoe jij inspringt (NoFI) maar ik vind het er nogal wasig en onduidelijk uitzien, maar dat terzijde.

Maar even alle gekheid op een stokje:
De code:
- wat probeer je te bereiken?
- wat gebeurt er?
- welke foutmelding krijg je?

De taal:
- welke VB versie heb je?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Verwijderd

Topicstarter
In ieder geval bedankt voor je antwoord... ;)

Ik werk met VB6

Wat probeer ik te bereiken....

Ik heb een formulier met 12 tabbladen die staan voor de maanden.
Daarbij toon ik textvelden en datumvelden gelijk aan de keuze van het tabblad (ofwel de maand). Men kan per dag iets invullen (nummeriek) in zo'n textveld.

Nu wil ik de waarden die ingevuld worden niet bij elke verandering van maand direct opslaan in de database maar tijdelijk opslaan in een array.
Wanneer men het formulier verlaat, óf een ander jaar kiest uit de combo met jaartallen én de array is gevuld sla ik de waarden op in de database.

Die multi dimensionale array heb ik overboord gezet Ik hoef slechts op te slaan in een tabel het jaartal, het dagnummer geteld vanaf 1 januari (van het gekozen jaar) en de waarde uit het textveld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub saveDataInArray()
Dim arrData()
Dim i As Integer
    'sla de gegevens op in de array indien de textvelden niet leeg zijn
    For i = txtMinutes.LBound To txtMinutes.UBound
        If txtMinutes(i).Text <> "" Then
        ReDim arrData(i)
            arrData(i) = (DateDiff("d", "1/1/" & cboYear.Text, lblDagNummer _
(i).ToolTipText)) & ";" & cboYear.Text & ";" & txtMinutes(i).Text _
            txtMinutes(i).Text = ""
            Debug.Print arrData(i)
        End If
    Next i

End Sub


Nu, wanneer ik iets invul op 4, 5 en 6 april 2004 krijg ik dit in het debug scherm:

91;2004;120
92;2004;180
93;2004;5

Dit is prima, nu nog het opnieuw uitlezen....ik weet namelijk als ik de array ga inlezen dat 91 staat voor 4 april etc.... dus moet ik de waarden, wanneer ik opnieuw op tab-april klik, terugzetten in de juiste velden!

Dat stukje ben ik nog niet achter......kun jij mij op het juiste spoor zetten?

Bedankt,
Richard

[ Voor 7% gewijzigd door Verwijderd op 04-04-2004 14:38 ]


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ok de bedoeling is me duidelijk. De oplossing lijkt me niet zo moeilijk. 91 staat voor 4 april zeg je... dat klopt volgens mij niet helemaal, gegeven het volgende rekensommetje:

code:
1
2
3
4
5
6
7
AANTAL DAGEN PER MAAND
31    voor januari
28    voor februari (we gaan er van uit dat het geen schrikkeljaar is)
31    voor maart
04    voor april
---- + 
94


Ik weet dus niet precies hoe je geteld hebt, maar iemand doet iets fout of ik begrijp je verkeerd :).

Hoe dan ook, vergeet je het niet om rekening te houden met schrikkeljaren?

Maar goed, de oplossing:
Ok, we hebben dus 94 = 4 april. Dan ga je gewoon vanaf 1 januari tot 1 april tellen:

code:
1
2
3
4
aantal_dagen = 94
minus januari = 94 - 31 = 63
minus februari = 63 - 28 = 35
minus maart = 35 - 31 = 4


aantal_dagen is nu < aantal_dagen_in_april (= 30) dus je stopt nu met aftrekken.
Er van uitgaande dat je textboxen beginnen te tellen vanaf 0, moet je er nog eentje van af trekken (
code:
1
2
3
4
1 april = 0
2 april = 1
3 april = 2
4 april = 3
) dus aantal_dagen = 3. Et voila :)

edit:
- en dit is dus ook het indexnummer van de textbox die je moet hebben

[ Voor 5% gewijzigd door muba op 04-04-2004 16:35 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Verwijderd

Topicstarter
hehe....zoals jij dit doet klopt het niet....maar zoals ik het doe wel... ;)

BTW ik ben eruit dus....in ieder geval bedankt voor je tijd. Ik zal jou/jullie dan ook uitleggen wat ik gedaan heb;

Afhankelijk van de gekozen tab weet ik de maand --> april staat voor 4

Vanaf 1 januari 'het gekozen jaartal' tot en met 1 april is dat 91 dagen :

code:
1
DateDiff("d", "1/1/" & cboYear.Text, lblDagNummer(i).ToolTipText)


lblDagNummer(i) heeft dezelfde index als txtVeld(i)

Ik heb een perfect gesynchroniseerd formulier met invulvelden die gelijk zijn aan de kalenderdata (voor ELK jaar, ongeacht schrikkeljaar)
Wanneer het een schrikkeljaar is verberg ik namelijk velden en labels.


Het aantal dagen van een maand kun je als volgt ophalen

code:
1
2
3
4
5
6
7
8
9
Private Function DaysInMonth( _
   Optional dteInput As Date) As Integer
 If dteInput = 0 Then
   dteInput = Date
 End If
 DaysInMonth = _
   Day(DateSerial(Year(dteInput), _
   Month(dteInput) + 1, 0))
End Function


Nu weet je dus hoeveel dagen de gekozen maand heeft. Dan nog even opzoeken op welke dag de eerste van die maand valt :

code:
1
2
'haal het dagnummer op van de gekozen tab (maand)
    EersteDagNummerGekozenMaand = Weekday("1/" & tabIndex & "/" & cboYear.Text, vbMonday)


en zo kun je alles dus verder uitwerken totdat je een perfect synchroniserend geheel hebt.....

;)

Groeten,

Richard