Problemen met flexibele opmaak

Status
Niet open voor verdere reacties.
Declareer de variabele initializing boven in de module van frmDoelenstellen:
Code:
Dim initializing As Boolean
en geef die de waarde True op deze plaats:
Code:
Private Sub UserForm_Initialize()
    initializing = True
en aan het einde van die Sub:
Code:
    initializing = False
End Sub
Neem vervolgens deze Sub's op in de code van het formulier, dat overigens frmDoelenStellen heet en niet frmDoelenInstellen.
Code:
Private Sub txtPer1_Change()
    chkTrue
End Sub

Private Sub txtPer2_Change()
    chkTrue
End Sub

Private Sub txtPer3_Change()
    chkTrue
End Sub

Private Sub txtPerAEX_Change()
    chkTrue
End Sub

Private Sub chkTrue()
    If Not initializing Then
        chkDoelAEX.Value = True
        chkDoel1.Value = True
        chkDoel2.Value = True
        ChkDoel3.Value = True
    End If
End Sub
 
In de ontwerpmodus kun je van die 4 vinkvakken de waarde op true zetten; daar is geen VBA-code voor nodig.
 
In de ontwerpmodus kun je van die 4 vinkvakken de waarde op true zetten; daar is geen VBA-code voor nodig.
Het gaat er mij dat die vinkboxen op true worden gezet, alleen als een waarde heb veranderd. Anders kunnen ze gewoon op false blijven staan.
a.d.h.v. of een checkbox op true staat worden de bijbehorende velden aangepast en worden de kolommen voor de grafieken bijgewerkt, maar die macro moet nog geschreven worden.
Ik wilde eerst dit werkend hebben voordat ik werken aan macro voor cmdOK_click-macro.
 
Hartstikke bedankt Ahulpje.

Ik heb het alleen een klein beetje aangepast en heb dit van gemaakt en nu werkt het zoals ik in mijn hoofd had.
Code:
Private Sub txtPerAEX_change()
    chkTrueAEX
End Sub

Private Sub txtPer1_change()
    chkTrue1
End Sub

Private Sub txtPer2_change()
    chkTrue2
End Sub

Private Sub txtPer3_change()
    chkTrue3
End Sub

Private Sub chkTrueAEX()
If Not initializing Then
    chkDoelAEX.Value = True
End If
End Sub

Private Sub chkTrue1()
If Not initializing Then
    chkDoel1.Value = True
End If
End Sub

Private Sub chkTrue2()
If Not initializing Then
    chkDoel2.Value = True
End If
End Sub

Private Sub chkTrue3()
If Not initializing Then
    ChkDoel3.Value = True
End If
End Sub

Nu worden alleen de gewijzigde fondsen aangevinkt en niet alle in één keer.
Nogmaals dank voor het geven van de aanwijzingen.
 
Dat kan simpeler:

CSS:
Private Sub txtPerAEX_change()
    chkDoelAEX = Not initializing
End Sub
 
Om de wijzigingen in het formulier Doelen stellen te kopiëren naar de betreffende cellen op sheets(1) heb ik de volgend code geschreven:
Code:
ai = Sheets(1).UsedRange

If chkDoelAEX = True Then
    frmDoelenStellen.txtDoelProcAEX.Copy
    ai(10, 13).PasteSpecial Paste:=xlPasteValues
    ai(9, 13).Formula = ai(2, 13) * ai(10, 13)
    frmDoelenStellen.txtPerAEX.Copy
    ai(11, 13).PasteSpecial Paste:=xlPasteValues
    ai(2, 13).Select
    DoeltijdAanpassen
End If
sheets(1).[L1].select
unload me
end sub
Er gebeurt niets en ik krijg een foutmelding:
Object vereist
Is
Code:
ai=sheets(1).usedrange
geen object?
Heb ik iets over het hoofd gezien.
 
Nee.
de variabele ai is een array van het type Variant.
 
Ik heb het inmiddels geprobeerd met harde celverwijzingen:
Code:
Sheets(1).Select
If chkDoelAEX = True Then
    frmDoelenStellen.txtDoelProcAEX.Copy
    [M10].PasteSpecial Paste:=xlPasteValues
    [M9].Formula = [M2] * [M10]
    frmDoelenStellen.txtPerAEX.Copy
    [M11].PasteSpecial Paste:=xlPasteValues
    [M2].Select
    DoeltijdAanpassen
End If
en nog krijg ik de foutmelding
Methode Pastespecial van klasse range is mislukt
Waar gaat het fout
 
Je zegt niet op welke regel het fout gaat.
Wat dacht je van een voorbeeld documentje?
 
Code:
With Sheets(1)
    .Range("M10") = frmDoelenStellen.txtDoelProcAEX.Text
    .Range("M11") = frmDoelenStellen.txtPerAEX.Text
End With
Als dit vanuit het formulier draait kun je frmDoelenStellen. weglaten.
 
Ik heb nu ook een voorbeeld-doc meegestuurd.

Dit is de hele macro:
Code:
Sheets(1).Select
If chkDoelAEX = True Then
    frmDoelenStellen.txtDoelProcAEX.Copy
    [M10].PasteSpecial Paste:=xlPasteValues
    [M9].Formula = [M2] * [M10]
    frmDoelenStellen.txtPerAEX.Copy
    [M11].PasteSpecial Paste:=xlPasteValues
    [M2].Select
    DoeltijdAanpassen
End If
en bij deze regel krijg ik de foutmelding:
[M10].PasteSpecial Paste:=xlPasteValues
IK snap niet wat hier fout aan is want in andere macro's doe ik hetzelfde en werkt het wel.
als voorbeeld laat ik een paar regels zien uit de macro "Update" waar een soortgelijke constructie wel werkt
Code:
[D5].Copy
recentFonds1.Offset(0, 2).PasteSpecial Paste:=xlPasteValues
If [D5].Value = 0 Then recentFonds1.Offset(0, 2).ClearContents

Waarom werkt het hier wel en bij de eerste macro niet
 

Bijlagen

@RoVo1211 Je bent je er ondertussen van bewust dat de helpers het spoor bijster zijn? Ik heb je eerder al medegedeeld dat je chaotisch bezig bent.
 
Heb je geprobeerd wat AHulpje al zei?
Code:
With Sheets(1)
    If chkDoelAEX Then
        .[M10] = txtDoelProcAEX
        .[M9] = .[M2] * .[M10]
        .[M11] = txtPerAEX
        DoeltijdAanpassen
    End If
End With
 
Laatst bewerkt:
Ik krijg het maar niet voor elkaar om de juiste kleur bij het juiste percentage te krijgen en heb daarom besloten om de kleuren te beperken tot 3 kleuren:
Groen voor positief resultaat, zoiets als RGB(0,192,0)
Blauw voor tussen -0.5% en +0.5%, zoiets als RGB(0,192,255) en
Rood voor negatief resultaat, zoiets als RGB(192,0,0).

Heel veel dank snb voor de tijd die je erin hebt gestoken en het uitzoekwerk.

Kan iemand mij een hint geven hoe ik onderstaande code moet aanpassen om dat voor elkaar te krijgen?
Code:
    With txtVerschilAEX
        .BackColor = Array( _
            RGB(255, 224, 224), _
            RGB(255, 176, 176), _
            RGB(255, 0, 0), _
            RGB(128, 0, 0), _
            RGB(0, 192, 255), _
            RGB(224, 255, 224), _
            RGB(0, 192, 0), _
            RGB(0, 128, 0))(Application.Match(--sn(6, 13) / 100, _
            Array(-0.0001, -0.005, -0.01, -0.05, 0.0001, 0.005, 0.01, 0.05), 1))
        .ForeColor = Array(vbBlack, vbBlack, vbWhite, vbWhite, vbBlack, vbBlack, vbWhite, vbWhite) _
            (Application.Match(--sn(6, 2 * j + 13) / 100, _
                Array(-0.05, -0.01, -0.005, -0.001, -0.0005, 0.0005, 0.001, 0.005, 0.01, 0.05), 1))
        .Value = FormatPercent(sn(6, 13))
    End With

Even een andere vraag:
Is het mogelijk om met debug.print de inhoud van de hele array in tabelvorm in het venster Direct te krijgen? Ik had zoiets geschreven als:
Code:
option base 1
Debug.print vbnewline & _
array(1,1) & vbtab & array(1,2) & vbnewline & _
array(2,1) & vbtab & array(2,2) & vbnewline & _
array(3,1) & vbtab & array(3,2) & vbnewline & _
array(4,1) & vbtab & array(4,2) & vbnewline & _
array(5,1) & vbtab & array(5,2) & vbnewline & _
array(6,1) & vbtab & array(6,2) & vbnewline & _
array(7,1) & vbtab & array(7,2) & vbnewline & _
array(8,1) & vbtab & array(8,2) & vbnewline & _
array(9,1) & vbtab & array(9,2) & vbnewline & _
array(10,1) & vbtab & array(10,2)

Maar ik kreeg er niets uit.


Met vriendelijke groet,
Ronald.
 
Lees #10 en #12 nog eens heel rustig en aandachtig.
En code die je niet begrijpt moet je dan ook niet gebruiken, en ik snap dat je de code van snb een beetje ingewikkeld vindt.
 
Beste Harry,
Ik moet je teleurstellen: ook de optie met "to" is niet mogelijk in een select case-constructie.
Helaas.
Dat heb ik geprobeerd, Harry. Maar zoals ik zondag ook al heb geantwoord is het niet mogelijk om in een select case-constructie binnen één case meerdere voorwaarden op te geven.

Een veld of cel kan vergeleken worden met een waarde, bijv [M6]>1 of [Q6]<-0.05, maar niet [O6} -0.005 to +0.005. Dat wordt niet geaccepteerd.
 
Je hoeft ook niet te testen of txtverschil3 tussen twee waarden in ligt, kijk maar eens goed naar de voorwaarden.
Voorbeeld:
txtverschil3 = 0.004
Pas bij Case Is < 0.005 wordt voldaan aan de voorwaarde. De crux is dat je in de juiste volgorde test.
Je kunt ook in omgekeerde volgorde werken, maar dan met groter dan, dus beginnen met > 0.05, daarna > 0.01 etc.
Voorbeeld: ik heb de waarde -0.0063 staan in txtVerschil2 staan en ik heb verschillende vergelijkingen geprobeerd, maar ik krijg geen rode achtergrond in het veld.
Nu ziet mijn select case-constructie er als volgt uit:
Code:
For j = 1 To 3
    With Me("txtVerschil" & j)
        .Value = FormatPercent(sn(6, 2 * j + 13), 2)
        Select Case Me("txtVerschil" & j)
            Case Is <= -0.01
                .BackColor = RGB(192, 0, 0)
                .ForeColor = vbWhite
            Case Is > 0.01
                .BackColor = RGB(0, 192, 255)
                .ForeColor = vbYellow
            Case Is >= 0.05
                .BackColor = RGB(0, 192, 0)
                .ForeColor = vbWhite
        End Select
    End With
Next j

Waar ga ik de mist in?
 
Dat heb ik geprobeerd, Harry. Maar zoals ik zondag ook al heb geantwoord is het niet mogelijk om in een select case-constructie binnen één case meerdere voorwaarden op te geven.
Altijd leuk voor wijsneuzen om het tegendeel te bewijzen.
 

Bijlagen

Zodra voldaan wordt aan een van de Cases wordt daarna verder gegaan na End Select.
Dus ieder getal boven de 0,01 krijgt de kleuren die bij
Code:
Case Is > 0.01
opgegeven worden. Case Is >= 0.05 zal dus nooit bereikt worden. Zie ook #22.

En -0.0063 is groter dan -0.01, dus aan geen van de Cases wordt dan voldaan. Zet maar eens een breakpoint op Select Case en loop met F8 door de code.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan