[VBA] een Button die zichzelf verwijderd

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

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
Kan iemand hier de code verzinnen die in een Userform waarin 1 button staat deze button volledig kan verwijderen als erop geklikt wordt?

Visual Basic:
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()

MsgBox UserForm2.Controls.Count ' moet 1 geven

' hier moet de opdracht tot verwijderen komen

MsgBox UserForm2.Controls.Count' moet 0 geven

End Sub



Ik heb al verschillende dingen geprobeerd,

UserForm1.Controls.remove("CommandButton1") mag niet,
UserForm1.Controls.Clear ook niet.

via google heb ik nog niks nuttigs kunnen vinden, mischien dat een van jullie een oplossing weet.

at your service


Verwijderd

CommandButton1.visible = false

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
Dat je de control onzichbaar maakt is leuk, maar de Controls.Count' ziet em nogsteeds hoor.

at your service


  • dominic
  • Registratie: Juli 2000
  • Laatst online: 21-08 19:07

dominic

will code for food

Geen verstand van VBA maar misschien iets als, CommandButton1.RemoveNode(); oid?

Download my music on SoundCloud


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

Unload

oogjes open, snaveltjes dicht


  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
CommandButton1.RemoveNode(); of iets dergelijks bestaat helaas niet, unload haalt je hele userform weg, is ietswat drastisch, en zelfs dan nog ziet de Controls.Count de CommandButton nog. Ik ben bang dat ik iets creatievers nodig heb.

at your service


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

Unload CommandButton1

oogjes open, snaveltjes dicht


Verwijderd

call unload(CommandButton1)

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
Helaas,
Unload CommandButton1 en Call Unload(CommandButton1) komen met een error venster:

Runtime Error 361

can't Load or Unload this object

Dit is als ze worden geplaatst op regel 5 in de begin code.

at your service


  • Denhomer
  • Registratie: Augustus 2000
  • Laatst online: 12-10-2025

Denhomer

Doh !

The_Butler schreef op 28 juni 2003 @ 17:36:
Kan iemand hier de code verzinnen die in een Userform waarin 1 button staat deze button volledig kan verwijderen als erop geklikt wordt?

Visual Basic:
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()

MsgBox UserForm2.Controls.Count ' moet 1 geven

' hier moet de opdracht tot verwijderen komen

MsgBox UserForm2.Controls.Count' moet 0 geven

End Sub



Ik heb al verschillende dingen geprobeerd,

UserForm1.Controls.remove("CommandButton1") mag niet,
UserForm1.Controls.Clear ook niet.

via google heb ik nog niks nuttigs kunnen vinden, mischien dat een van jullie een oplossing weet.
Gebruik je nou niet userform 1 en 2 door elkaar ?

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
eehhrr, Het programma waar ik aan werk heet Userform1, ik had even snel Userform2 aangemaakt om te testen. Het is iid wat slordig om die 2 daar te hebben staan inplaats van de 1.

Visual Basic:
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()

MsgBox UserForm1.Controls.Count ' moet 1 geven

' hier moet de opdracht tot verwijderen komen

MsgBox UserForm1.Controls.Count' moet 0 geven

End Sub

[ Voor 8% gewijzigd door The_Butler op 28-06-2003 18:38 ]

at your service


  • lexited
  • Registratie: Maart 2001
  • Laatst online: 29-06 09:18
wat voor probleem heb je dan met de controls count?

1 - 2 - 3


  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
De controls count "telt" alleen mijn controls die op mijn userform staan. Eerst zal het 1 zijn (er is immers een Commandbutton) en als die button verwijderd is dan komt er een messagebox met een 0 als bewijs dat de commandbutton echt weg is, en niet onzichtbaar is.

at your service


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 01:20

RayNbow

Kirika <3

Ik heb ff zitten klooien in VBA... en je kan geen controls verwijderen die tijdens Design Time zijn aangemaakt, alleen die controls die tijdens Run Time zijn gemaakt.

Dus je moet de controls aanmaken tijdens Run Time, hier is een voorbeeldje:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim WithEvents MyControl As CommandButton

Private Sub MyControl_Click()
    UserForm1.Controls.Remove "Bla"
End Sub


Private Sub UserForm_Initialize()
    UserForm1.Controls.Add "Forms.CommandButton.1", "Bla", True
    
    Set MyControl = UserForm1!Bla
    
    MyControl.Caption = "Test"
    
End Sub

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Verwijderd

je kan die controlcount -1 doen als de visible state van de button false is..
lost het probleem denk ik wel op

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 01:20

RayNbow

Kirika <3

Verwijderd schreef op 28 June 2003 @ 19:27:
je kan die controlcount -1 doen als de visible state van de button false is..
lost het probleem denk ik wel op
Controls.Count is een Read Only property, dus dat kan niet

[ Voor 1% gewijzigd door RayNbow op 28-06-2003 19:32 . Reden: typo ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Verwijderd

kan je niet bijvoorbeeld:
dim concount as integer = controls.count-1
? dan haal je hem van de read-only af.

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 01:20

RayNbow

Kirika <3

Maar dat heeft geen nut, als je de Control alleen .Visible = False maakt... en je bewaart een getal in een variabele.... Dan bestaat die Control nog steeds...

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Wat is eigenlijk het probleem als die control nog bestaat maar onzichtbaar is? Het gaat er toch om dat de gebruiker die control niet kan zien en benaderen? Dat bereik je prima door hem onzichtbaar te maken. Controls.Count is geen argument, die count is totaal onbelangrijk voor je programma en als íe dat wel is, hou je toch lekker zelf een count bij?
Visual Basic .NET:
1
2
3
For Each c In UserForm1.Controls
  If c.Visible Then ccount = ccount + 1
Next c

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
Was het maar zo simpel, ik heb een UserForm die dynamisch regels data uit een text bestand haalt, iedere regel heeft een combobox met de opties "deze regel printen", "deze regel verwijderen" <- DE COMBOBOX ZELF DUS OOK!!!!! of "deze regel negeren tijdens printen"

en als ik mijn code toepas om vanuit de dynamisch aangemaakte combobox dezelfde regel + combobox te verwijderen dan krijg ik een "catastrophic failure". De reden is dat een object dat midden in een aanroep zit niet zomaar zichzelf mag verwijderen. En laat dat nu precies zijn wat ik wil doen.

Zie ook mijn Toppic: [VBA] Dynamische acties toewijzen aan een object

at your service


Verwijderd

Ik denk dat je in dat geval beter met subform's werkt.
Je zoekt het veel te moeilijk.
werk met listboxen en dergelijk en probeer zoveel mogelijk weg te blijven van dynamisch controls te laden en te unladen

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 23-08 15:12

alienfruit

the alien you never expected

of je maakt gewoon effe een nieuwe component dat de tekst en combo box keuze a la Outlook Express doet. Lijkt me niet zo'n groot probleem :S

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 17:24
Ik heb het gevonden; Ik weet wat ik fout deed.

Mijn originele code was (sterk vereenvoudigd) :


De Class : (waarin mijn fout staat)
Visual Basic:
1
2
3
4
5
6
7
8
9
Public WithEvents oBtn As MSForms.ComboBox

Private Sub oBtn_Click()

UserForm2.MultiPage1.Pages(0).Controls.Clear

Call UserForm2.EenFunctie(CInt(Left(oBtn.Name, 1)))

End Sub


Mijn UserForm:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Dim oEvents As New Collection

Private Sub Userform_Initialize()

OptionsCombo = Array("Normal", "Delete", "Insert", "Disable")

Dim oBtnEvts As Class1

Set oBtnEvts = New Class1

Set oBtnEvts.oBtn = MultiPage1.Pages(FormNumber).Controls.Add("Forms.ComboBox.1", ("1_1"), True)
                oBtnEvts.oBtn.Font.Size = TextSize
                oBtnEvts.oBtn.Left = 20
                oBtnEvts.oBtn.Top = 20
                oBtnEvts.oBtn.Width = 50
                oBtnEvts.oBtn.Height = 15.5
                oBtnEvts.oBtn.List = OptionsCombo
        oEvents.Add oBtnEvts

End Sub

Function EenFunctie(getal As Integer)

MsgBox "EenFunctie resultaat > " & getal

End Function


Mijn UserForm heeft alleen Multipage en heet UserForm2

Deze code geeft een foutmelding "Catastropic Failure" . Ik dacht meteen dat het kwam omdat ik geopend object probeerde te verwijderen. Maar dit is niet correct, ik probeer van een verwijderd object een eigenschap op te roepen : CInt(Left(oBtn.Name, 1)). Maar oBtn bestaat helemaal niet meer. De oplossing is simpel, gooi de naam van het object in een variabele voordat deze verwijderd wordt.

Class
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Private Sub oBtn_Click()

Dim getal As Integer

getal = CInt(Left(oBtn.Name, 1))

UserForm2.MultiPage1.Pages(0).Controls.Clear

Call UserForm2.henk(getal)

End Sub


Dit is weer typisch een geval van dat de code wel werkt maar dat de programmeur (ondergetekende) de verkeerde oorzaak probeert aan te pakken. Maar goed, ik kan nu een combobox aanmaken en deze zichzelf laten verwijderen tijdens runtime :*)

<edit> RayNbow NOIR had de code correct, en het is ietswat min van me om dat niet te vermelden in me'n post, sorry </edit>

[ Voor 6% gewijzigd door The_Butler op 29-06-2003 20:16 ]

at your service

Pagina: 1