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

invoer vermenigvuldigen in dezelfde cel

Status
Niet open voor verdere reacties.

jpbergen

Gebruiker
Lid geworden
12 nov 2010
Berichten
26
Voor mijn vriendin verdiepte ik mij eens in Excel 2007.

Voor haar werk was ze bezig met het aanpassen (modificeren) van een sheet.

Nu had ze een probleem.
Ze heeft verschillende kolommen met producten, daaronder een regel met punten.
Elk product heeft zijn eigen score bij een sale. Bijv. 1 sale = 400 ptn.
Er staat echter maar één kolom voor, dus of voor het aantal sales, of voor het aantal punten.
Nu zijn alleen de punten belangrijk.

Nu vraag ik me af of de bollebozen van microsoft een oplossing hebben voor het invoeren van een getal dat dan automatisch verandert (berekend) kan worden.

Weet iemand of het mogelijk is via Celformaat (eigenschappen van de cel), dat leek mij een logische manier. Of een andere manier.

Met gewoon een formule kom ik uit op een kringverwijzing. Bijv. =ALS(A2>0;A2*A1)
ScreenHunter_01 Nov. 13 16.59.gif Zie in dit voorbeeld het resultaat en de oplossing zoals die ook zo moeten zijn maar die ontzettend veel extra werk zal opleveren om voor een hele sheet (á 20 kolommen extra) aan te passen. Plus alle verwijzingen naar andere bladen. :eek:

Tweede mogelijkheid zou een lijst met invoervak kunnen zijn. Ik heb dat al wel bekeken maar dan komt er geheid coderen aan te pas in VBA. Ben ik niet bepaald in thuis.
Mocht er iemand een idee hebben, ik houd me aanbevolen.

Alvast dank voor het meedenken. :thumb:
 
Laatst bewerkt:
Als je in cel A1 van bijgevoegd bestand een waarde invoert dan wordt deze waarde vermenigvuldigd met 400 en in dezelfde cel geplaatst.

Met vriendelijke groet,


Roncancio
 

Bijlagen

Als je in cel A1 van bijgevoegd bestand een waarde invoert dan wordt deze waarde vermenigvuldigd met 400 en in dezelfde cel geplaatst.

Met vriendelijke groet,


Roncancio

Helemaal goed :thumb:

Als je maar de prog. code weet, dan is alles mogelijk.

Super dank voor de snelle respons.

Note : Ik zie nu wel dat het hele document in elke cel de waarde wordt aangepast, maar dat zoek ik wel uit hoe dat zit.
 
Laatst bewerkt:
Ben ik er toch nog niet uit. Ik wil best nog verder gaan met de stoomcursus VBA, maar ik zit al wat krap in de tijd en maandag wil mijn vriendin wel klaar zijn.

Zou je alsnog even willen kijken voor het instellen van het bereik.
Ik ben al wel gekomen tot het instellen van het werkblad middels:

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheets("Blad1").Activate
If Target <> lRes Then
lRes = Target.Value * 400
Target.Value = lRes

Maar overal waar ik nu kijk staat heel leuk hoe de Range in te vullen, maar als ik dat doe dan krijg ik een error.
Ik plaatste de regel al op verschillende niveau's en in verschillende vormen, werkt mooi niet.
Ga me hier nog wel verder in verdiepen, heb nog wel ergens een boek liggen hierover.
Alvast dank.
 
Misschien is het verstandig om je bestandje te uploaden met hoe ver je bent, en waar het mis gaat.
Je handtekening zegt het eigenlijk al.
 
even een variant op bovenstaande, waarbij enkel naar wijzigingen in een bepaalde kolom gekeken wordt. Vervolgens wordt er gekeken naar de opmaak van die cel(len), staat die al als "pnt", dan wordt er ook niets meer gedaan. Het is maaar een voorbeeld, vermoedelijk moet er ook nog een beetje aan gesleuteld worden om het naar je zin te maken

