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

Excel VBA; Werkblad index van macro-knop

Status
Niet open voor verdere reacties.

timvdp314

Gebruiker
Lid geworden
16 apr 2019
Berichten
10
Hoi allemaal,

Ik zit met het volgende probleem:

Aan de rechterkant van het scherm in het bijgevoegd Excelbestand (op werkblad met naam "62") heb ik een knop die een macro (RefreshModule) uitvoert. Ik wil dat deze macro gegevens ophaalt van het werkblad dat vóór het huidige werkblad komt. Nu heb ik online wel gelezen dat je ActiveSheet kan gebruiken om het nummer van het werkblad als resultaat te krijgen, maar ik heb ook gelezen dat die functie niet altijd werkt, bijvoorbeeld als de macro op de een of andere manier op een ander werkblad wordt uitgevoerd. Daarom wil ik het zonder de ActiveSheet functie doen, maar dat blijkt lastiger dan ik dacht. Ik wilde gebruik maken van Application.Caller, maar dat geeft als resultaat "Knop1", en daar zit geen verwijzing aan verbonden. Ik kan de gebruiker om input vragen met InputBox, maar dat lijkt me nogal onhandig.

Heeft iemand een idee hoe dit op te lossen?
 

Bijlagen

  • HF Spreadsheet 2018-2019.xlsm
    483,4 KB · Weergaven: 23
Het werkblad voor het huidige werkblad:
Code:
Sheets(Cstr(int(Activesheet.Name)-1))

Het nummer van een werkblad is het indexnummer en dat is wat anders dan de naam van een werkblad als je daar een nummer voor gebruikt.

NB:
Volgende keer graag een niet beveiligd document.
 
Laatst bewerkt:
Best wel onleebaar wat je aan het maken bent. Waarom niet alle data in 1 tabel? Waarom geen Userform ipv al die inputboxen?

Een simpel controle op het indexnummer, of de naam van het blad uit alleen getallen bestaat en of het 'vorige' blad wel bestaat.
Code:
Sub VenA()
  MsgBox ActiveSheet.Index
  MsgBox IsNumeric(ActiveSheet.Name)
    If IsNumeric(ActiveSheet.Name) Then
      If IsError(Evaluate(CStr(ActiveSheet.Name - 1) & "!A1")) Then MsgBox "Bestaat niet" Else Set ws = Sheets(CStr(ActiveSheet.Name - 1))
     Else
    MsgBox "Kan niet"
  End If
End Sub
 
Het werkblad waar de knop op staat kan je krijgen met:
Code:
Dim oSh as Worksheet
Set oSh=ActiveSheet.Buttons(Application.Caller).TopLeftCell.Parent

Achteraf gezien, als ik dit hierboven lees, wat een onzin. De knop waar je op drukt staat per definitie op het actieve werkblad. Dus veel beter is:
Code:
Dim oSh as Worksheet
Set oSh=ActiveSheet
 
Laatst bewerkt:
Best wel onleebaar wat je aan het maken bent. Waarom niet alle data in 1 tabel? Waarom geen Userform ipv al die inputboxen?

Een simpel controle op het indexnummer, of de naam van het blad uit alleen getallen bestaat en of het 'vorige' blad wel bestaat.
Code:
Sub VenA()
  MsgBox ActiveSheet.Index
  MsgBox IsNumeric(ActiveSheet.Name)
    If IsNumeric(ActiveSheet.Name) Then
      If IsError(Evaluate(CStr(ActiveSheet.Name - 1) & "!A1")) Then MsgBox "Bestaat niet" Else Set ws = Sheets(CStr(ActiveSheet.Name - 1))
     Else
    MsgBox "Kan niet"
  End If
End Sub

Ik ben nog een beginner op het gebied van VBA, vandaar dat het misschien wat slordig/onhandig is. Ik heb echter online gelezen dat je het beste functies als ActiveSheet, ActiveCell, Select en nog wat andere kunt vermijden, omdat er soms dingen mee mis kunnen gaan. Is dat waar?
 
Gebruik svp de knop Reageer op bericht.

Als je niet weet wat je aan het doen bent dan kan er van alles misgaan. Verder reageer je inhoudelijk niet op de aangedragen suggesties en dan denk ik dat VBA vooralsnog een stapje te hoog is.
 
Als je een macro start vanuit een knop op een werkblad dan is het tamelijk veilig aan te nemen dat dat op het moment dat de macro start de Activesheet is. Door zoals in mijn voorbeeld meteen een verwijzing naar dat actieve werkblad te plaatsen zit je iegenlijk altijd goed. Dat gezegd hebbende kan mijn code dus worden ingekort naar:
Code:
Sub DeMacroVanDeKnop()
Dim Sh as worksheet
Set Sh = ActiveSheet
'Rest van de code
 
Oké, dan gebruik ik gewoon ActiveSheet. Inderdaad ook wel logisch wat je zegt; een knop wordt altijd op het actieve werkblad geactiveerd. Bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan