Hallo allemaal
Wie ongeduldig is: scroll door naar het einde van deze startpost voor de werkelijke vraag
ik kreeg volgende vraag van een collega:
Terminologie: ik noem in dit voorbeeld A1 de controlecel en de cel waarin de datum+tijd moet komen de doelcel.
Ik dacht aan volgende oplossingen, maar geen enkele doet het volledig correct of zonder work-around.
Oplossing 1:
Zelf een macro definiëren en die telkens oproepen als je datum+tijd wilt laten invullen.
Oplossing 2:
Een eigen functie definiëren en die oproepen in de doelcel.
Oplossing 3:
Dit zou dé oplossing kunnen zijn: als we het adres van de controlecel doorgeven als parameter aan onze functie, wordt de doelcel wel herberekend bij aanpassing van de inhoud van de controlecel.
Work-around oplossing:
Volgende code doet het werk correct, maar het nadeel is dat we telkens zelf de doelcel als tweede parameter moeten meegeven.
Het nadeel is dat dit uiteraard een work-around is voor het échte probleem:
Kun je het adres te weten komen van waaruit een bepaalde formule wordt opgeroepen?
Dr. Google kan me niet direct helpen.
Wie-o-wie vindt het antwoord?
Wie ongeduldig is: scroll door naar het einde van deze startpost voor de werkelijke vraag
ik kreeg volgende vraag van een collega:
als ik in Excel in een cel invul:
code:(dus als cel A1 niet nul is moet je in een bepaalde cel de actuele tijd invullen)
1 =ALS(A1>0;NU();" ")
dan krijg ik in de cel inderdaad de actuele tijd te zien, maar die verandert constant telkens ik bv ergens ander op Enter druk of sheet opnieuw open etc.
Kan jij een manier om die waarde die via nu() is ingevoerd meteen ook VAST te maken zodat die niet verandert?
offtopic:
Ik weet wel dat de voorwaarde uit zijn voorbeeld overeenkomt met A1 groter dan nul ipv niet nul, maar dat doet even niet terzake
Ik weet wel dat de voorwaarde uit zijn voorbeeld overeenkomt met A1 groter dan nul ipv niet nul, maar dat doet even niet terzake
Terminologie: ik noem in dit voorbeeld A1 de controlecel en de cel waarin de datum+tijd moet komen de doelcel.
Ik dacht aan volgende oplossingen, maar geen enkele doet het volledig correct of zonder work-around.
Oplossing 1:
Zelf een macro definiëren en die telkens oproepen als je datum+tijd wilt laten invullen.
Visual Basic:
Het nadeel is duidelijk:je moet zelf telkens op de knop drukken. In dat geval lijkt het me zinvoller om Ctrl+Shift+; te gebruiken om de huidige datum+tijd in te vullen.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| Public Sub VulDatumIn() Dim strDoelCel As String Dim strControleCel As String strControleCel = InputBox("Geef het adres in van de controlecel", , "A1") strDoelCel = InputBox("Geef het adres in van de cel waarin de datum ingevuld moet worden", , "A2") Dim strDoelValue As String Dim strControleCelValue As Integer strDoelValue = Trim(Range(strDoelCel).Value) strControleCelValue = Range(strControleCel).Value If strDoelValue = "" And strControleCelValue <> 0 Then Range(strDoelCel).Value = DateTime.Now End If End Sub |
Oplossing 2:
Een eigen functie definiëren en die oproepen in de doelcel.
Visual Basic:
Nadeel: de doelcel wordt niet herrekend als je de waarde in de controlecel aanpast. Bovendien is het adres van de controlecel hard-coded (al kan je dit opvangen via inputbox).1
2
3
4
5
6
7
8
| Public Function EenmaligeDatum() Dim strReturnValue As String strReturnValue = ActiveCell.Text If (Trim(strReturnValue) = "0" Or Trim(strReturnValue) = "") And Range("A1").Value > 0 Then strReturnValue = DateTime.Now End If EenmaligeDatum = strReturnValue End Function |
Oplossing 3:
Dit zou dé oplossing kunnen zijn: als we het adres van de controlecel doorgeven als parameter aan onze functie, wordt de doelcel wel herberekend bij aanpassing van de inhoud van de controlecel.
Visual Basic:
Spijtig nadeel: dit werkt de eerste keer wel goed, maar als we nadien onze controlecel aanpassen, verwijst ActiveCell naar de controlecel, niet naar de doelcel.1
2
3
4
5
6
7
8
| Public Function EenmaligeDatum(objControleCel As Range) Dim strReturnValue As String strReturnValue = ActiveCell.Text If (Trim(strReturnValue) = "0" Or Trim(strReturnValue) = "") And objControleCel.Value > 0 Then strReturnValue = DateTime.Now End If EenmaligeDatum = strReturnValue End Function |
Work-around oplossing:
Volgende code doet het werk correct, maar het nadeel is dat we telkens zelf de doelcel als tweede parameter moeten meegeven.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
| Public Function EenmaligeDatum(objControleCel As Range, objDoelCel As Range) Dim strReturnValue As String strReturnValue = Trim(objDoelCel.Text) If strReturnValue = "0" Then strReturnValue = "" End If If strReturnValue = "" And objControleCel.Value > 0 Then strReturnValue = DateTime.Now End If EenmaligeDatum = strReturnValue End Function |
Het nadeel is dat dit uiteraard een work-around is voor het échte probleem:
Kun je het adres te weten komen van waaruit een bepaalde formule wordt opgeroepen?
Dr. Google kan me niet direct helpen.
Wie-o-wie vindt het antwoord?