in een module van een blad, waar onderstaande macro thuishoort, zet je ook meestal niets in de zin als "Worksheets("Blad1").Activate", wat je hier doet heeft al betrekking op het blad waarop deze module van toepassing is.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim isect As Range, c As Range
  Set isect = Intersect(Columns("C:G"), Target)            'beperk controle op de veranderde cellen tot enkel deze kolommen
  If isect Is Nothing Then Exit Sub                        'niets verandert binnen het geoogde gebied=stop
  For Each c In isect.Cells                                'loop 1 voor 1 alle gewijzigde cellen binnen het beoogd gebied af
    If c.NumberFormat <> "0"" ptn""" Then                   'staat in de opmaak van die cel al "ptn"=cel is al gewijzigd=stop
      Application.EnableEvents = False                     'events tiijdelijk uitschakelen
      c.Value = c.Value * 400                              'vermenigvuldigen
      c.NumberFormat = "0"" ptn"""                         'opmaak aanpassen
      Application.EnableEvents = True                      'events terug inschakelen
    End If
  Next
End Sub
 
Ben ik er toch nog niet uit. Ik wil best nog verder gaan met de stoomcursus VBA, maar ik zit al wat krap in de tijd en maandag wil mijn vriendin wel klaar zijn.

Zou je alsnog even willen kijken voor het instellen van het bereik.
Ik ben al wel gekomen tot het instellen van het werkblad middels:

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheets("Blad1").Activate
If Target <> lRes Then
lRes = Target.Value * 400
Target.Value = lRes

Maar overal waar ik nu kijk staat heel leuk hoe de Range in te vullen, maar als ik dat doe dan krijg ik een error.
Ik plaatste de regel al op verschillende niveau's en in verschillende vormen, werkt mooi niet.
Ga me hier nog wel verder in verdiepen, heb nog wel ergens een boek liggen hierover.
Alvast dank.

Als ik het zo lees, dan lijkt het erop dat je het voor meerdere werkbladen wilt gebruiken.
Dat kan maar je kunt maar 1 Worksheet_Change event in een Werkblad hebben.
Wat handiger is om de code te verplaatsen naar ThisWorkbook.

De totale code wordt dan:
Code:
Dim lWaarde As Long
Dim lRes As Long

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target <> lRes Then
    lRes = Target.Value * 400
    Target.Value = lRes
End If

End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
lWaarde = ActiveCell.Value

End Sub

Met vriendelijke groet,


Roncancio
 
even een variant op bovenstaande, waarbij enkel naar wijzigingen in een bepaalde kolom gekeken wordt. Vervolgens wordt er gekeken naar de opmaak van die cel(len), staat die al als "pnt", dan wordt er ook niets meer gedaan. Het is maaar een voorbeeld, vermoedelijk moet er ook nog een beetje aan gesleuteld worden om het naar je zin te maken

in een module van een blad, waar onderstaande macro thuishoort, zet je ook meestal niets in de zin als "Worksheets("Blad1").Activate", wat je hier doet heeft al betrekking op het blad waarop deze module van toepassing is.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim isect As Range, c As Range
  Set isect = Intersect(Columns("C:G"), Target)            'beperk controle op de veranderde cellen tot enkel deze kolommen
  If isect Is Nothing Then Exit Sub                        'niets verandert binnen het geoogde gebied=stop
  For Each c In isect.Cells                                'loop 1 voor 1 alle gewijzigde cellen binnen het beoogd gebied af
    If c.NumberFormat <> "0"" ptn""" Then                   'staat in de opmaak van die cel al "ptn"=cel is al gewijzigd=stop
      Application.EnableEvents = False                     'events tiijdelijk uitschakelen
      c.Value = c.Value * 400                              'vermenigvuldigen
      c.NumberFormat = "0"" ptn"""                         'opmaak aanpassen
      Application.EnableEvents = True                      'events terug inschakelen
    End If
  Next
End Sub

Goed idee om met het kolommenbereik te bepalen waarin de berekening plaats moet vinden, maar ik zou mij dan wel beperken tot de Targetcell ipv alle cellen in het bereik C t/m G te berekenen.

Met vriendelijke groet,


Roncancio
 
Code:
For Each c In isect.Cells
Code:
Goed idee om met het kolommenbereik te bepalen waarin de berekening plaats moet vinden, maar ik zou mij dan wel beperken tot de Targetcell ipv alle cellen in het bereik C t/m G te berekenen.
nou, ik beperk me tot de gewijzigde cellen binnen het bedoelde bereik, zoals de uitleg ernaast ook vertelt:thumb:
 
nou, ik beperk me tot de gewijzigde cellen binnen het bedoelde bereik, zoals de uitleg ernaast ook vertelt:thumb:
Dat klopt niet helemaal omdat je de gehele kolommen C t/m G vergelijkt.
Bovendien wordt de code al aangeroepen zodra een cel wordt gewijzigd.

Met vriendelijke groet,


Roncancio
 
Hartelijk dank alvast voor het meedenken On short notice.

De bedoeling is meerdere kolommen op 1 werkblad met verschillende sommen.

Het is Sales omzetten naar punten.
Elke sale zijn eigen aantal punten en in zijn eigen kolom.
Ik ben nu even druk bezig maar einde van de middag, begin van de avond ga ik alles even bestuderen.

Ik had alleen de wijziging zoals in reactie, worksheet activate.
 
dan ken ik niets meer van programmeren ofwel moet je even stap voor stap door mijn macro lopen !!!
* na die set isect=... blijven alleen de gewijzigde cellen binnen bedoeld bereik over
* zijn dat er geen, dan wordt er al na de 3e regel uit deze macro gesprongen.
* indien er toch zulke cellen zijn, dan worden die 1 voor 1 netjes afgehandeld, de niet-gewijzigde cellen in dat bereik worden met rust gelaten.

Natuurlijk wordt die aangeroepen als je een cel wijzigt, die van jou is toch ook een Workbook_SheetChange of een Workbook_Change macro
 
Hartelijk dank alvast voor het meedenken On short notice.

De bedoeling is meerdere kolommen op 1 werkblad met verschillende sommen.

Het is Sales omzetten naar punten.
Elke sale zijn eigen aantal punten en in zijn eigen kolom.
Ik ben nu even druk bezig maar einde van de middag, begin van de avond ga ik alles even bestuderen.

Ik had alleen de wijziging zoals in reactie, worksheet activate.

In dat geval moet je mijn reactie (#7) vergeten.
Deze code was bedoeld voor meerdere werkbladen.
Indien elke sales een aparte berekening heeft zou je kunnen denken aan een Select Case statement.
Onderstaande code past de waarde aan als een gewijzigde cel in een bepaald bereik voorkomt.
Code:
Dim lWaarde As Long
Dim lRes As Long

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:E")) Is Nothing And Target <> lRes Then
    lRes = Target.Value * 400
    Target.Value = lRes
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
lWaarde = ActiveCell.Value

End Sub

@cow18
Ik zal de laatste zijn die zegt dat je niet kan programmeren maar wat ik bedoel aan te geven is dat je code alle cellen in het bereik controleert.
Het is niet bedoeld als kritiek of terechtwijzing.:)

Je code wordt gestart bij een wijziging van een cel.
Vervolgens wordt gekeken of de wijziging plaatsvindt in het bereik C t/m G. Tot zover ga ik met je mee.:cool:
Vervolgens ga de code echter elke cel in dat bereik controleren en dát lijkt mij niet nodig. Dat werkt namelijk vertragend. Alleen de targetcell zou moeten volstaan.

Met vriendelijke groet,


Roncancio
 
Laatst bewerkt:
Code:
 If isect Is Nothing Then Exit Sub                        'niets verandert binnen het geoogde gebied=stop
[COLOR="red"]msgbox isect.address [/COLOR]
 For Each c In isect.Cells                                'loop 1 voor 1 alle gewijzigde cellen binnen het beoogd gebied af
ik veronderstel dat je te snel verkeerde besluiten trekt, je bent waarschijnlijk gewoon an maar 1 cel tegelijk te veranderen en dus misschien vooraf te testen op Target.cells.count =1 of iets in die trend.
Hier mag je een heleboel cellen in eens veranderen en enkel die cellen die binnen het vooraf bepaalde bereik (hier die kolommen) worden verder gehandeld. Net voor die For...Next loop geef ik je nu in een msgbox de cellen die straks afgelopen zullen worden, en daarvan zeg ik nu al daar geen andere cellen in staan dan de target, mogelijk een aantal minder.
Doe nu even de test, zet even een getal buiten de kolommen neer en kopieer die nu even naar een volledige rij , isect wordt beperkt tot die cellen in die rij die binnen die kolommen vallen
 
Hartelijk dank aan beide.

Het is gelukt en ook het bereik per kolom (cel) is helemaal duidelijk.

Super.:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan