[Excel VBA]Worksheet change event is niet voldoende

Pagina: 1
Acties:
  • 154 views sinds 30-01-2008
  • Reageer

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Ik heb een aantal macros die worden uitgevoerd als de gebruiker bijvoorebeld bepaalde kolommen wijzigd. Dit heb ik neer gezet bij het change vent van de worksheet. Dit werkt ook allemaal goed.

Behalve dus als de gebruiker bij 1 van de cellen in mijn kolommen opgeeft dat die waarde uit een andere cell komt, dus bijvoorbeeld bij cell A1 geeft de gebruiker op dat deze gevuld wordt uit cell C1 (bij A1 dus =C1).

Vult de gebruiker nu iets in bij cell C1, dan veranderd mijn waarde in A1 wel en krijg ik ook een change event (target is dus C1) maar ik kan niet meer zien dat de waarde in A1 veranderd is dus loopt m'n macro niet meer.

Ik heb al eens gekeken of er andere events zijn enz maar wat ik kan zien dus niet :'( Heb ook al plenty gegoogled enz maar nog niks gevonden.

Verwijderd

snel 2 pistes:
er is de hasformula en formula eigenschap, waarmee je de broncel mee zou kunnen gaan opsporen, en er is ook het worksheet_calculate event.

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Al winter in gedachten ? ;)
er is de hasformula en formula eigenschap, waarmee je de broncel mee zou kunnen gaan opsporen, en er is ook het worksheet_calculate event.
Het worksheet_calculate event wordt ook aangeroepen maar deze heeft geen parameters dus je kunt nooit achterhalen wat er nu precies veranderd is.

Het opvragen van de formule is ook het enige dat ik kon bedenken, maar als je het echt zo moet oplossen dan valt me dat vies tegen gezien je dan alle mogelijke verwijzigen zelf moet gaan bijhouden over alle worksheets enz. Als je bijv. bij cel A1 intypt dat de inhoud nu uit cel C1 komt, dan zul je op dat moment de formula moeten opvragen van A1 en daaruit halen dat de inhoud nu komt uit C1, want hierna krijg je dus geen events meer van A1. Als dus nu wat veranderd in C1, zul je dus moeten kijken of die linked ergens naar (in dit geval naar A1) en die cel dus ook meenemen in je macro's.

Daarnaast zul je dit zelf in een of andere sheet moeten gaan opslaan gezien dit uiteraard ook behouden moet blijven als je het woorkbook afsluit.

Kortom een onhandige en omslachtige manier om eigenlijk iets te doen wat behoort tot de basis functionaliteit van Excel :(

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 10:28
in range zit de precedents property. Dat is een beetje de VBA variant op broncellen zoeken.
Range("A1").Precedents geeft een range terug die een meervoudige selectie representeerd van de broncellen van A1 (w.o. C1)
Door deze range te vergelijken met je Target kom je vast een heel eind.

Verwijderd

in de veronderstelling dat de gebruiker geen massa's van dergelijke verwijzingen zal opbouwen kan dit toch behoorlijk efficiënt. je kan immers ook de doelcel opvragen, en dan nagaan of deze binnen de door jou gedefinieerde kolommen valt. in het aangehaalde voorbeeld, stel dat je eerste 10 cellen van kolom a & d in het oog wil houden (met in a1 een door de gebruiker aangebrachte formule) kan je het volgende doen in het change event (code niet nagekeken):
Visual Basic:
1
2
3
4
5
if not intersect(range(target.dependents(1).address),union(range("a1:a10"),range("d1:d10"))) is nothing then
'je hebt een match, gebruik de dependents om precies te vinden welke cel(len) gewijzigd zijn
else
'er is een wijziging, maar deze heeft geen betrekking op de gemonitorde kolommen
end if

[ Voor 4% gewijzigd door Verwijderd op 08-11-2005 14:02 ]