SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.Bij macro's die een bepaalde, merkbare, tijd nodig hebben om hun werk te doen is het van belang de gebruiker een idee te geven van wat er gebeurt, zeker met macro-optimalisatie aan kan het lijken alsof Excel is vastgelopen. Je kan bijvoorbeeld de statusbar een waarde geven, met eventueel een percentage van de reeds uitgevoerde code.SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.Mooi, grappig en cool
Een uitgebreide site met nuttige en minder nuttige excelsheetjes. Van kekke grafieken om je manager of leraar te betoveren via oscillogrammen en simulatoren tot pong voor als het weer een typische vrijdagmiddag is: Excelunusual
Verder
Alle vorige topics zijn hier terug te vinden.
Nieuw topic? Haal de OP uit de wikiIt's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
quote:Op maandag 18 juni 2012 12:42 schreef xyntarsus het volgende:
thx voor de hulp.
kan dit trouwens ook zonder dat ik het menu krijg (dat ie automatisch cel B2 pakt?)
Of als je alle sheets van je workbook in 1 keer wilt doen:quote:Op maandag 18 juni 2012 13:09 schreef qu63 het volgende:
[..]
Dan krijg je
[code]
Sub fok()
If Range("B2").Value <> "" Then ActiveSheet.Name = Range("B2").Value
End Sub
[/code]
als ik t goed heb..
1 2 3 4 5 6 7 8 | Sub fok() For Each sh In ActiveWorkbook.Worksheets sh.Activate If Range("B2").Value <> "" Then ActiveSheet.Name = Range("B2").Value Next sh End Sub |
ja maar die formule klopt dus nietquote:Op dinsdag 19 juni 2012 10:56 schreef ralfie het volgende:
hmm? je kunt toch gewoon rechtsklikken op de trendlijn en dan bij eigenschappen 'vergelijking in grafiek weergeven' aanvinken? Mocht je specifieke waarden nodig hebben gebruik je die formule om dat te berekenen
waarschijjnlijk moet je de datum waarvan je een waarde wilt weten nog omrekenen naar de seriele datum. Excel slaat een datum nl op als zoveel dagen na 0-januari-1900.quote:Op dinsdag 19 juni 2012 11:19 schreef andreas612 het volgende:
[..]
ja maar die formule klopt dus niet
Hier de code van vogeltjesdansquote:Op woensdag 20 juni 2012 10:32 schreef vogeltjesdans het volgende:
Het gaat om een excel document. Ik weet dat er een apart excel topic is, maar hier moet ook VBA code in dus ik post het even apart.
Waar het om gaat is het volgende. Ik heb een lijst met kolommen:
datum omschrijving behandelaar status
op deze kolommen pas ik een filter toe, waardoor ik makkelijk kan sorteren.
Wat ik wil is het volgende:
* selecteren op behandelaar
* afdrukbereik bepalen op behandelaar
* dit afdrukken
Dit heb ik in een macro gestopt (relatieve verwijzinng aangezet) met als volgend resultaat.
[ code zie onder ]
Dit werkt, maar de behandelaar heeft een telkens wisselend aantal rijen. Dus ik wil dat het afdrukbereik bepaald wordt op de rijen waar de betreffende behandelaar staat. Een soort =ALS functie, maar ik weet niet hoe ik dat in deze code moet invoeren.
Iemand?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Sub Sorteren() ActiveCell.Offset(5, 4).Range("A1").Select ActiveWorkbook.Worksheets("blad1").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("blad1").AutoFilter.Sort.SortFields.Add Key:= _ ActiveCell.Offset(-3, 0).Range("A1"), SortOn:=xlSortOnValues, Order:= _ xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("blad1").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveCell.Offset(-1, -5).Range("A1:J17").Select Selection.PrintOutCopies:=1, Collate:=True, IgnorePrintAreas:=False End Sub |
Het eerste probleem wat ik zie is dat deel() meerdere argumenten nodig heeft. Het tweede probleem is dat vind.alles (bij mij althans) slechts één tekst zoekt, en dus niet 1 of 2 of 3 of ...quote:Op woensdag 20 juni 2012 10:32 schreef jakees het volgende:
Ik probeer de eerste positie van een getal te vinden in een string. Ik gebruik office 2007 taal = NL. Nu heb ik de volgende functie gevonden
=als(deel(vind.alles({0;1;2;3;4;5;6;7;8;9};A1&"0123456789"))>LENgte(A1);0;deel(vind.alles({0;1;2;3;4;5;6;7;8;9};A1 &"0123456789")))
op 1 of andere manier werkt die formule niet. Kunnen jullie even kijken? Ik ben al een tijdje bezig en heb ook veel gezocht op internet, vind wel dingen maar die lukken op eoa. manier niet. Thx alvast!
1 2 3 | B1 = A1 & "1234567890" C1 = MIN(VIND.SPEC(1;B1);VIND.SPEC(2;B1);VIND.SPEC(3;B1);VIND.SPEC(4;B1);VIND.SPEC(5;B1);VIND.SPEC(6;B1);VIND.SPEC(7;B1);VIND.SPEC(8;B1);VIND.SPEC(9;B1);VIND.SPEC(0;B1)) D1 = ALS(C1>LENGTE(A1);-1;C1) |
Eerste positie van een getal (onderstaande functie bevestigen met CTRL+SHIFT+ENTER)quote:Op woensdag 20 juni 2012 10:32 schreef jakees het volgende:
Ik probeer de eerste positie van een getal te vinden in een string. Ik gebruik office 2007 taal = NL. Nu heb ik de volgende functie gevonden
=als(deel(vind.alles({0;1;2;3;4;5;6;7;8;9};A1&"0123456789"))>LENgte(A1);0;deel(vind.alles({0;1;2;3;4;5;6;7;8;9};A1 &"0123456789")))
op 1 of andere manier werkt die formule niet. Kunnen jullie even kijken? Ik ben al een tijdje bezig en heb ook veel gezocht op internet, vind wel dingen maar die lukken op eoa. manier niet. Thx alvast!
SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
[ Bericht 16% gewijzigd door Deetch op 20-06-2012 11:23:49 ]Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
Thanks! Maar als ik hem aanpas en uitvoer geeft hij een fout op de onderste regel, deze wordt geel:quote:Op woensdag 20 juni 2012 10:58 schreef Deetch het volgende:
[..]
Hier de code van vogeltjesdans
[ code verwijderd ]
vervang Range("A1:J17").Select door
Range("A1", Range("J65536").End(xlUp)).Select en hij zou moeten werken
tussen False en End Sub moet een ENTER (foutje bij kopieren van jouw code)quote:Op woensdag 20 juni 2012 11:34 schreef vogeltjesdans het volgende:
[..]
Thanks! Maar als ik hem aanpas en uitvoer geeft hij een fout op de onderste regel, deze wordt geel:
Selection.PrintOutCopies:=1, Collate:=True, IgnorePrintAreas:=FalseEnd Sub.
quote:Op woensdag 20 juni 2012 11:18 schreef Deetch het volgende:
[..]
Eerste positie van een getal (onderstaande functie bevestigen met CTRL+SHIFT+ENTER)
=MATCH(TRUE,ISNUMBER(-MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),0)
Alle getallen uit een string (onderstaande functie bevestigen met CTRL+SHIFT+ENTER)
=--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&{0,1,2,3,4,5,6,7,8,9})),SUM((LEN(A1)-LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},"")))))
Let op dat je de CTRL+SHIFT+ENTER gebruikt ipv gewone enter anders werken bovenstaande functies nietDeetch, zit jij op Excel of zo. 1 minpuntje aan je post. Het is niet duidelijk dat je op CTRL-SHIFT-ENTER moet drukken maar dat vergeef ik je ;-)SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.[ afbeelding ]
Toch nog een paar vraagjes. De eerste heb ik vertaald naar:
=VERGELIJKEN(WAAR;ISGETAL(-DEEL(A1;RIJ(INDIRECT("1:"&LENGTE(A1)));1));0) ik snap niet zo goed wat die doet.
Die 2e retourneert bij alle getallen in de string. Hartstikke mooi maar ik ben op zoek naar de 1e positie van het getal. Is daar nog makkelijk achter te komen. Bijvoorbeeld in de string. Oranjenummer1inBrazilie2014 wil ik als resultaat 13 terugkrijgen omdat daar de eerste string staat. Thx alvast weer!
=ISGETAL() is ook een 2007-functiequote:Op woensdag 20 juni 2012 12:38 schreef Deetch het volgende:
Die eerste functie geeft aan op welke positie het eerste getal staat, precies wat je zocht.
Ik weet alleen niet zeker of ISGETAL wel een excel 2007 functie is of dat die nieuw is in 2010. Krijg je daar een foutmelding? ook als je wel ctrl+shift+enter doet
Kutquote:Op woensdag 20 juni 2012 11:36 schreef Deetch het volgende:
[..]
tussen False en End Sub moet een ENTER (foutje bij kopieren van jouw code)
1 | =EXP(((-1*VB1)*VB2))*NORMSDIST(C24) |
Ik faal, hardquote:Op woensdag 20 juni 2012 14:16 schreef DaFan het volgende:
Dat heet een User Defined Function. Ga je zelf proberen of heb je hulp nodig?
quote:Op woensdag 20 juni 2012 12:38 schreef Deetch het volgende:
Die eerste functie geeft aan op welke positie het eerste getal staat, precies wat je zocht.
Ik weet alleen niet zeker of ISGETAL wel een excel 2007 functie is of dat die nieuw is in 2010. Krijg je daar een foutmelding? ook als je wel ctrl+shift+enter doet
Ik heb het vertaald naar:quote:Op woensdag 20 juni 2012 12:20 schreef jakees het volgende:
[..]
Deetch, zit jij op Excel of zo. 1 minpuntje aan je post. Het is niet duidelijk dat je op CTRL-SHIFT-ENTER moet drukken maar dat vergeef ik je ;-)
Toch nog een paar vraagjes. De eerste heb ik vertaald naar:
=VERGELIJKEN(WAAR;ISGETAL(-DEEL(A1;RIJ(INDIRECT("1:"&LENGTE(A1)));1));0) ik snap niet zo goed wat die doet.
Die 2e retourneert bij alle getallen in de string. Hartstikke mooi maar ik ben op zoek naar de 1e positie van het getal. Is daar nog makkelijk achter te komen. Bijvoorbeeld in de string. Oranjenummer1inBrazilie2014 wil ik als resultaat 13 terugkrijgen omdat daar de eerste string staat. Thx alvast weer!
Thx!!!! Ik wist niet dat je CTRL SHIFT ENTER moest gebruiken. Had hij wel even kunnen zeggen ;-) Maar die + deed het hem. Ik denk ook wel dat ik de formule ongeveer snap (een klein beetje iig).quote:Op woensdag 20 juni 2012 21:33 schreef snabbi het volgende:
=VERGELIJKEN(WAAR;ISGETAL(-DEEL(A1;RIJ(INDIRECT("1:"&LENGTE(A1)));1));0)
is juist (had Deetch gezegd CTRL SHIFT ENTER?)
Je hebt in jouw formule bij de A1 een + staan ipv een ;
Wat het eigenlijk doet is dat het in de cel zelf een nieuwe matrix aanmaakt (genaamd array). In deze matrix wordt op elke regel 1 karakter geplaatst. Vervolgens wordt van dit karakter bepaald of het een getal is of niet. Deze uitkomst (WAAR of ONWAAR) wordt opgeslagen op deze regel en daarna wordt de eerste regel met een WAAR teruggeven.
Het gebruik van de CTRL SHIFT ENTER zorgt ervoor dat je de array functie in de cel gebruikt. Dit kan je ook zien aan je formule doordat de formule tussen { } accolades worden weergegeven.
1 2 3 4 5 6 7 8 9 | Private Sub CommandButton2_Click() UserForm1.Hide Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets("TOTAAL").Select End Sub |
CloseMode is een 1 wanneer je zelf gebruik maakt van Unload Mequote:Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
'xxx
End If
End Sub
Nu kan je gewoon iets doen als:quote:Public Function BladBestaat(ByVal myName As String) As Boolean
On Error Resume Next
Bladbestaat = (Sheets(myName).Name <> "")
On Error GoTo 0
End Function
quote:Dim MyNewName As String
naamwerkblad:
MyNewName = InputBox("Hoe moet het tabblad heten")
If BladBestaat(MyNewName) Then
MsgBox ("Deze naam bestaat al")
GoTo naamwerkblad
End If
ActiveSheet.Name = MyNewName
Okquote:
1 2 3 4 5 | Public Function ExpNormSDist(x As Double, y As Double, z As Double) As Double ExpNormSDist = Exp(((-1 * x) * y)) * Application.WorksheetFunction.NormSDist(z) End Function |
1 | =ExpNormSDist(VB1;VB2;C24) |
1 2 3 4 5 | Public Function ExpNormSDist(z As Double) As Double ExpNormSDist = Exp(((-1 * Range("VB1").Value) * Range("VB2").Value)) * Application.WorksheetFunction.NormSDist(z) End Function |
1 | =ExpNormSDist(C24) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | Private Sub CommandButton1_Click() Item = TextBox1 ActiveSheet.Range("b2").Value = Item Item = TextBox2 ActiveSheet.Range("b3").Value = Item Item = TextBox3 ActiveSheet.Range("b4").Value = Item Item = TextBox4 ActiveSheet.Range("b5").Value = Item Item = TextBox5 ActiveSheet.Range("f2").Value = Item Item = TextBox6 ActiveSheet.Range("f3").Value = Item On Error GoTo fout ActiveSheet.Name = ActiveSheet.Range("B2") fout: MsgBox ("het nummer bestaat al, voer een nieuw nummer in") UserForm1.Hide Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets("basis").Unprotect Sheets("basis").Copy Before:=Sheets("basis") Sheets("basis").Protect Sheets("basis (2)").Select UserForm1.Show UserForm1.Hide End Sub |
Ok, laten we beginnen met een stukje voor de leesbaarheid van je code. Hiermee bedoel ik ook voorkomen dat je onnodig variabelen aanmaakt, danwel de code heel lang maaktquote:Op vrijdag 22 juni 2012 08:28 schreef xyntarsus het volgende:
thx voor de info wederom
ik heb voor de foutcontrole (bestaat de bladnaam al, zo ja geef een melding)
de volgende code
[ code verwijderd ]
Deze gaat dus lopen als ik op OK klik
Als ik nu een al bestaand project heb geeft hij ook de juiste foutmelding, en hij opent ook netjes
het userform opnieuw.
Hierna gaat het mis, alle nummers die ik invoer neemt hij als 'al bestaand' en ik kom er niet meer uit.
Als ik nu de functie beeindig en opnieuw opstart, blijft hij de fout loopen en kan ik geen nieuwe bladen maken.
Wie kan mij vertellen wat ik fout doe??
Nu naar je echte probleem. Hij loopt je code van boven tot beneden door. Dit houdt in dat hij je code van "fout" altijd uitvoert, ongeacht of het nu goed of fout gaat. Wat je dus moet doen is zorgen dat je code stopt, wanneer het niet fout gaat. In jouw geval krijg je dan zoiets:quote:[b2] = textbox1
[b3] = textbox2
[b4] = textbox3
[b5] = textbox4
[f2] = textbox5
[f3] = textbox6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Private Sub CommandButton1_Click() On Error GoTo fout [b2] = textbox1 [b3] = textbox2 [b4] = textbox3 [b5] = textbox4 [f2] = textbox5 [f3] = textbox6 ActiveSheet.Name = Range("B2") 'mag overigens ook zijn ActiveSheet.Name = [b2] 'wanneer het goed gaat moet hij nu stoppen, daarom zet ik hieronder End neer, je kan bijvoorbeeld ook een Goto Einde maken ofzo On Error GoTo 0 'Wanneer je iets met error handling doet, is het goed om wanneer je klaar bent met het afvangen van je error weer terug te verwijzen naar goto 0 zodat weer de normale Excel error naar voren kan komen. End fout: 'en hier je fout handling zoals je dat wil end sub |
Voor het eerste deel is er zover ik weet geen normale formule die je daar bij kunt helpen en moet je dus naar VBA en krijg je iets in de trant van:quote:Op donderdag 28 juni 2012 16:31 schreef xyntarsus het volgende:
en wederom ben ik er met een vraag.
Ik wil in het bestand dat ik aan het bouwen ben nog 2 extra dingen toevoegen.
1. een lijst van alle tabbladen (in mijn geval projectnummers)
waarbij dan een aantal gegevens uit het tabblad worden gezet in een lijst
2. een zoekfunctie waarbij ik een artikelnummer opgeef en die door meerdere tabbladen heen zoekt en kijkt of er in een bepaalde range cellen
(gedefinieerd door een artikelnummer aan het begin van de regel) niet lege cellen zijn.
deze regels met gegevens (dus de regels waarin in gegevens zijn ingevoerd) moet dan in een lijst
komen die weer begint met het projectnummer en dan de rest van de regel erachter zet
(en voor elk product in de zoekopdracht een lijst maakt)
Ik heb bij deze twee echter geen idee hoe ik moet beginnen
Wie helpt mij???
1 2 3 | For i = 1 To Sheets.Count ActiveCell.Offset(i - 1, 0).Value = Sheets(i).Name Next i |
1 2 3 4 5 6 7 8 | Private Sub CommandButton4_Click() Sheets.Add Before:=Sheets("totaal") ActiveSheet.Name = "Projectenlijst" For i = 4 To Sheets.Count -1 ActiveCell.Offset(i - 1, 1).Value = Sheets(i).Name Next i |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Sub test() j = 0 For i = 4 To Sheets.Count -1 If Sheets(i).Name = "totaalblad" Or Sheets(i).Name = "basistabel" Then j = j Else ActiveCell.Offset(j, 1).Value = Sheets(i).Name j = j + 1 End If Next i End Sub |
1 2 3 4 5 6 7 | Select Case Sheets(i).Name Case "totaal", "test" j = j Case Else ActiveCell.Offset(j, 1).Value = Sheets(i).Name j = j + 1 End Select |
Ik ben er van uitgegaan dat de sheetnamenlijst in b1 en daaronder staat, anders in de activesheet regel b1 veranderen in de gewenste celquote:Op vrijdag 29 juni 2012 14:15 schreef xyntarsus het volgende:
ok thx, dit werkt, ik kan nu een projectenlijst maken en updaten
enige wat hij nu niet doet, is projecten die er niet meer zijn weghalen,
is er een mogelijkheid dat ik dta kan invoegen?
1 2 3 4 5 6 7 8 9 10 11 12 | Sub sheetbestaatnietmeer() On Error Resume Next ActiveSheet.Range("b1", ActiveSheet.Range("b1").End(xlDown)).Select For Each c In Selection If Sheets(c.Value).Name = "" Then c.EntireRow.Delete Next c On Error GoTo 0 End Sub |
Tja eigenlijk blijf ik wel van mening dat je eigenlijk al je data in 1 tabblad moet zetten. Wanneer je verschillende dwarsdoorsnedes wilt maken van je gegevens set kan je dat veel makkelijker via een pivot tabel regelen. Dan kan je tenminste zeggen ik wil alles van 1 project zien, of 1 product over alle projecten heen.quote:Op vrijdag 29 juni 2012 10:00 schreef xyntarsus het volgende:
voor het tweede deel van mijn vraag:
omdat ik ook een lijst per project wil kunnen uitdraaien, en ik iedere keer dezelfde tabel heb
voor een project (in de rijen de producten en in de kolommen 52 weken) wordt het heel onoverzichtelijk om dat in 1 blad te doen.
vandaar de keuze om voor elk project (pakweg 50 tegelijk meestal) een apart tabblad te maken, mijn 1e blad is dan een totaalblad dat optelt door de bladen heen.
Ik heb laatst een vergelijkbare opzet gezien, maar helaas krijg ik daar de code niet van :S
Dat is eigenlijk wel beter voor xyntarsus' gebruik. Maar ja, access is engquote:
Falerquote:Op maandag 2 juli 2012 08:20 schreef Deetch het volgende:
[..]
Dat is eigenlijk wel beter voor xyntarsus' gebruik. Maar ja, access is eng
zucht, IT op de werkplekquote:Op maandag 2 juli 2012 10:43 schreef xyntarsus het volgende:
access is niet eng hoor
maar acces is niet beschikbaar op het netwerk hier
moet het doen met word en excel....
en wat betreft de aparte tabbladen, ook dat is een soort van
'opgelegde eis' :S
pivot tables zouden inderdaad kunnen als alles in 1 blad stond.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Sub zoek(ByRef Sheet As Worksheet, ByRef Targetcell As Range, ByRef qrySearch As String, ByRef numcolumns As Integer) Dim zoekrange As Range, lastrow As Integer, cell As Range Set zoekrange = Sheet.Range("A:A")'Waar gaan we zoeken? Set cell = Sheet.Cells(1, 1)'De eerste cell in de kolom lastrow = 0 Do Set cell = zoekrange.Find(qrySearch, cell, xlValues, xlPart, xlByColumns, xlNext) If cell Is Nothing Then Exit Sub'zoekopdracht nergens gevonden If cell.Row < lastrow Then Exit Sub'voorbij einde van kolom lastrow = cell.Row Targetcell.Value = Sheet.Name If WorksheetFunction.CountA(Sheet.Rows(lastrow)) > 1 Then'Er zitten niet-lege cellen in deze rij Sheet.Range("A" & lastrow).Resize(ColumnSize:=numcolumns).Copy Targetcell.Offset(ColumnOffset:=1).Resize(ColumnSize:=numcolumns) Set Targetcell = Targetcell.Offset(Rowoffset:=1) End If Loop End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Sub test() dim rngDoelwit as Range dim strQry as string dim numCols as integer 'hoeveel kolommen moeten er gekopieerd worden numCols = 10 'Je zoekopdracht strQry = "1*" 'Waar moeten de resultaten komen set rngDoelwit = ActiveCell For i = 4 To Sheets.Count -1 If Sheets(i).Name <> "totaalblad" And Sheets(i).Name <> "basistabel" Then zoek Sheets(i), rngDoelwit, strQry, numCols End if Next i End Sub |
1 2 | item = textbox activesheet.name = ' "art"' &item' |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |