Telefonszámunk: 1-472-0679

Munkalap létezésének vizsgálata – érdekes VBA módszer

2017-02-16 - horvimi - Kategória: Macro-VBA, Munkalapok műveletei
Hivatkozott Excel verzio: Excel 2007 Excel 2010 Excel 2013 Excel 2016

Gyakran szükségünk lehet arra, hogy makrófutás közben megnézzük, hogy egy adott nevű munkalap létezik-e már vagy sem. Erre több megoldás is létezik, de a napokban találkoztam egy igen érdekes verzióval, ami mindenképpen megér annyit, hogy közzétegyem.

Először nézzük a hagyományos megoldásokat

A klasszikus és elegáns változat egy ciklussal elindul a munkafüzet összes munkalapján, és ha talál olyan nevűt, amit keresünk, akkor TRUE, különben FALSE értékkel tér vissza.

Function Lap_letezik(lapnev As String) As Boolean
 Dim ws as worksheet 

      Lap_letezik = False
      For Each ws In Worksheets
        If ws.name = lapnev Then
           Lap_letezik = True 
           Exit Function 
        End If 
      Next ws 
End Function

Vannak olyan megoldások, amik megpróbálnak egy műveletet végezni a megadott nevű lappal, vagy lekérdezik egy tulajdonságát. Ha nem létezik, akkor a művelet hibát fog eredményezni. A keletkező hibát pedig tudjuk érzékelni, és ez alapján eldönteni, hogy létezik a munkalap vagy nem.

Ebből az egyik, ami megvizsgálja, hogy az adott nevű munkalap objektum létezik-e.

Function lap_letezik(ByVal lapnev As String) As Boolean
   On Error Resume Next
   lap_letezik = Not Worksheets(lapnev) Is Nothing
   On Error Goto 0
End Function

A másik lekéri az adott nevű munkalap sorszámát. Ha a hibakód nulla, akkor sikerült  a művelet, azaz létezik a lap, különben pedig nem.

Function lap_letezik(lapnev As String) As Boolean
Dim nev As String

On Error Resume Next
 nev = Sheets(lapnev).Index
 If Err.Number = 0 Then
    lap_letezik = True
 Else
    lap_letezik = False
 On Error GoTo 0
End Function

Végül lássuk a beígért érdekes módszert

Tulajdonképpen ez is a „próbáljunk vele egy műveletet” kategóriába tartozik. Összeállítunk egy hivatkozást az A1-es cellára megadott nevű munkalapra, és az ISREF munkalapfüggvénnyel megvizsgáljuk, hogy sikerült-e.

Function lap_letezik(lapnev As String) As Boolean

    lap_letezik = Evaluate("ISREF('" & lapnev & "'!A1)")

End Function

Itt felhívnám a figyelmet az Evaluate függvényre.

Szövegesen összeállított képleteket tud kiértékelni, és visszaadja az eredményt. Tehát az INDIRECT függvényhez hasonlóan, string-ben, akár dinamikusan állíthatjuk össze a képletet. Míg az INDIREKT függvény argumentumában szövegesen rakhatunk össze egy hivatkozást, az EVALUATE bármilyen, szövegesen megkonstruált Excel képletet kiszámol.

Azért azt jó, ha tudjuk, hogy csak Angol függvénynevekkel működik, illetve a kiértékelendő string max. hossza 255 karakter lehet.

Vélemény, hozzászólás?