• 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.

Een Macro automatisch Starten

Status
Niet open voor verdere reacties.

FonsBleijendaal

Gebruiker
Lid geworden
21 okt 2008
Berichten
17
Hallo Helpmij!

Ik krijg het niet voor elkaar om een macro van mij automatisch te laten starten op het moment dat een specifieke Cell veranderd in "Bestellen". De bedoeling is dat op het moment dat deze Cell in "Bestellen" veranderd (via en If functie) een Macro start die een mail stuurt naar Inkoop. Het Mail versturen gedeelte werkt, maar hij hoort dat gewoon automatisch te doen, want anders heeft het geen zin.
Eigenlijk is de functie die ik voor ogen heb erg simpel: "Als de Cell veranderd in "Bestellen" Dan Start Makro. En dat dus zonder dat je op knopjes moet drukken of er aan moet nadenken.

Zoals ik op internet gevonden heb;
A frequent question people have is "Can I run a macro from a cell function? Something like
=IF(A1>10,Macro1)." The answer is no, you cannot. However, you can use the worksheet's Change event to do something like this.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
If Target.Value > 10 Then
MsgBox "Put Your Code Here"
End If
End If
End Sub


Probleem is dat ik de Worksheet_Change niet aan de praat krijg zelfs niet als ik hem verander in:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
If Target.Value = "Bestelling" Then
Run "CDO_Send_Selection_Or_Range_Body"
End If
End If
End Sub


Ook heb ik de volgende code geprobeerd:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
If Target <> "Bestellen" Then Exit Sub
Run "CDO_Send_Selection_Or_Range_Body"
End Sub

Maar er zijn dus problemen. Ten eerste kan ik de Macro al helemaal niet manueel starten (hij komt niet in de lijst?) En ten tweede weet ik niet hoe mijn andere Macro precies heet waardoor daar ook nog een probleem mee heb.

De "CDO_Send_Selection_Or_Range_Body" kan wel manueel gestart worden in de Makro lijst maar heet als 'module' gmail.

Oftewel; hoe start ik een andere macro automatisch?

Met vriendelijke groeten
 
Om met het eerste te beginnen
De macro die je nodig hebt heet

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
je moet dit niet in een module typen.
Hij is te vinden door op het betreffende blad te dubbelklikken in de editor.
Bovenin links kun je nu worksheet selecteren in de uitklap lijst.
Rechts kun je dan de change selecteren waar je je code in kwijt kan.

Roep de macro niet aan met run, maar met Call en zonder aanhalingstekens
Maar misschien eerst even testen met een msgbox of het nu wel werkt.

mvg leo
 
Laatst bewerkt:
Hey Leofact.
Ik heb gedaan wat je zegt, in de editor van Sheet1 (hij heeft nog geen naam).
Met links Worksheet en rechts Change.

Ik probeerde nadat hij het dus niet deed met If functie in plaats van "Bestelling" maar 1 te laten zien; dat deed hij probleemloos. Hij ziet dus geen tekst. Ligt dat in de code?

Daarnaast werkt de formule niet robuust. Doordat die '1' een Display is van mijn IF functie doet hij het niet erg best. Soms wel, meestal niet. En dat terwijl ik het echt automatisch wil. Is er een andere mogelijkheid om in de Cell een getal te krijgen zonder dat er sprake is van een formule? (ik denk dat hij daar op hangt).

Dit is de code:

"code" zei:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
If Target.Value = 1 Then
MsgBox "T werkt"
Call CDO_Send_Selection_Or_Range_Body
End If
End If
End Sub
 
Onderstaande macro wordt geactiveerd als er in het werkblad iets wordt veranderd.
Uitsluitend als die verandering het plaatsen van het woord Bestellen in cel A1 start de macro DO_Send_Selection_Or_Range_Body.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And Target.Value = "Bestellen" Then
    CDO_Send_Selection_Or_Range_Body
End If
End Sub
Met vriendelijke groet,


Roncancio
 
Hallo Roncacio!
Bedankt voor je reactie.
Je oplossing heeft echter hetzelfde probleem als de vorige.
Hij doet het prima als je handmatig in de cel (in jou geval A1) 'Bestellen' invoert. Dat is echter niet wat ik wil.
Ik wil dat omdat er automatisch Cel A1 veranderd van niks naar 'Bestellen' de Macro word aangeroepen die de rest in gang zet.
Als ik handmatig 'bestellen' invoer doet hij doet prima.
Maar als ik door een IF laat doen zegt hij wel lief 'Bestellen' maar zet hij de Macro niet in werking.

Het globale idee is dat omdat er in een andere sheet uitslag word genoteerd dat de voorraad onder de minimale voorraad valt er een opmerking komt: "Bestellen". Daar zit de macro aan vast die een andere macro ingang zet die de sheet mailt naar Inkoop.
Ik heb het dus zo ver dat de mail werkt.
En ook kan het programma "Bestellen" zeggen. Alleen de (automatische) gang daar tussen krijg ik niet voor elkaar. Wel als je dus "Bestellen" in de Cel zet, dan doet ie het prima. Maar dat wil ik niet.

Ideeen om dit op te lossen? Of het op een hele andere manier te doen?
 
Wat je kan doen is het volgende
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.Range("$A$1").Value = "Bestellen" Then
    CDO_Send_Selection_Or_Range_Body
End If
End Sub
De macro wordt geactiveerd als er een wijziging plaatsvindt op het werkblad.
Er wordt gecontroleerd of er in cel A1 het woord bestellen (resultaat van een als-functie in de cel) staat.
Zo ja, dan wordt de macro gestart.

De als-functie is bijvoorbeeld:
Code:
=ALS(BLAD1!A1="";"";"Bestellen")

Met vriendelijke groet,


Roncancio
 
Laatst bewerkt:
Oke! Bedankt! Dat werkt!

Hoe breidt ik het nu uit van vak A1 naar een range zoals A1:A20

Hij gaf een foutmelding: Type Mismatch
 
Oke! Bedankt! Dat werkt!

Hoe breidt ik het nu uit van vak A1 naar een range zoals A1:A20

Hij gaf een foutmelding: Type Mismatch

Kan er overal Bestellen staan?
De macro werkt nu als er een wijziging plaatsvindt om het werkblad. Je zou dat uit kunnen breiden dat ook de andere cellen worden meegenomen maar je blijft dan wel steeds mailtjes verzenden.
Via onderstaande code wordt de macro steeds opnieuw gestart. Dat lijkt mij persoonlijk niet ideaal.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rBereik As Range
    For Each rBereik In ActiveSheet.Range("A1:A20")
        If rBereik.Value = "Bestellen" Then
            CDO_Send_Selection_Or_Range_Body
        End If
    Next
End Sub


Met vriendelijke groet,


Roncancio
 
De omloopsnelheid van de producten is niet zo hoog en het is onwaarschijnlijk dat op dezelfde week meerdere producten onder hun voorraad niveau raken. Maar het is wel nodig om te blijven controleren of het systeem niet teveel mails stuurt. Dit zal opgelost moeten worden met werkinstructies voor diegene die het systeem van zijn gegevens voorzien.
Er kan overal Bestellen achter.
Ik moet nog even uitzoeken wat er gebeurd als er Bestellen staat en de excel sheet wordt geopend of hij dan mails gaat versturen.

In ieder geval hardstikke bedankt voor de hulp!
 
Ikzelf zou de mailmacro laten starten door de macro('s) op het moment dat dit nodig is.
Aanvullend is dan het Change event voor het geval een gebruiker het zelf doet.

Om te veel reactie te voorkomen zijn er meerdere methodes.
De eerste is om in een macro, voor je "bestellen" laat plaatsen de events uit te zetten met
Code:
Application.EnableEvents = False
Dat voorkomt dat er ook een (ongewenste) reactie op het Change event komt.
(wel weer aanzetten daarna, anders gebeurt er niets meer:))

Een andere methode is om een publieke teller of switch te gebruiken die je aan zet als de mail verstuurd is, zodat je weet dat daar niet weer op gereageerd hoeft te worden.

De methodes kun je natuurlijk combineren
 
