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 |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |