Problemen met flexibele opmaak

Status
Niet open voor verdere reacties.
Bedankt voor je suggestie, maar ik snap niets van de code.
Jij bent een meer gevorderde programmeur dan ik. Daarbij komt dat ik de for...next-constructie altijd erg ingewikkeld vind.
Zou je de code van commentaar willen voorzien?

Waar ik de belangrijkste vraag over heb is
Code:
      Me("chkDoel" & j).Caption = sn(2 * j + 3, 2)
      Me("txtOpening" & j) = FormatCurrency(sn(5, 2 * j + 13))
      Me("txtHuidig" & j) = FormatCurrency(sn(2 * j + 3, 4), 3)
      Me("txtDoelProc" & j) = FormatPercent(sn(10, 2 * j + 13))
      Me("txtDoel" & j) = FormatCurrency(sn(9, 2 * j + 13), 3)
      Me("txtPer" & j) = FormatDateTime(sn(11, 2 * j + 13), 4)
      Me("txtAankoop" & j) = FormatCurrency(sn(14, 2 * j + 13))
      Me("txtVerk1Proc" & j) = FormatPercent(sn(14, 2 * j + 13) * 1.01)
      Me("txtWinstXproc" & j) = FormatPercent(sn(43, 2 * j + 13))
      Me("txtVerkXproc" & j) = FormatPercent(sn(14, 2 * j + 13) * (1 + sn(43, 2 * j + 13)))
Het moeilijkste gedeelte vind ik
Code:
sn(5, 2 * j + 13)
Wat gebeurt er hier?
Waarom is de eerste regel sn(5,2*j+13 en in de tweede regel sn(2*j+3,4)

Dit is de code die ik nu heb en ik snap dat jouw code veel korter is.
Code:
    With txtVerschilAEX
        .Value = FormatNumber(Sheets(1).[M6].Value, 4)
        Select Case txtVerschilAEX.Value
            Case Is >= 0.05
                .BackColor = RGB(0, 128, 0)
                .ForeColor = vbWhite
            Case Is >= 0.01
                .BackColor = RGB(0, 192, 0)
                .ForeColor = vbWhite
            Case Is >= 0.005
                .BackColor = RGB(192, 255, 192)
                .ForeColor = vbBlack
            Case Is >= 0.0001
                .Font.Bold = False
                .ForeColor = vbBlack
                .BackColor = RGB(208, 255, 208)
            Case Is >= -0.0001
                .BackColor = RGB(0, 192, 255)
                .ForeColor = vbYellow
            Case Is >= -0.005
                .BackColor = RGB(255, 224, 224)
                .ForeColor = vbBlack
            Case Is < 0.01
                .BackColor = RGB(192, 255, 192)
                .ForeColor = vbBlack
            Case Is < 0.05
                .BackColor = RGB(0, 192, 0)
                .ForeColor = vbWhite
            Case Else
        End Select
    End With
 
Maak het jezelf gemakkelijk

CSS:
Msgbox "chkDoel" & j & vblf & 2*j+3 & vbtab & 2 & vblf  & "Cel (" & 2*j+3 & ",2) = sn("  & 2*j+3 & ",2) = " & sn(2*j,2)

Me("chkDoel" & j).Caption = sn(2 * j + 3, 2)

Lees eens over arrays: https://www.snb-vba.eu/VBA_Arrays.html
 
Superbedankt snb. 😛
Je hebt me echt fantastisch geholpen. Nu snap ik ook de algebra die bij sn tussen haakjes staat: voor de komma de berekening voor het rijnummer en achter de komma de berekening voor het kolomnummer en daarachter buiten de haakjes de komma en het aantal decimalen.

Ik ben zo blij met deze oplossing. Dit scheelt me een hoop typewerk.
Ik heb een vuistdik boek over programmeren in VBA, maar deze gevorderde stof staat er niet in.

Nogmaals veel dank.
 
Nu je het zelf 'ontdekt' hebt onhoud je het veel beter en kun je het waarschijnlijk ook zelf gemakkelijker toepassen.

Hoe de lus werkt zul je nu ook wel ontdekt hebben.

Bedenk dat bij Formatpercent en Formatcurrency standaard (default) het aantal decimalen 2 is.
Die hoef je dus niet als argument/parameter mee te geven. Pas als je van die standaard wil afwijken voer je het van 2 afwijkende getal op.
 
Ik probeer alleen te achterhalen wat de Usedrange is. Ik heb het geprobeerd met
Code:
Debug.print sn.usedrange.address
, maar ik krijg een foutmelding.

Hoe kan ik achterhalen wat de usedrange is?
 
Usedrange is de eigenschap van een werkblad.
sn is geen werkblad, maar een variabele.
Een werkblad bevat 20^2 rijen en 2^14 kolommen.
Die worden niet allemaal gebruikt in jouw geval; de vierhoek die bepaald wordt door de laatste rij die jij gebruikt en de laatste kolom die jij gebruikt is de usedrange:

CSS:
Msgbox sheet1.usedrange.address
 
Beste snb,
Ik heb deze opdracht uitgevoerd in het venster Direct en ik kreeg als antwoord $A$1:$BL$81920, maar kolom BB is mijn laatst gebruikte kolom en rij 111 mijn laatst gebruikte rij.
Ik heb een kleine test gedaan en toen zag ik dat er ook in verdere kolommen gegevens stonden, die heb ik verwijderd en om ook de overbodige rijen te verschonen van data heb ik een klein macro'tje gemaakt met de volgende code
Code:
sub CleanSheet()
[A111:BL81920].clearcontents
[BC1:BL81920].clearcontents
end sub

Daarna heb ik usedrange nog een keer opgevraagd, maar excel blijft dezelfde gebruikte range opgeven.

Waarom krijg ik niet als usedrange $A$1:$BB$111?
 
Dat is een eigenaardigheid van Excel:

gebruik geen clearcontents, maar
- verwijder de rijen en kolommen zonder gegevens
- sla het bestand op
- open het bestand opnieuw
- check de omvang van de 'usedrange'.
 
Na het verwijderen van de kolommen en rijen en het opslaan en opnieuw openen kreeg ik inderdaad de goede usedrange. Dank.

Ik krijg ook vaak een melding dat mijn klembord vol is.
Op internet had ik gevonden dat ik met
Code:
application.cutcopymode=false
het klembord kan legen en met
Code:
application.displayalerts=false
de melding niet te zien hoefde te krijgen.
Je raad het waarschijnlijk al: er gebeurt niets.

Heb je hier ook een suggestie voor die wel werkt? 😂
 
Beste snb (misschien is het leuk om je gewone voornaam te weten),
Ik heb je uitleg over array's gelezen en er is mij het e.e.a. duidelijker geworden.
Nu probeer ik de "Verschil"-velden van fonds 1, 2 en 3 ook op jouw manier in te vullen, maar ik kom er niet helemaal uit. Dit is wat ik nu heb:
Code:
For j = 1 To 3
    With Me("txtVerschil" & j)
        .Value = FormatPercent(sn(6, 2 * j + 13))
        .BackColor = _
            Array( _
                RGB(128, 0, 0), _
                RGB(192, 0, 0), _
                RGB(255, 176, 176), _
                RGB(255, 208, 208), _
                RGB(208, 255, 208), _
                RGB(176, 255, 176), _
                RGB(0, 192, 0), _
                RGB(0, 128, 0)) _
            (Application.Match(--sn(6, 2 * j + 13) / 100, _
                Array(-0.05, -0.01, -0.005, -0.0001, 0.0001, 0.005, 0.01, 0.05), 1))
       
        .ForeColor = Array(vbWhite, vbWhite, vbBlack, vbBlack, vbBlack, vbBlack, vbWhite, vbWhite) _
            (Application.Match(--sn(6, 2 * j + 13) / 100, _
                Array(-0.05, -0.01, -0.005, -0.0001, 0.0001, 0.005, 0.01, 0.05), 1))
    End With

next j
Ik krijg de foutmelding dat de typen niet overeenkomen. Waar zit de fout?
en wat wordt hiermee bereikt:
Code:
 (Application.Match(--sn(6, 2 * j + 13) / 100, _   'ik snap de "--sn" niet.
                Array(-0.05, -0.01, -0.005, -0.0001, 0.0001, 0.005, 0.01, 0.05), 1))

Is het ook mogelijk om de hele array te zien te krijgen in een soort tabelvorm?

Bij voorbaat dank voor je geduld met mij.

Groetjes,
Ronald.
 
Laatst bewerkt:
Je doorloopt de code natuurlijk met F8.
In welke regel treedt de foutmelding op ?
 
Gisteren kreeg ik geen foutmelding, maar alleen de kleuren kloppen niet.
Nou vooruit, kijk hier eens naar:
Beste Ahulpje,
Je had mij het bestand kleurtjes.xlsm gestuurd, maar ik krijg met geen mogelijkheid de macro's ingeschakeld. In ieder geval bedankt voor de moeite.
 
Sla de bijlage op en unzip in een map naar keuze.
Importeer het formulier in een nieuw Excelbestand:

Open een nieuw Excelbestand
Alt-F11
Rechtsklik ThisWorkbook
Kies "Bestand importeren"
Selecteer Userform1.frm

Dubbelklik ThisWorkbook
Plak onderstaande code daarin

Code:
Private Sub Workbook_Open()
    UserForm1.Show
End Sub

Sla het document op, sluit het en open het.
 

Bijlagen

Dank Ahulpje, nu werkt het wel.
Ik heb van snb een hele mooie oplossing gekregen die werkt met variabelen, waardoor ik veel minder afzonderlijke cellen hoef te programmeren.
 
Mijn volgende vraag is of ik chkAEX of chkFonds1/2/3 automatisch op vbyes of true (welke moet ik gebruiken) als het veld "Per" is gewijzigd. Deze wijzigt automatisch als ik het doelpercentage verander.
Ik had iets geprobeerd met Intersect. Ik weet ongeveer hoe ik moet schrijven als een wijziging afhankelijk is van een cel, maar niet van een veld in formulier.

Wie geeft me een goede suggestie?
 
Zou handig zijn als je even vermeldt op welk werkblad of formulier "Per", doelpercentage, chkAEX en chkFonds staan.
Met 40 werkbladen, 6 formulieren en 23 modules is het wat veel zoekwerk.
 
1. stel een vraag
2. plaats een bestand dat louter en alleen betrekking heeft op de vraag
3. beschrijf de begintoestand
4. beschrijf en/of illustreer de gewenste eindtoestand
5. geef aan welke oplossingen je zelf al gemaakt hebt en waarom die niet het gewenste resultaat opleveren
 
Zou handig zijn als je even vermeldt op welk werkblad of formulier "Per", doelpercentage, chkAEX en chkFonds staan.
Met 40 werkbladen, 6 formulieren en 23 modules is het wat veel zoekwerk.
Het gaat om het formulier frmDoelenInstellen en al mijn vragen gaan over het bestand "Koersen AEX 2024 v4.32
1. stel een vraag
Hoe krijg ik het voor elkaar dat als het veld "Per" (van een of meer van alle 4 de velden) is gewijzigd, dat dan het veld chkDoelAEX+fonds 1-3 automatisch wordt aangevinkt. Zodra ik het veld Doel tov Opening wijzig, wordt het veld "Per" automatisch aangepast aan de huidige tijd afgerond op 5 minuten.
2. plaats een bestand dat louter en alleen betrekking heeft op de vraag
Zie het eerste antwoord, maar zal ik het voor de volledigheid nog een keer sturen?
3. beschrijf de begintoestand
4. beschrijf en/of illustreer de gewenste eindtoestand
Ik denk dat ik vraag 3 en 4 reeds heb beantwoord bij vraag 1.
5. geef aan welke oplossingen je zelf al gemaakt hebt en waarom die niet het gewenste resultaat opleveren
Voor het automatisch aanpassen van de tijd bij wijziging van het percentage-veld had ik deze macro gemaakt:
Code:
Private Sub txtDoelProcAEX_Change()
Opnieuw:
txtDoelAEX.Value = FormatNumber(txtOpeningAEX) * (1 + FormatNumber(txtDoelProcAEX / 100, 3))
On Error GoTo Opnieuw
txtPerAEX = FormatDateTime(Hour(Time) & ":" & Minute(Time) - Minute(Time) Mod 5, vbShortTime)
End Sub
Als ik het veld helemaal leeg maak, krijg ik de foutmelding
Typen komen niet met elkaar overeen
Daarvoor heb ik al de referentie "Opnieuw:" ingevoegd en onder de toewijzing van het veld
txtDoelAEX/1/2/3 "On Error Goto Opnieuw toegevoegd, maar ik blijf dezelfde foutmelding krijgen.

Voor het aanvinken van de checkboxen had ik de volgende macro in elkaar geflanst
Code:
Private Sub chkDoelAEX_Change(ByVal Target As Range)
If Not Intersect(Target, txtPerAEX) Is Nothing Then End
chkDoelAEX = vbYes
End Sub

Ik hoop dat ik nu voldoende informatie gegeven heb om mijn vragen te beantwoorden.
 

Bijlagen

Jouw bestand ter illustratie van je vraag kan hooguit 20Kb zijn als je voldoet aan punt 2

Interscet heeft louter betrekking op een werkblad (of een deel ervan).
Op geen enkele bewerking van een Userform is intersect van toepassing.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan