Ščitenje resursov v VBA

Kot klasični C/C++ programer sem obseden od ščitenja resursov!

Da najprej razčistimo, kaj resursi sploh so. V računalništvu so resursi pravzaprav vse kar računalnik uporablja, kot programerja pa nas najbolj zanimajo pomnilnik, datoteke in zunanje naprave.

Pri ščitenju resursov je ideja v tem, da vedno zagotavljate dvoje:

  1. Če resurs zasežete ga tudi sprostite.
  2. Vse resurse sproščajte čim prej. Če jih ne potrebujete več jih sprostite!

Primer je recimo odpiranje datoteke. Program odpre datoteko, piše vanjo in jo na koncu zapre… Toda, kaj če jo pozabi zapreti? Kaj če se v programski kodi zgodi napaka in se datoteka ne zapre? To je težava in nanjo je potrebno biti pozoren.

V Excelu pa se večkrat srečamo s povsem enakovrednim problemom preračunavanja. Da bi makro v Excelu tekel hitreje v večini primerov na začetku postavimo preračunavanje na ročno – izvedemo makro in postavimo preračunavanje nazaj na avtomatično

A kaj če pozabimo oz. se zgodi napaka 🙁 ? Uporabnik ostane z delovnim zvezkom, ki se ročno preračunava in seveda je zmeden…!

Sub Delujoce()
  Dim oldCalculation
  oldCalculation = Application.Calculation
  Application.Calculation = xlCalculationManual

  ' tu vmes je veliko vrstic kode…
  Dim i As Long
  For i = 1 To 10000
    Debug.Print i
  Next

  Application.Calculation = oldCalculation
End Sub

Toda čez nekaj časa kodo popravljamo in zapišemo nekaj takšnega…?

Sub NEDelujoce()
  Dim oldCalculation
  oldCalculation = Application.Calculation
  Application.Calculation = xlCalculationManual

  ' tu vmes je veliko vrstic kode…
  Dim i As Long
  For i = 1 To 10000
    Debug.Print i

    ' PROBLEM!!!
    If (i Mod 123 = 12) Then Exit Sub
  Next

  Application.Calculation = oldCalculation
End Sub

Sedaj se bo v nekem primeru funkcija zaključila prej in Excel ostane v ročnem preračunu! Napaka!

Rešitev

Rešitev ponuja objektno programiranje oz ideja konstruktorjev ~ destruktorjev. Konstruktor je funkcija, ki se izvede ob ustvarjanju objekta, destruktor pa se zgodi ob uničenju objekta. Lepota obeh funkcij je v tem, da sta privzeti in ju ni potrebno eksplicitno klicati.

Dobro; konstruktor pokličemo vedno ko objekt ustvarimo – to kot programerji zagotovo naredimo. A objekt se ob koncu ob koncu funkcije uniči avtomatično. No natančneje rečeno,  se objekt uniči ob koncu njegove življenske dobe, ki je odvisna od tega,kje ga ustvarimo… A to zdajle ni tako pomembno.

In to je ključ do uspeha. V konstruktorju zasežemo resurse, ob destruktorju pa se slednji avtomatično sprostijo in vse je lepo in prav.

Kako to izvesti v VBA-ju pa pokažem naslednjič.

Tags: , , , , ,

Leave a Reply

You must be logged in to post a comment.