• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Formule niet zichtbaar in cel.

Status
Niet open voor verdere reacties.

BastS

Gebruiker
Lid geworden
12 mrt 2015
Berichten
52
Hallo allen,

Momenteel vul ik cellen in een excel sheet middels een macro. Ik vraag mij af of het mogelijk is dat alleen de uitkomst in de cel komt te staan en niet de formule.

Code:
Sheets("Rekenblad").Range("b3", "B" & LastRow).Formula = "=LEFT(RIGHT(RC[-1],5),2)+1"
Range("b3", "b" & LastRow).NumberFormat = "General"

Ik snap dat door bovenstaande code de formule in de cel blijft staan. Maar is het mogelijk deze te laten verdwijnen en alleen de waarde die aan de hand van de formule wordt berekend te laten zien?
 
zo kan

Code:
With Sheets("Rekenblad").Range("b3", "B" & LastRow)
.Formula = "=LEFT(RIGHT(RC[-1],5),2)+1"
.NumberFormat = "General"
.Value = .Value
End With

Maar waarom een formule in de macro gebruiken als je dit ook met een macro kunt bereken?

Code:
For Each cl In Sheets("Rekenblad").Range("b3", "B" & lastrow)
    sn = sn & Left(Right(cl.Offset(, -1), 5), 2) + 1 & "|"
Next

Sheets("Rekenblad").Range("b3").Resize(UBound(Split(sn, "|"))).Value = Application.Transpose(Split(sn, "|"))

Niels
 
Laatst bewerkt:
Ik dacht dat for-next loops vertragen. Ik werk met meerdere kolommen vandaar.
Maar de code werkt bedankt.
 
Niet als je niet steeds naar het werkblad wegschrijft, va daar eerst in een variabele en dan in een keer naar het werkblad.


Niels
 
Okee, duidelijk. Als ik een als formule voor 35000 rijen heb, wat werkt sneller jouw methode of de methode die al reeds geprogrammeerd is?
 
Het gaat om deze formule:
Code:
Sheets("Rekenblad").Range("i3", "i" & LastRow2).Formula = "=IF(RIGHT(RC[-8],2)=""00"",SUMIFS(R3C[-1]:R23230C[-1],R3C[-6]:R23230C[-6],RC[-6]),"""")"
 
dat zul je even uit moeten proberen,
ik heb nu niet de tijd om in je formule te duiken om deze om te zetten naar VBA
is zo ie zo lastig zonder voorbeeldbestand

Niels
 
Dat gaat in VBA altijd sneller.
Maar plaats eens een voorbeeldbestand (ik vermoed dat het over grootboekrekeningen gaat); maakt het bedenken van alternatieven veel eenvoudiger.
 
Laatst bewerkt:
Ik zal vanavond een voorbeeld bestand plaatsen, het huidige bestand is veels te groot. En bevat informatie die ik liever niet online heb.
De resultaten van de berekeningen moeten in een grafiek geplot worden. Het blijkt nu dus ook dat je vanuit een array een grafiek kunt
plotten, iets wat ik niet wist.
Dus misschien hoef ik helemaal niet meer weg te schrijven naar een werkblad, dat zal een hoop tijd besparen.
 
Hallo,

Ik heb nu een voorbeeld bestandje, echter wegens de grootte is hier extreem veel uitgeknipt.

Mijn werkelijke bestand bestaat uit:

Invoerblad
- Waarin ik aangeef van welk station ik de Temperaturen van het KNMI wil downloaden.
- Een cel waarin ik aangeef hoeveel elektra meters het project uit bestaat.
- En twee kolommen waar ik de tijdstippen en verbruiken aangeef.

Het rekenblad
Deze is als bijlage toegevoegd.
- Kolommen a t/m g zijn berekend in de module "standaard"
- Kolommen h t/m n zijn berekend in de module "verbruik filteren"

De berekeningen in de module standaard gaan normaal redelijk snel.
Echter de berekeningen in "verbruik filteren" kosten echt veel tijd. En voor het "sluimerverbruik" is er een matrix formule nodig. Hierom dacht ik om deze formules in een array te doen. En dan in een "list" te zetten en daarvan een grafiek te maken. Dus niet meer schrijven naar het werkblad.
Ik neem aan dat ik dan mijn gewenste snelheid heb?

In voorbeeld bestand maar een paar regels met datapunten, normaal heb ik alle kwartierdata van een jaar.

Temperatuurblad
- hier staan temperaturen die afkomstig zijn van het KNMI deze worden ook volgens een macro binnengehaald. Alleen deze macro is buiten het bestand gelaten.
 
Op 18 maart 1015 schreef ik in een ander topic van je:
Herhalingen van dezelfde code moet je zoveel mogelijk voorkomen.
en:
Opmaak van cellen en randen via vba instellen werkt ook nogal vertragend.
Als opmaak en kolombreedte onveranderlijk blijven, dan kun je die beter
eenmalig handmatig instellen dan steeds met een macro.
Je antwoordde toen dat je het begrepen had, maar daar is in je code in dit topic niks van te merken!
Plaats code tussen 'With...End With' als die betrekking heeft op hetzelfde object (blad of bereik). En doe vaste opmaak handmatig in plaats van via vba. Verwijder dus deze code (waarin je trouwens 3 x hebt verzuimd punten te plaatsen):
Code:
With Range(Cells(2, 1), Cells(2, 7))
.ColumnWidth = 16
.Font.Name = "arial"
.Borders(xlEdgeBottom).Weight = xlThin
.Font.Bold = True
.Font.Size = 10
End With
en doe dat (eenmalig) handmatig, die code heeft immers betrekking op een vaststaand bereik.
Hetzelfde (verwijderen en handmatig doen) geldt voor:
Code:
With Sheets("Rekenblad").Range("a3:g" & Range("A" & Rows.Count).End(xlUp).Row)
.HorizontalAlignment = xlRight
.Font.Name = "arial"
.Font.Size = 10
End With
en voor:
Code:
Range("b3", "b" & LastRow).NumberFormat = "General"
en alle andere kolommen met dezelfde opdracht
Uitvoer van bovenstaande codes duurt veel langer dan het uitvoeren van een for-next-lus over 1000 rijen voor het berekenen van waarden.

Als je een macro gebruikt kun je de formules daarin best niet in het blad plaatsen maar door de macro laten berekenen (maar dat is hierboven al geschreven).
 
Laatst bewerkt:
Hallo,

Ik heb alle codes die te maken hebben met stijl en opmaak verwijderd. En heb getracht alle berekeningen in een macro te zetten.
Dit is bij een aantal berekeningen gelukt. Maar bij drie berekeningen niet:confused:
Code:
'Tijdstip afgerond
For Each cl In Sheets("Rekenblad").Range("c3", "c" & LastRow)
 lngdate = DateValue(cl.Offset(, -2))
 sglTime = TimeValue(cl.Offset(, -2)) * 24
 dhRoundTime = Format(lngdate, "yyyy-mm-dd") & " " & Format((WorksheetFunction.RoundUp(sglTime, 0) / 24), "hh:mm")
 sn_b = sn_b & dhRoundTime & "|"
Next
Sheets("Rekenblad").Range("c3").Resize(UBound(Split(sn_b, "|"))).Value = Application.Transpose(Split(sn_b, "|"))

De waarde die uit deze berekening komt rollen is goed, echter ik krijg hem als "d-m-jjjj uu:mm" terug en ik wel hem als "yyyy-mm-dd uu:mm" terug hebben. Dit kan ik handmatig corrigeren alleen bij de zoekfunctie refereer ik naar deze kolom en dan heeft hij alsnog de verkeerde waarde.

Code:
'Verschil in dagen
For Each cl In Sheets("Rekenblad").Range("d3", "D" & LastRow)
    'sn_c = sn_c & WorksheetFunction.Days(cl.Offset(, -3), R3C1) + 1 & "|"
    sn_c = sn_c & (DateDiff(D, cl.Offset(, -3), R3C1) + 1) & "|"
Next
Sheets("Rekenblad").Range("d3").Resize(UBound(Split(sn_c, "|"))).Value = Application.Transpose(Split(sn_c, "|"))

Hier staan twee van de methoden die ik geprobeerd heb om het verschil in dagen te berekenen, ik krijg of nul als waarde of een extreem hoge waarde. Volgens mij is de tweede datum (R3C1) niet goed.

Code:
'Temperatuur
For Each cl In Sheets("Rekenblad").Range("g3", "g" & LastRow)
    sn_f = sn_f & Application.WorksheetFunction.VLookup(cl.Offset(, -4), Sheets("Temperatuur").Range("c2", "D" & (Cells(Rows.Count, "d").End(xlUp).Row)), 2) & "|"
Next
Sheets("Rekenblad").Range("g3").Resize(UBound(Split(sn_f, "|"))).Value = Application.Transpose(Split(sn_f, "|"))

Hier werkt de verticaal zoek functie niet, ik vermoed dat er iets niet goed zit in de range maar heb zelf alles geprobeerd en kom er niet uit.
 
De datum notatie is al opgelost. Blijkbaar slikt vba de dubbele punt niet.
Code:
For Each cl In Sheets("Rekenblad").Range("c3", "c" & LastRow)
 lngdate = DateValue(cl.Offset(, -2))
 sglTime = TimeValue(cl.Offset(, -2)) * 24
 dhRoundTime = Format(lngdate, "YYYY-MM-DD") & " " & Format((WorksheetFunction.RoundUp(sglTime, 0) / 24), "HH.MM")
 sn_b = sn_b & dhRoundTime & "|"
Next
Sheets("Rekenblad").Range("c3").Resize(UBound(Split(sn_b, "|"))).Value = Application.Transpose(Split(sn_b, "|"))

Zo doet hij het wel:D
 
Zoek in de VBEditor onder F1 'datediff( .. , .. ,..)'
 
Code:
DateDiff ( interval, date1, date2, [firstdayofweek], [firstweekofyear])

Laatste twee zijn optioneel en bij interval heb ik d en dd geprobeerd. Dus het zit waarschijnlijk in de verwijzing naar date 2.
Maar ik weet niet hoe ik anders moet verwijzen naar een cel die niet veranderd.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan