Script uit VBA stoppen en starten?

Status
Niet open voor verdere reacties.

Killerclown

Gebruiker
Lid geworden
30 dec 2007
Berichten
181
Goeieavond iedereen,

Ik heb in VBA (excel) een "scriptje" gemaakt dat vanalles uitvoert wanneer een cel aangeklikt wordt.
Nu zou ik een button willen maken die ervoor zorgt dat je het script uit VBA stop zet en deze niks meer doet en een 2de button om dan alles terug aan te zetten zodat alles weer werkt.

Is dat mogelijk? Ik heb al gegoogled maar hetgene wat ik zoek, niet gevonden.
Buttons maken is het probleem niet maar de code achter de button om alles te stoppen en te starten, daar wringt het schoentje.

Kan iemand mij helpen of op weg helpen?

Alvast dank.
 
Neem een globale variabele van het type Boolean op.
Achter het knopje zet je deze dan op True als hij False is en andersom.
In het andere script doe je dan een controle of die variabele True is, zoniet dan Exit Sub.
 
Kan je me even op weg helpen wat je juist bedoeld (eventueel een voorbeeldje?)
Ik ben maar een beginneling op het vlak van VBA :-s

Alvast dank!
 
Laatst bewerkt door een moderator:
Een globale variabele is een variabele die je in een (aparte) module opneemt, dus niet op het codeblad van Blad1 om maar wat te noemen. In het VBA venster moet je dus via <Invoegen>, <Module> een nieuwe module toevoegen als je nog geen extra modules hebt. Als je een keer een macro hebt opgenomen, heb je die overigens al, want Excel en Word maken zelf een nieuwe module aan.
In die module zet je dan de variabele:

Code:
Public bCheck as Boolean
bijvoorbeeld. Deze code maakt een publieke variabele aan die je overal kunt aanroepen.

Nu zou ik een button willen maken die ervoor zorgt dat je het script uit VBA stop zet en deze niks meer doet en een 2de button om dan alles terug aan te zetten zodat alles weer werkt.

Overigens betwijfel ik of je daar wat aan hebt, want ik snap nog niet echt wat je wilt bereiken. Een macro halverwege pauzeren? Een macro die je gestart hebt, loopt echt wel door totdat je een commando geeft dat hij moet stoppen. Dus je zult dat stopmoment ergens in de code moeten inbouwen.
 
Alvast dank voor het woordje uitleg.

Hetgeen ik nu gemaakt heb, is het volgende.
Wanneer iemand een cel aanklikt in excel, verschijnt er een form op het scherm. Deze checkt de eerste cel van de kolom en de eerste cel van de rij. Die worden automatisch in het formulier ingevuld. Nu kan je via dat formulier de waarde in de cel veranderen door in het veld iets nieuw in te typen. Wanneer je dan ok drukt, verandert de cel in excel in de nieuwe waarde maar wordt er ook een email verstuurd met de gegevens van het formulier en de oude en nieuwe waarde van de cel.

De start- en stop-knop heeft dus als bedoeling dat je het script kan stoppen zodat je cellen kan aanklikken zonder dat het formulier verschijnt met als bedoeling zelf aanpassing te doen zonder dat ikzelf mail krijg.
(en dan terug eventueel het script te starten wanneer aanpassingen gebeurd zijn of automatisch starten wanneer je het bestand terug opent)

Daarvoor dient dus de start en stop en daar zit ik een beetje vast :s
 
Laatst bewerkt door een moderator:
Je hoeft niet elk antwoord te quooten, zelfs liever helemaal niet, want de tekst stond er toch al boven. Bovendien is het lelijk ;) Moderators willen dan ook overbodige quoots (al 2 in dit draadje) verwijderen. Dus graag niet meer quooten, en bij voorkeur de vorige verwijderen.

Wat betreft je vraag: dat gaat niet lukken met een start en stopknop. Zoals ik al zei: ik denk niet dat je op die manier code tijdelijk kunt onderbreken, en je zou dat ook niet moeten willen. Ik heb zelf dit soort zaken opgelost door een check te doen op User naam. Als ik een bestand open, wordt het formulier standaard niet getoond, bij normale gebruikers wel. Op die manier kan ik snel aanpassingen maken aan het formulier (want daar is het volgens mij toch om te doen?).
 
De vraag is dus inderdaad of je met die knop een lopend script wilt stoppen of dat je wilt voorkomen dat 'ie kan starten.
In het laatste geval kan het wel, in het eerste niet, zoals Octafish al opmerkt.
 
Mijn excuses voor het quoten :-)

Hmmmmm...de start en stop is misschien inderdaad wat ver gezocht.
Op usernaam checken is misschien betere oplossing.
Even googelen of ik iets bruikbaars vindt :-)
 
Die check is heel simpel:

Code:
        Select Case Environ("UserName")
            Case "kdejong"
            Case "pdevries"
            Case "admin"
            Case "octafish"
            Case Else
                Aanvraagformulier.Show
        End Select

Deze code gebruik ik in mijn opstart routine. Als ik inlog, verschijnt het menu niet, net als bij kdejong etc. Simpel dus!
 
Hmmm...dat ziet er simpel uit.
Hetgeen ik al gevonden had via google was heel wat uitgebreider.

Ik heb het even getest maar ik krijg een compileerfout op "UserName" :-s

En wordt er gecheckt op de username van windows of van excel?

Alvast dank.
 
Environ kijkt naar de naam van de ingelogde gebruiker. Dus de Windows naam. Doet dit het wel?
Code:
Sub testje()
    MsgBox Environ("UserName")
End Sub
Zo nee: welke Windows versie gebruik je?
 
Nee, dit doet helemaal niks.
Ikzelf heb windows7 waar ik het nu op test.
Maar de bedoeling is dat ik het gebruik op mijn werk en daar is het Windows Server 2003.

Misschien dat het daar wel werkt. Ik test het morgen even. :-)
 
Ook op Windows 7 werkt dat gewoon.
Laat het stukje code eens zien dat je ervoor hebt gemaakt.
 
Dit staat op het werkblad

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    
    Dim naam As String
    Dim datum As String
        
    If Not Intersect(Target, Range("B4:H40")) Is Nothing Then
        Load UserForm1
        naam = ActiveSheet.Cells(ActiveCell.Row, 1).Value
        datum = Cells(3, ActiveCell.Column).Value
             
        UserForm1.TextBoxOud.Text = CStr(ActiveCell.Value)
        UserForm1.TextBoxNaam.Text = CStr(naam)
        UserForm1.TextBoxDatum.Text = CStr(datum)
        
        UserForm1.Show
     
     End If
     
     End Sub

En dit is het formulier:

Code:
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Private Sub CommandButton1_Click()
If TextBoxNaam.Value = "ikke" Then MailIkke
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub CommandButton3_Click()
    ActiveCell.Value = TextBoxNieuw.Value
    Unload Me
End Sub

Private Sub TextBoxNieuw_Change()
TextBoxNieuw.Value = UCase(TextBoxNieuw.Value)
End Sub
    
Sub MailIkke()
    
    Dim Email As String, Subj As String
    Dim Msg As String, URL As String
        
        Email = "ikke@email.be"
        
'       Message subject
        Subj = "Wijziging " & TextBoxDatum.Value

'       Compose the message
        Msg = ""
        Msg = Msg & "Op " & TextBoxDatum.Value & " wijzigt " & TextBoxNieuw.Value & " in plaats van " & TextBoxOud.Value
                
'       Replace spaces with %20 (hex)
        Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
        Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
                
'       Replace carriage returns with %0D%0A (hex)
        Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, "%0D%0A")

'       Create the URL
        URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg

'       Execute the URL (start the email client)
        ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus

ActiveCell.Value = TextBoxNieuw.Value
Unload Me

End Sub

Dus nu moet ik enkel nog iets toevoegen zodat als ik ingelogd ben, ik het formulier wel krijg en iemand anders niet.
 
Ik bedoelde eigenlijk het stukje voorbeeld van Octafish, waarvan je zegt dat het niet werkt.
Want z'n voorbeeld is gewoon goed en werkt overal.
 
Ik had gewoon zijn stukje code geplakt in VB :-)
Blijkbaar is dat dus niet voldoende :-s
 
Ik zie 'm anders niet staan in je eerste codeblok?
 
Ik zou dus zoiets verwachten:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim Naam As String, Datum As String
        
    If Not Intersect(Target, Range("B4:H40")) Is Nothing Then
        Select Case Environ("UserName")
            Case "kdejong"
            Case "pdevries"
            Case "admin"
            Case "octafish"
            Case Else
                Load UserForm1
                Naam = ActiveSheet.Cells(ActiveCell.Row, 1).Value
                Datum = Cells(3, ActiveCell.Column).Value
                     
                UserForm1.TextBoxOud.Text = CStr(ActiveCell.Value)
                UserForm1.TextBoxNaam.Text = CStr(Naam)
                UserForm1.TextBoxDatum.Text = CStr(Datum)
                UserForm1.Show
        End Select
     End If
     
End Sub
 
Lol...ik had het verkeerde werkblad hier geplakt. Het stond op het andere werkblad.
Daarmee dat het ook niet werkte, als je op het verkeerde blad bezig bent. Dom van mij :-)

Nu werkt het dus wel :-)

Kan ik het nu ook omdraaien zodat degene die ik definieer als username wel het formulier krijgen en de rest niet?
 
Ik heb het gevonden. Dit is het geworden:

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    
    Dim naam As String
    Dim datum As String
        
    If Not Intersect(Target, Range("B4:H40")) Is Nothing Then
          Select Case Environ("UserName")
            
            Case "Moi"
            
                 Load UserForm1
                 naam = ActiveSheet.Cells(ActiveCell.Row, 1).Value
                 datum = Cells(3, ActiveCell.Column).Value
             
                 UserForm1.TextBoxOud.Text = CStr(ActiveCell.Value)
                 UserForm1.TextBoxNaam.Text = CStr(naam)
                 UserForm1.TextBoxDatum.Text = CStr(datum)
                 UserForm1.Show
            
            Case "Ikke"
                        
                 Load UserForm1
                 naam = ActiveSheet.Cells(ActiveCell.Row, 1).Value
                 datum = Cells(3, ActiveCell.Column).Value
             
                 UserForm1.TextBoxOud.Text = CStr(ActiveCell.Value)
                 UserForm1.TextBoxNaam.Text = CStr(naam)
                 UserForm1.TextBoxDatum.Text = CStr(datum)
                 UserForm1.Show
              
            Case Else
            
            
     End Select
     End If
     End Sub

Dit weekend de test op het werk. Hopelijk werkt het naar behoren. Thuis werkt het in ieder geval.

Alvast dank aan OctaFish en Edmoor voor de hulp!!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan