Evaluate

Pomoč pri izdelavi makrov
Odgovori
AndrejL
Prispevkov: 25
Pridružen: Po Nov 10, 2008 9:22 pm

Evaluate

Odgovor Napisal/-a AndrejL »

pozdravljeni!

delam določeno aplikacijo in del te aplikacije je tudi določanje "filtra" s strani uporabnika. zelo poenostavljeno rečeno: uporabnik bo napisal formulo 3*A + 2*B, makro pa bo potem to računal na ogromni množici parov A, B, ki so že določeni.

moja ideja je, da bi v userform vstavil textbox, kjer bi uporabnik napisal formulo kot recimo zgoraj: 3*A + 2*B. jaz pa bi potem naredil kodo, ki bi spremenila določen del makroja, da bi računal to formulo.

imam težave z razlago, zato je tukaj primer. mogoče ni videti jasne povezave s tem, kar sem pisal zgoraj, je pa najbolj poenostavljen primer težave, ki jo imam.

Koda: Izberi vse

Option Explicit
Sub Rezultat()

MsgBox 1

End Sub
Sub Test()

Dim i%

For i = 1 To 3

    ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 4, "Msgbox " & i
    Call Module1.Rezultat
    
Next i

End Sub
makro Test naj bi spreminjal 4. vrstico modula in sicer naj bi tam zapisal "Msgbox i", i=1, 2, 3. kar dejansko tudi naredi. ampak vseeno se pravilno izračuna samo 1. ponovitev.

torej, če zaženem makro Test, se mi izpiše 1, 1 in 1 namesto 1, 2 in 3.

in ni mi jasno zakaj, čeprav je na koncu vrstica 4 "Msgbox 3", kar pomeni, da se je makro dejansko spreminjal.

kakšna ideja? lahko tudi kakšen predlog, kako bi se tega drugače lotil.

hvala in lp, andrej
admin
Site Admin
Prispevkov: 3690
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Uf tega ste se pa lotili narobe. Spreminjanje kode je najslabši možni način in že dolgo ne deluje več. Včasih, ko sem imel Amigo in C64 smo res tako programirali, saj je bil Basic klasični interpreter. Dandanes pa to ne gre več. VBA je pravzaprav prevajalnik in kodo vzame, jo prevede in izvede. To pomeni, da VBA vedno izvaja prevedeno kodo, čeravno vi izvorno spremenite.

Za rešitev vašega problema boste morali napisati klasiični parser ali pa kupiti takšno komponento (npr: http://www.aivosto.com/eval.html).
lp,
Matjaž Prtenjak
Administrator
AndrejL
Prispevkov: 25
Pridružen: Po Nov 10, 2008 9:22 pm

Odgovor Napisal/-a AndrejL »

hja, to mi je jasno, da spreminjanje kode med delovanjem ni najbolj bistra ideja, kar sem jih imel do sedaj :lol:

ampak dokler se ne spomnim druge, je ta najboljša. kupovanje česarkoli (zaenkrat) ne pride v poštev...

ste mi dali pa idejo, kako jo spremenim, da deluje.

Koda: Izberi vse

Option Explicit
Sub Rezultat(A%, B%)

MsgBox A + 2 * B

End Sub
Sub Test()

Dim i%, form$

form = "A+2*B"
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 4, "Msgbox " & form

Call Module1.Rezultat(1, 2)
Call Module1.Rezultat(1, 0)
Call Module1.Rezultat(0, 2)

End Sub

hvala in lp,

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

Odgovor Napisal/-a admin »

ne razumem sicer kaj ste s tem dosegi, toda če ste zadovolni je pač ok :)
lp,
Matjaž Prtenjak
Administrator
AndrejL
Prispevkov: 25
Pridružen: Po Nov 10, 2008 9:22 pm

Odgovor Napisal/-a AndrejL »

ni kaj razumeti. no, dosegel sem to, da za razliko od prvega posta makro sedaj deluje. zakaj ne bi bil zadovoljen...

če pa mislite na širšo sliko, kako bom to uporabil, pa ni kaj razumeti, ker je to samo 1% vsega skupaj. in niti ne tako pomemben...
admin
Site Admin
Prispevkov: 3690
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Ampak kolikro sem vas jaz razumel ste želeli vi spremeniti izraz in računati z novim izrazom:

Koda: Izberi vse

 ' glede na vaš primer...
form = "A+2*B"
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 4, "Msgbox " & form 

   ...
   ...

form = "3*A+B"
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ReplaceLine 4, "Msgbox " & form 

  ...
  ...
To pa vam ne bo delovalo in torej niste dosegli prajtično nič?
lp,
Matjaž Prtenjak
Administrator
Odgovori