VBA Excel Userform - Textbox - vpis števislkega formata!

Pomoč pri delu z MS Excelom
Odgovori
Knez Leo
Prispevkov: 4
Pridružen: So Dec 05, 2009 12:26 pm

VBA Excel Userform - Textbox - vpis števislkega formata!

Odgovor Napisal/-a Knez Leo »

Pozdravljeni vsi. Imam naslednji problem.

Pripravil sem si Userform v Excelu (VBA), ki vsebuje tudi Text.box.
Vem, da se ta text.box lahko uporablja tudi za številske formate.
Vendar nekako ni mogoče nastaviti, da bi se le-ti ustrezno izpisali
uporabniku.

Ko bo uporabnik vanj vpisal določeno vrednost (npr.
1000, 1000000), bi rad, da se v okencu izpiše 1.000,00 oz. 1.000.000,00. Tega formata Textbox (kot objekt) ne sprejme. Predvideval bi, da ima ta programski objekt text.box v okviru svojih 'propertisov', to predvideno, kjer se to lahko nastavi, vendar tega tam ni. Imam kar nekaj izkušenj s pripravo VBA Userformov, vendar so s formati vedno določene težave.

Poudarim naj, da številski formati, ki veljajo za excelove celice ne
primejo oz. ne dajo želenega rezultata.

Private Sub TextBox4_Change()
TextBox4 = Format(TextBox4.Value, "#.##0,00") ' TO NE DELUJE!
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.TextBox1.Text = Format(Me.TextBox1, "#,##0.00")
' TUDI TA REŠITEV JE PRAKTIČNO NEUPORABNA
End Sub

Vem da je tudi možno, da dodam knjižnico, ki ima recimo maskedtexbox.
Vendar tukaj postane problem z distribucijo te knjižnice.

V kolikor ima kdo podbno izkušnjo in je zadevo uspešno rešil, prosim za nasvet.

Hvala in lep pozdrav,

Leo
Leo
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Ne razumem, zakaj trdite tole:

Koda: Izberi vse

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Me.TextBox1.Text = Format(Me.TextBox1, "#,##0.00")
  ' TUDI TA REŠITEV JE PRAKTIČNO NEUPORABNA
End Sub 
Sej bi vam namreč jaz ravno to predlagal.
lp,
Matjaž Prtenjak
Administrator
Knez Leo
Prispevkov: 4
Pridružen: So Dec 05, 2009 12:26 pm

RE:

Odgovor Napisal/-a Knez Leo »

Pozdravljeni,

neuporabna je zato, ker se format izpiše, ko jaz vnosno formo zapustim. Uporabniku tako številki formati nič ne koristi, saj ga nikoli ne vidi. Namreč koda, ki sem jo priložil sproži izpis formata v texbox-u, ko jaz zapustim vnosno formo, in NE texboxa!.

Številski format pa je namenjen uporabniku, da ima kontrolo nad tem kar je vpisal - drugače je videti: 1.000.000,00 kot 1000000. Hitro se spregleda kakšna ničla ali številka.

Upam, da sem uspel pojasniti v čem je težava.

Lp,

Leo
Leo
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: RE:

Odgovor Napisal/-a admin »

Knez Leo napisal/-a:Namreč koda, ki sem jo priložil sproži izpis formata v texbox-u, ko jaz zapustim vnosno formo, in NE texboxa!.
E to pa ni res! Res to ni v nobenem primeru, je pa možno, da se vam tako zdi, če imate na obrazcu samo in izključno eno vnosno polje. Torej če je na obrazcu samo vnosno polje potem vnosnega polje ne morete zapustiti drugače kot da zaprete obrazec in zato se sprememba nikoli ne vidi. Če pa imate/bi imeli na obrazcu več kontrol, pa bi videli spremembo takoj ko bi uporabnik iz vnosnega polje skočil na drugo kontrolo.

V primeru, da imate na obrazcu samo vnosno polje, pa bi morali formatirati številko že med vnosom, kar pa nihče ne počne, ker bi bilo to zelo moteče - tudi Excel formatira številko šele ko zapustite celico! Omenili ste MaskEdit kontrolo - zelo neuporabna stvar, ki uporabnike bolj iritira, kot jim pomaga.

Aha, če želite uporabniku nagajati že med vnosom, se morate pač odzvati na dogodek keyPress.
lp,
Matjaž Prtenjak
Administrator
Knez Leo
Prispevkov: 4
Pridružen: So Dec 05, 2009 12:26 pm

re:

Odgovor Napisal/-a Knez Leo »

Pozdravljeni.

Ni povsem tako. Moj obrazec ima več vnosnih polj, tudi option button, comboboxe, gumbe itn. Predstavljam si, da ko uporabnik zapusti textbox, in gre v drugo vnosno polje, da se številka takrat formatira - to bi bilo ok. To sem testiral in ne zgodi se tako. Formatiranje oz. koda o kateri govoriva se sproži, ko zaprem vnosno formo. Torej ko kliknem poseben gumb, ki sem ga pripravil, ali pa x desno zgoraj. To vem tako, ker sem testiral z Msgboxom in videl, da je temu res tako. Tako sem tudi pričakoval, glede na kodo, saj je iz samega oklepaja v programski kodi, ki sem jo vam podal, razvidno. Lahko pa, da je kaj drugega napačno nastavljeno in lahko najdeva rešitev kje drugje, če pravite, da je ukaz pravilni. To je mogoče. Kaj mi svetujete v tem primeru.

Hvala za vaše odzive.

Lp,

Leo
Leo
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

To ker ste zapisali in to kar trdite ne pije vode... Torej če imate res zapisano Private Sub TextBox1_Exit, potem se bo ta koda izvedla ko zapustite vnosno polje TextBox1 ==> to je mesto, ker formatirate TextBox1 - To mora delovati!.

Seveda ima vsako vnosno polje lasten _Exit odziv in vi morate to polje formatirati tam. Preizkusite še enkrat, lahko da ste v množici kode, ki jo pišete to pač spregledali. Če še vedno ne vrjamete, odprite nov obrazec nanj postavite samo dve vnosni polji in ničesar ne spreminjajte. Postavite s v VBA urejevalnik in tja skopirajte tole:

Koda: Izberi vse

Option Explicit

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  TextBox1.Text = Format(TextBox1, "#,##0.00")
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  TextBox2.Text = Format(TextBox2, "#,##0.00")
End Sub
Vpisujte cifre in skačite med polji...
lp,
Matjaž Prtenjak
Administrator
Knez Leo
Prispevkov: 4
Pridružen: So Dec 05, 2009 12:26 pm

re:

Odgovor Napisal/-a Knez Leo »

Takole bom rekel. Zadeva sploh ni tako trivialna, kot se zdi takole na hitro.

Res je, da koda, ki ste jo posredovali deluje. Vendar takšno sem imel že prej, in je bila brez napak, čeprav je res preostale kode precej. Je pa nekaj drugega, na kar bi rad opozoril in je pomemben vzrok za nedelovanje!

Na vnosni formi uporabljam tudi frame. In v kolikor je v okviru enega frame-a eno vnosno polje, potem ta vaša koda ob izhodu iz vnosnega polja NE deluje. Če v frame dodam še eno vnosno polje, potem zadeva spet prične delovati. Moj textbox je bil namreč edini v frame-u.

Pravzaprav bi rekel, da gre za kar pomembno pomankljivost VBA Usuerforms s tega vidika, saj uporabnik izgublja čas z nečim, kar je nelogično, kljub logični kodi.

Toliko za ostale, in tudi vas, če se boste kdaj srečevali še s podobnimi težavami.

Hvala za pomoč in vaše odzive. Ob priliki pa se spet oglasim, saj takole skupaj najhitreje rešujemo probleme in izmenjujemo izkušnje, ki so pri programiranju več od znanja.

lp,

Leo
Leo
admin
Site Admin
Prispevkov: 3691
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

No ja; tačas ko ste pisali gornji odziv, bi preprosto prestavili kodo iz Exit dogodka vnosnega polja v Exit dogodek okvirja:

Koda: Izberi vse

' nekaj v stilu
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  TextBox1.Text = Format(TextBox1, "#,##0.00")
End Sub
In stvar bi delovala.

PS: Vso programsko kodo, ki jo uporablajte smo napisali ljudje - programerji - in slednji smo ravnotako zmotljivi, kot vsi ostali ==> pač nekdo je v VBA kodi napisal nekaj narobe in zato je potrebno pač najti obvoz, ki je v tem primeru dokaj trivialen... ;)
lp,
Matjaž Prtenjak
Administrator
Odgovori