Ik had het probleem opgelost door wat minder schone oplossingen.
Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.Range("D5").Value = "Bestellen" Then
CDO_Send_Selection_Or_Range_Body
ActiveSheet.Range("D5").Value = "In Bestelling"
End If
Nadat hij de CDO macro heeft aangezet veranderd hij het woordje Bestellen in 'In Bestelling'. Zodat de volgende macro's niet nog een keer de CDO macro aanzetten. Dat werkt, alleen het probleem is dat de tekst 'In Bestelling" de If functie in de cel D5 vervangt. Dat was niet de bedoeling. Ik probeerde vervolgens een IF Functie te laten neerzetten, maar dat werkt niet. Mijn vba editor ziet de IF functie dan als wat hij zelf moet doen.

Wat ik probeerde:
ActiveSheet.Range("D5").Formula = "=IF((B5+C5)<10; "In Bestelling"; "")
Daar wil vba een 'end of expression op'.
Hoe fix ik dit?
 
Zo lukt het wel.
Code:
ActiveSheet.Range("D5").Formula = "=IF((B5+C5)<10," & Chr(34) & "In Bestelling" & Chr(34) & "," & ")"

Met vriendelijke groet,


Roncancio
 
Ah man!
Nu weer een ander probleem.
Nu blijft mijn IF functie hangen.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If ActiveSheet.Range("D5").Value = "Bestellen" Then
        CDO_Send_Selection_Or_Range_Body
        ActiveSheet.Range("D5").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
        End If

If Range("F5").Value > 10 Then
    Range("D5").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""Bestellen"","""")"
    End If

End Sub

Hoe zorg ik dat deze niet blijft loopen? Want dat doet ie dus.

Dankjullie wel!
 
Laatst bewerkt:
Daarvoor kun je een publieke switch of teller meegeven die je de aan het eind van eerste keer een waarde geeft en dan de code niet laten uitvoeren als de switch aan is

Boven de bovenste sub van het event editorblad:
Code:
Public bSwitch as boolean

Eerste regel van de change event

Code:
If bSwitch then
     bSwitch = false
     exit sub
End If
bSwitch = true

Dit zou je je van de herhaling moeten afhelpen.
 
Hallo,

Ik blijf hetzelfde probleem houden.
Op het moment dat Cel F5 weer boven of gelijk aan 10 is blijft hij maar de Formule in Cel D5 stoppen. Ik begrijp die switch ook niet zo goed. Een groot verschil is er niet, wel een beetje. (als er in een van de cellen F5, F6 of F7 een getal staat die kleiner is dan 10 dan doet ie het prima (al gaat dan het ook nog fout) maar zodra ze alle drie boven de tien zijn... dan gaat het fout)

Dit is de totale code:

Code:
Public bSwitch As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)



        If ActiveSheet.Range("D5").Value = "Bestellen" Then
        CDO_Send_Selection_Or_Range_Body
        ActiveSheet.Range("D5").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
        Exit Sub
        End If
        
        If ActiveSheet.Range("D6").Value = "Bestellen" Then
        CDO_Send_Selection_Or_Range_Body
        ActiveSheet.Range("D6").Value = "In Bestelling"
        Exit Sub
        End If
        
        If ActiveSheet.Range("D7").Value = "Bestellen" Then
        CDO_Send_Selection_Or_Range_Body
        ActiveSheet.Range("D7").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
        Exit Sub
        End If
    
    If bSwitch Then
     bSwitch = False
     Exit Sub
    End If
    bSwitch = True
    
    If Range("F5").Value >= 10 Then
        Range("D5").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""Bestellen"","""")"
        Else
            Exit Sub

    End If
    
    If Range("F6").Value >= 10 Then
        Range("D6").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""Bestellen"","""")"
        Else
            Exit Sub

    End If
    
    If Range("F7").Value >= 10 Then
        Range("D7").FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""Bestellen"","""")"
        Else
            Exit Sub

    End If
    
End Sub
 
Onderstaande code controleert in het bereik D5 t/m D7 of er Bestellen staat.
Indien dat het geval is, dan wordt dat aangepast. Je hebt geen last meer van het continu aanroepen van WorkSheet_Change.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Static Opnieuw As Boolean
Dim rBereik As Range
    If Opnieuw = False Then
        Opnieuw = True
        For Each rBereik In ActiveSheet.Range("D5:D7")
            If rBereik.Value = "Bestellen" Then
                CDO_Send_Selection_Or_Range_Body
                ActiveSheet.Range("D" & rBereik.Row).FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
            End If
        Next
    Else
        Opnieuw = False
    End If   
End Sub

Met vriendelijke groet,


Roncancio
 
Hey Roncancio!
Dankjewel voor de hulp.
Nu moet echter nog een ding gebeuren.
Op het moment dat Cel B5 + C5 in F5 > 10
Moet in Cel D5 de IF-Functie: =IF((B5+C5)<10;"Bestellen';"") weer komen.
Dit heeft een belangrijke reden.
Dit is zo want als de voorraad weer toegenomen is dat er op het moment dat de voorraad daarna weer afneemt weer een mailtje gestuurd gaat worden. Dus eigenlijk als F5 weer boven de minimale vastgestelde voorraad (in dit geval 10) moet D5 weer terugkeren zoals hij was aan het begin (de if functie met Bestellen)

Dus:
IF F5 > 10 Then
Plaats IF Functie =IF((B5+C5)<10;"Bestellen';"") in D5

(en dit dus in bereik F5:F7 (D5:D7)

Ik hoop dat het zo duidelijk is, want ik kom er zelf niet uit. (zoals te zien is in mijn code van mijn vorige post)

Groetjes
 
Volgens mij bedoel je het zo.

Staat er in de D-kolom Bestellen dan wordt de formule in de D-kolom:
=ALS((B5+C5)<10;"In Bestelling";"")

Staat er in de F-kolom een waarde groter dan 10, dan wordt de formule in de D-kolom:
=ALS((B6+C6)>10;"Bestellen";"")

De macro is als volgt:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Static Opnieuw As Boolean
Dim rBereik As Range
    If Opnieuw = False Then
        Opnieuw = True
        For Each rBereik In ActiveSheet.Range("D5:D7")
            If rBereik.Value = "Bestellen" Then
                CDO_Send_Selection_Or_Range_Body
                ActiveSheet.Range("D" & rBereik.Row).FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
            End If
        Next
        For Each rBereik In ActiveSheet.Range("F5:F7")
            If rBereik.Value > 10 And rBereik > "" Then
                ActiveSheet.Range("D" & rBereik.Row).FormulaR1C1 = "=IF((RC[-2]+RC[-1])>10,""Bestellen"","""")"
            End If
        Next

    Else
        Opnieuw = False
    End If
End Sub


Met vriendelijke groet,


Roncancio
 
Staat er in de F-kolom een waarde groter dan 10, dan wordt de formule in de D-kolom:
=ALS((B6+C6)>10;"Bestellen";"")

Nee het moet zo:
=ALS((B6+C6)<10;"Bestellen";"")

Ik heb het veranderd, maar het werkt niet.
Hij blijft constant hangen. Hoe kan dat?

Is dit het probleem niet?
If Opnieuw = False Then
Opnieuw = True

Opnieuw = False

Bedankt!
 
Bij mij werkt het naar behoren.
Je moet ook de > aanpassen bij
Code:
            If rBereik.Value [B][COLOR="Red"]>[/COLOR][/B] 10 And rBereik > "" Then

Via onderstaande code zou het moeten lukken.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Static Opnieuw As Boolean
Dim rBereik As Range
    If Opnieuw = False Then
        Opnieuw = True
        For Each rBereik In ActiveSheet.Range("D5:D7")
            If rBereik.Value = "Bestellen" Then
                CDO_Send_Selection_Or_Range_Body
                ActiveSheet.Range("D" & rBereik.Row).FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""In Bestelling"","""")"
            End If
        Next
        For Each rBereik In ActiveSheet.Range("F5:F7")
            If rBereik.Value < 10 And rBereik > "" Then
                ActiveSheet.Range("D" & rBereik.Row).FormulaR1C1 = "=IF((RC[-2]+RC[-1])<10,""Bestellen"","""")"
            End If
        Next
    Else
        Opnieuw = False
    End If
End Sub

Met vriendelijke groet,


Roncancio
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan