VBA / Macro stoppen na uitvoering

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Ik ben bezig een Excelsheet te maken waarin diverse macro's zijn opgenomen. Alle macro's werken zoals ik het wil. Ik loop echter tegen 1 probleem aan. Als ik 1 cel (E16) verander van Nee naar Ja voert de Macro netjes uit.
Echter als ik daarna een willekeurige andere cel aanpas blijft de macro steeds teruggaan naar de cel in de macro. (E17)

Wat doe ik fout?
Ik wil de macro uitvoeren als de cel waarna hij verwijst wordt aangepast. Als ik een andere cel aanpast dient deze niet uitgevoerd te worden.

Ben nog nieuw met macro's en heb al uitgebreid gegoogled.

Mijn Macro:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub WeergevenPuntentelling()

If Range("E16").Value = "Nee" Then
Range("E17").Select
Selection.Locked = True
Range("E16").Select

Else
 
Range("E17").Select
Selection.Locked = False
Range("E16").Select
Run ("Weergevenaanwijzigingen") ' Nieuwe macro uitvoeren

End If


End Sub


Alvast bedankt voor alle info!

[ Voor 0% gewijzigd door Lustucru op 17-09-2014 16:17 . Reden: Codetags toegevoegd ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Een macro stopt vanzelf als hij klaar is :)

Maar wat meteen opvalt in je code is dat hij idd altijd e16 en E17 zal selecteren: die regels kom je in zowel het if als in het else blok tegen. Vervolgens roep je een andere sub aan en die zal ook wel een en ander doen, maar wat?

En, hoe start je die macro eigenlijk?

Ot: gebruik ajb [code=vb][/code] tags. Maakt je post veel beter leesbaar. Ik zet ze er nu voor deze keer voor je in.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Zoals de macro nu is, wordt na afloop van de macro (even afgezien van wat "Weergevenaanwijzigingen" doet) ALTIJD E16 geselecteerd (niet E17 zoals jij schrijft), want dat heb je zelf zo bepaald. Zowel onder "If" als onder "Else" staat immers op het eind: Range("E16").Select . Als je wat anders wil, dan moet je dat op 1 van die twee plaatsen wijzigen.

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Ik start een eerdere macro via
Private Sub Worksheet_Change(ByVal Target As Range)

Ik had eerst 4 macro's bij elkaar staan. Via google zag ik dat het beter zou zijn om ze los te zetten en in een macro te verwijzen naar de volgende. Je probeert wat hè ;)

De eerste macro werkt zonder problemen. Hierin wordt ook niet verwezen naar een bepaalde cel. Maar laat tabbladen zien of verbergt deze als een waarde naar ja of nee gaat.

De overige 2 macro's kun je vergelijken met de macro in mijn eerste post. Als een waarde naar Ja gaat wordt een cel vrijgegeven en anders geblokkeerd
In de laatste macro wordt verwezen naar cel E18.

Als ik daarna een willekeurige andere cel aanpas, ook al is het een cijfer of een naam dan verspringt Excel naar E18. Dit laatste is wat mij irriteert. Het is nogal een groot scherm waarin je wat waarden kan vullen. Als hij steeds terugspringt naar E18 is dit niet praktisch.

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Je wilt ueberhaupt de .Select()-functie niet gebruiken. Een veelgemaakte en begrijpelijke fout, door gebruik te maken van code uit macro-opnemen. Dat levert net zulke goede code als dat Google translate zorgt voor goede vertalingen: het werkt meestal, het is begrijpelijk, maar toch.. Je kunt prima doen wat je wilt met de gewenste cel zonder te selecteren. Roep 'em direct aan. Bijvoorbeeld
Visual Basic:
1
Worksheets("Sheet1").range("E17").formula = "=1+2"


En als je de informatie aan andere macro's wilt doorgeven dan kan dat met parameters, zoals je ook ziet gebruikt worden in de Worksheet_Change hierboven. Of met een global variabele (zoek op public).

[ Voor 5% gewijzigd door F_J_K op 18-09-2014 09:45 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Het is lastig als je in je tekst andere cellen gebruikt dan waar in je macro naar wordt verwezen, dat maakt goed antwoorden er niet eenvoudiger op. Eerst had je het over E17 wat E16 moest zijn, nu heb je het over E18, terwijl die cel niet in je macro voorkomt.
Als een waarde naar Ja gaat wordt een cel vrijgegeven en anders geblokkeerd.
In jouw macro gaat er geen enkele waarde naar Ja. Je zegt wel in de macro wat er moet gebeuren als E16 "Nee" is, maar niet wat er moet gebeuren als E16 "Ja" is. Onder "Else" staat immers onmiddellijk: Ga naar E17 als E16 niet gelijk is aan "Nee". Maar niet gelijk aan "Nee" wil niet zeggen dat E16 dan als "Ja" wordt beschouwd. Dus wat je ook doet (een andere cel aanpassen, een cijfer invoeren, of helemaal niets), als E16 geen "Nee" is, zal ALTIJD E17 geselecteerd worden. Wil je dat E17 alleen geselecteerd wordt als E16 "Ja" is, wijzig je macro dan als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub WeergevenPuntentelling()
If Range("E16").Value = "Nee" Then
Range("E17").Select
Selection.Locked = True
Range("E16").Select
Else
If Range("E16") = "Ja" Then
Range("E17").Select
Selection.Locked = False
End If
Run ("Weergevenaanwijzigingen")
End If
End Sub


Houd er verder ook rekening mee dat het van belang is dat in E16 de tekst wordt ingevoerd zoals je in de macro schrijft, "Nee" is daarbij niet hetzelfde als "nee".

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Ik heb je code ingevoerd. Dit in mijn tabblad Gegevens. met Private Sub Worksheet_Change(ByVal Target As Range)

De verwijzing naar de volgende macro heb ik weggehaald, om te voorkomen dat deze opstart en het resultaat beïnvloed.

Cel E16 is een keuzebox gemaakt via gegevensvalidatie. Vaste keuzes zijn Ja en Nee. Dit is ook zo in mijn Macro aangegeven, dus met Hoofdletter.

Als ik jouw aangepaste macro gebruik gaat hij alsnog bij iedere mutatie in een willekeurige cel terug naar cel E16 zodra E16 of Ja staat.

Als ik het gedeelte
Visual Basic:
1
 Range("E16").Select 

weghaal gaat hij naar E17, eigenlijk logisch want ik roep deze 2 regels eerder ook aan.

Het lijkt erop dat de macro zich toch bij iedere cel die ik muteer weer opstart. Ik wil deze alleen uitvoeren als cel E16 gemuteerd wordt.


Het gedeelte dat F_J_K doorgeeft kan ik helaas met mijn beperkte kennis niet thuisbrengen.
Maar ik ga hierop googlen.

Dank u allen

  • Belindo
  • Registratie: December 2012
  • Laatst online: 18:53

Belindo

▶ ─🔘─────── 15:02

F_J_K bedoelt dat je verschillende stappen kunt combineren.

In plaats van:


Visual Basic .NET:
1
2
3
Sheets("Sheet1").Select
Range("A10").Select
Activecell.Value = "Bladiebla"



Kun je onderstaande ook bereiken door:

Visual Basic .NET:
1
Sheets("Sheet1").Range("A10").Value = "Bladiebla"


Zo wordt er niets geselecteerd, en verspringt je cell ook niet meer.

En als je bijvoorbeeld boven je eerste Macro zet:
Visual Basic:
1
Global myVar as String

kun je myVar door meerdere macro's heen blijven gebruiken.

[ Voor 17% gewijzigd door Belindo op 18-09-2014 11:06 . Reden: Toevoeging Global ]

Coding in the cold; <brrrrr />


Verwijderd

key schreef op donderdag 18 september 2014 @ 10:58:
Cel E16 is een keuzebox gemaakt via gegevensvalidatie. Vaste keuzes zijn Ja en Nee.
Had dat dan meteen vermeld, dat had ons heel wat tijd en moeite bespaard !
Als ik jouw aangepaste macro gebruik gaat hij alsnog bij iedere mutatie in een willekeurige cel terug naar cel E16 zodra E16 of Ja staat.
In mijn Excelbestand niet, daar wordt in die situatie niet E16 maar E17 geselecteerd.
Het lijkt erop dat de macro zich toch bij iedere cel die ik muteer weer opstart. Ik wil deze alleen uitvoeren als cel E16 gemuteerd wordt.
Gebruik dan dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("E16"), Target) Is Nothing Then
If Range("E16").Value = "Nee" Then
Range("E17").Select
Selection.Locked = True
Range("E16").Select
Else
If Range("E16") = "Ja" Then
Range("E17").Select
Selection.Locked = False
End If
End If
End If
End Sub

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub WeergevenPuntentelling()



If Range("E16").Value = "Nee" Then
Sheets("Gegevens").Range("E17").Locked = True

Else
 
If Range("E16").Value = "Ja" Then
Sheets("Gegevens").Range("E17").Locked = False

End If

Run Weergevenaanwijzigingen()

End If

End Sub


Lijkt al goed te werken. hartelijk dank!
Ik ga nu aan de slag met de volg macro's maar dat moet met deze info zeker lukken.

Ik moet me toch eens verder verdiepen in macro's...

[ Voor 7% gewijzigd door key op 18-09-2014 11:46 ]


Verwijderd

Key,
eerder hierboven schreef je dat je een "Private sub Worksheet_Change" gebruikt, waarom plaats je hierboven dan weer een gewone macro? Als je die laatse gebruikt, zullen de wijzigingen die ik heb aangebracht niet werken hoor!

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Klopt als een bus.

Typfoutje. Inmiddels netjes aangepast en ben verder aan het knutselen.

  • key
  • Registratie: November 2001
  • Laatst online: 26-10 12:44
Het topic mag wat mij betreft dicht.
Dankzij bovenstaande berichten werken alle macro's precies zoals ik wil


Allen bedankt
Pagina: 1