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

Cel aanklikken om macro uit te voeren

Status
Niet open voor verdere reacties.

JanOdb

Gebruiker
Lid geworden
16 okt 2017
Berichten
50
Het lukt me niet: ik wil een cel in excel 2016 aanklikbaar maken om er een macro mee uit te voeren. Ik zou er natuurlijk een transparant gifje kunnen overleggen, maar dat vind ik geen 'propere' oplossing en het geeft me weer andere problemen (ik wil de cel met de macrorecorder kunnen kopiëren om elders te plakken, maar als ik dan dat gifje niet eerst verplaatst wordt het mee gekopieerd. Het zou allemaal wel kunnen, maar het wordt dan wel zeer omslachtig). Bovendien - en dat is wellicht de belangrijkste reden - ligt zo'n gifje 'bovenop' het werkblad, en kan het niet beveiligd worden, zodat wie wil het kan verplaatsen.
Bestaat er dus geen middel om de cel aanklikbaar te maken om zo een macro uit te voeren?
Ik heb hier reeds eerder vragen gesteld, en fantastische oplossingen gekregen, dus mijn hoop is hoog gespannen.
Toch nog dit: ik ken (nog) héél weinig van VB, dus als het kan graag wat duidelijke uitleg over wat ik waar en hoe moet doen.
 
Dat kan met dit achter het betreffende werkblad:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        MsgBox "Macro uitgevoerd"
    End If
End Sub

In dit voorbeeld wordt de macro uitgevoerd als je in cel A1 klikt.
Zie plaatje. Dubbelklik op het betreffende blad (Pijl links) en plaats dan de Worksheet_SelectionChange macro (Pijl rechts):
CelKlikken.JPG
 
Laatst bewerkt:
Met een gifje/label is het best goed te doen en hoeft er echt niks verplaatst te worden,
oplossing van edmoor is uiteraard wat makkelijker (afhankelijk van hoe de sheetbeveiliging is ingesteld en je moet eerst altijd even uit de cel welke je aanklikt zijn geweest)
 
Misschien is dit wel een stomme vraag en zie ik iets over het hoofd, maar ik heb verschillende macro's, dus hoe bepaal ik welke daarvan wordt uitgevoerd?
 
In plaats van:
MsgBox "Macro uitgevoerd"

doe je dan:
Call JouwMacro
 
Hallo Jan,

In het voorbeeld van Edmoor is helemaal geen macro uitgevoerd.
Hij wist immers niet welke macro's jij hebt.

In plaats daarvan heeft hij als voorbeeld een msgbox geplaatst.
In plaats van die regel zet jij natuurlijk de naam van de macro die je bij die cel uitgevoerd wil hebben.

Groetjes,
Ger
 
't Was dus een domme vraag, maar ik zet pas mijn eerste stapjes in VB voor excel, en met enige overmoed begin ik dan dingetjes te maken waar ik snel in vastloop. Ik begin me af te vragen wat NIET mogelijk is. In elk geval zijn jullie van harte bedankt: de antwoorden komen wel héél snel!
 
Domme vragen bestaan niet Jan.

Als je er niet aan begint en blijft ploeteren tot je een ons weegt: dat is dom.
Gewoon lekker aan de gang ermee en blijven proberen. Met vallen en opstaan.

Veel succes in VBA-land.

Groetjes,
Ger
 
Ugh. Hier ben ik weer. Om moeilijk te doen wil ik meerdere macro's koppelen aan meerdere cellen op hetzelfde werkblad. Omdat de SelectionChange al bestaat krijg ik uiteraard een foutmelding (dubbelzinnige naam - ik vermoed dat bedoeld wordt: dubbele naam). Nu heb ik mijn vraag al verraden: hoe doe ik dit meerdere malen op hetzelfde werkblad? (tenzij ik iets gevonden heb dat NIET kan, maar dat lijkt me onwaarschijnlijk.) Ik ben aan 't zoeken geweest, maar vind niks.
 
Hallo Jan,

Ik ben ook geen VBA-wonder, maar volgens mij kun je gewoon toevoegen:
Code:
    If Target.Address = "$A$2" Then
        call AndereMacro
    End If

De echte specialisten zullen me wel corrigeren als het niet klopt.

Groetjes,
Ger
 
Laatst bewerkt:
Als jij geen VBA-wonder bent, dan ben ik een absolute oen, want dit had ik moeten weten. Ik probeer het uit.
 
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Select Case Target.Address
        Case "$A$1":    Call MacroA1
        Case "$A$2":    Call MacroA2
    End Select
End Sub
 
Hierbij nog een voorbeeldje, zoals benoemd in post#1 (en #3) mbv een onzichtbaar label puur ter leering ende vermaeck

In Q1 de cel waar je op klikt en in cel Q2 deze cel gekopieerd (in het gebied A1-P22)

Alle cellen zijn beveiligd.
 

Bijlagen

Een vraagje aan edmoor: in je eerste vb gebruik je een "if", in je 2de niet meer. Is er een reden om die "if" te gebruiken, of is het gewoon één van de manieren om dit te doen? Kan het dan ook zoals in je 2de oplossing als er maar één macro in één cel moet worden uitgevoerd?
Je merkt dat ik een absolute beginner ben, maar zo kom ik veel te weten.
 
Vragen staat vrij en zijn we voor :)

Met de If vergelijk je in dat geval de Target.Address met 1 waarde. De Select Case geeft de mogelijkheid om Target.Address met meerdere waarden te vergelijken.
Dat is beter dan het gebruik van meerdere If statements voor het vergelijken van een zelfde variabele.
 
Laatst bewerkt:
Het werkt, maar er gebeurt iets heel vreemd. Ik heb drie macro's, die elk met de gegeven code worden uitgevoerd door een klik op een cel. Eén van die macro's wist de inhoud van een aantal cellen (gemaakt met de macrorecorder door de te wissen cellen te selecteren en op DEL te drukken).(Ik gebruik de macrorecorder omdat de gemaakte macro me inzicht geeft hoe macro's in elkaar zitten). Dat gaat goed. Maar als ik opnieuw gegevens in die cellen wil zetten (ze staan onder elkaar in een kolom) dan verdwijnt de inhoud van al die cellen zodra ik de onderste (laatste) cel invul en op ENTER druk. Het doet zich NIET voor als de celbeveiliging uitstaat (de in te vullen cellen zijn uiteraard niet geblokkeerd).
Het moet met de VBA code te maken hebben, want als die er niet is, loopt alles normaal.
(Als jullie nu weer met een oplossing aankomen zal ik me opnieuw verbazen over de kennis die daarachter zit en me afvragen of ik die zelf ook ooit zal bezitten. Of zijn jullie echt specialisten die hiervoor gestudeerd hebben? Ik ben geen doetje in computerkennis, heb informatica gegeven in het middelbaar en bestudeer graag boeken, maar ik ben bijna 62 en weer naar (avond)school gaan zie ik niet zitten. Dus de kans is groot dat ik hier nog terechtkom met vragen. Ik gebruik al lang Excel met de gebruikelijke functies, maar nu gaat er een wereld van mogelijkheden open).
 
Ik zou vooral de gebruikte code's/het bestand niet plaatsen. Dan gaat het een lekker lang draadje worden. Domme vragen bestaan inderdaad niet. Vragen stellen zonder additionele informatie is dan weer wat minder slim.
 
Sorry. Ik wou de codes niet nog eens plaatsen omdat ze in deze thread hogerop al staan. Daarom zeg ik ook 'de gegeven codes'.
De macro's worden dus aangeroepen door deze code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Target.Address
Case "$A$1": Call MacroA1
Case "$A$2": Call MacroA2
End Select
End Sub

Macro1 maakt een celbereik leeg:

Sub Wijzig_aantal_aperitief()
'
' Wijzig_aantal_aperitief Macro
'

'
Range("B5:B7").Select
Selection.ClearContents
End Sub

Macro2 verwijdert alle mogelijkheden om nog iets te wijzigen:

Sub OK_aperitief()
'
' OK_aperitief Macro
'

'
Sheets("ZATERDAG").Select
ActiveSheet.Unprotect
Application.Run "parochiefeesten.xlsm!OK_aperitief_telling_totalen"
Range("D8").Select
Selection.Copy
Range("O2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("E8").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = ""
Range("A10:B10").Select
Selection.ClearContents
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Range("A12:B12").Select
Selection.ClearContents
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Range("C13:G13").Select
ActiveCell.FormulaR1C1 = "klik VERBETER als u nog iets wil wijzigen"
Range("D10").Select
ActiveCell.FormulaR1C1 = ""
Range("C11:G11").Select
ActiveCell.FormulaR1C1 = "I N G E V U L D"
Range("B5:B7").Select
With Selection.Font
.Name = "Verdana"
.FontStyle = "Vet"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.Color = 255
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
Sheets("ZATERDAG").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False
End Sub

Macro 3 zet de begintoestand weer terug en maakt dus eigenlijk Macro2 ongedaan:

Sub Verbetering_aperitief()
'
' Verbetering_aperitief Macro
'

'
Sheets("ZATERDAG").Select
ActiveSheet.Unprotect
Range("B5:B7").Select
With Selection.Font
.Name = "Verdana"
.FontStyle = "Vet"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
Application.Run "parochiefeesten.xlsm!Verbeter_aperitief_zet_aantal_terug"
Range("O2").Select
Selection.ClearContents
Range("B5:B7").Select
Selection.ClearContents
Range("A10:B10").Select
Selection.ClearContents
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Range("A12:B12").Select
Selection.ClearContents
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Range("C13:G13").Select
Selection.ClearContents
Range("C11:G11").Select
ActiveCell.FormulaR1C1 = ""
Range("C11:G11").Select
Selection.ClearContents
Sheets("ZATERDAG").Select
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False
End Sub

Het probleem is dus: als ik hierna weer het celbereik B5:B7 invul, dan gaat dat goed in B5 en B6, maar zodra ik B7 invul en op Enter druk, wordt heel het bereik B5:B7 leeg gemaakt. Het gebeurt NIET als de bladbeveiliging NIET opstaat.

En zoals eerder gezegd: daar snap ik dus niks van.
 
Ik heb een oplossing gevonden, maar snap nog niet goed waardoor het probleem zich voordeed.Bekijk bijlage voorbeeld.xlsx
Ik heb een voorbeeld toegevoegd zoals dat in mijn sheet voorkomt.
C1:C3 zijn niet beveiligd.
Een macro maakt C1:C3 leeg.
Als ik dan dat bereik opnieuw wil invullen wordt alles weer leeggemaakt zodra ik (na invullen van C3) op ENTER druk.
Maar als ik C4 eveneens niet beveilig lukt het wel. Daar kan ik een of andere logica bij bedenken. Maar wat ik niet snap is waarom het probleem zich alleen voordoet als ik bvb. C6 aanklikbaar maak om de macro 'C1:C3 leegmaken' uit te voeren.
 
Een Sub Worksheet_SelectionChange(ByVal Target As Range) wordt uitgevoerd bij iedere wijziging van cel. Als je naar een andere cel gaat dus.

Zet tevens code die je hier plaatst tussen codetags.
Daarnaast zie ik nergen in deze thread je macro's eerder geplaatst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan