Excel + Visual Basic = #ÉRTÉK!

Excel + Visual Basic = #ÉRTÉK!
2004-07-07T22:39:52+02:00
2004-07-10T08:23:23+02:00
2022-10-21T05:55:43+02:00
soloo
Üdv mindenkinek. A gondom a következő volna:
írtam egy pár függvényt Excelhez, ahol a függvények jól is működnek, egy eset kivételével.
Van két függvény, ami egy harmadik cellába írt érték alapján kitölti a cellát. Ezzel nincs is semmi gond.
A következő függvény bemenete az előző két cella, amit alapesetben a fent említett fv tölt ki, de néha manuálisan felül van írva. Ha ide valós érték kerül, akkor a függvény visszaadja a kívánt paramétert. Azonban ha a két bemeneti cella üres, akkor a függvény cellájában a #ÉRTÉK! hibaüzenet jelenik meg.
Próbáltam lekezelni az üres bemeneti értéket is, de a végeeredmény nem változott.
Ez mitől van, és hogyan lehet korrigálni?
Előre is köszi a segítséget.
Mutasd a teljes hozzászólást!
Igy is lehet a Range-t kezelni:
Public Function zizi(ParamArray p() As Variant) Dim i, j, r, cnt As Long, v As Variant, NC, NR On Error GoTo Xerr If IsMissing(p) Then zizi = 0: Exit Function r = 0: cnt = 0 For Each i In p If TypeName(i) = "Range" Then For NR = 1 To i.Rows.Count For NC = 1 To i.Columns.Count r = r + i.Cells(NR, NC) cnt = cnt + 1 Next NC Next NR Else r = r + i cnt = cnt + 1 End If Next i zizi = r / cnt Exit Function Xerr: Err.Clear zizi = "" End Function
Ezta Fv.-t pl így is meg lehet hívni:
=PERSONAL.XLS!zizi(A1:B4,1,2,3,4,C5)
Ebben az esetben az A1:B4 egy Range objektum, az 1,2,3,4 sima szám, a C5 egy cella.
Még egy érdekesség:
Ha a kódszerkesztőben Tools->Options->General->Error Trapping értéke "Break on All Errors" akkor hibás paraméter esetén a visszatérési értéke "#Érték!", ha "Break on Unhandled Errors" akkor viszont a visszatérési érték "" (üres cella) lesz a
Zizi=""
sor hatására.
Mutasd a teljes hozzászólást!

  • Hali!

    Ha jól értelmezem akkor csináltál egy function-t, amit a felhasználói fgv-ek közül kiválasztottál egy cellában.

    Ha ez igaz akkor le kell kezelned azt az esetet a fgv-en belül amikor üres cellát kapsz paraméterként. pl.:
    public function MyFunc(Elso as Range, Masodik as Range) as string If Elso.Cells(1,1)="" or Masodik.Cells(1,1)="" then MyFunc = "" Exit Function End if ... End function

    Üdv,
    stl
    Mutasd a teljes hozzászólást!
  • Hasonlóval próbálkoztam, de nem jött össze, bár az én függvényem a bemeneti adatokat stringként értelmezte.
    Ez a range ez tulajdonképpen mi is? Akár egy munkalap is lehet? A függvényhívásnál hogy adom azt meg neki?
    Mutasd a teljes hozzászólást!
  • Akkor néhány válasz egy-két mintával:
    Function fuggv(egyik As Variant, masik As Variant) As Variant If VarType(egyik) < 2 Or VarType(masik) < 2 Then ' ez van, ha üres valamelyik vella fuggv = "" Exit Function End If ' Innen a fv fuggv = VarType(egyik) End Function

    A függvény bemeneti értéke azért Variant, mert így bármi lehet. Ha Range, akkor szerintem állandót nem lehet megadni neki, csak tartományt.
    Range esetén így néz ki:
    Function xx(tart as Range)
    Hívás:
    =xx(A1) vagy =xx(A10:B20)

    Ilyenkor pl. egy
    For each elem in tart ' az elem rendre a tartommány egy-egy eleme next
    szerkezettel lehet végigmenni rajta.
    Akkor célszerű, ha nem csak a cellák értéke, hanem pl. a címe, formája, stb. is kell.

    ------

    Ettől függetlenül az üres cella nem feltétlenül "", de a vartype függvénnyel lehet vizsgálni a tartalmát.
    Súgó:
    vbEmpty 0 Empty (uninitialized)
    vbNull 1 Null (no valid data)
    vbInteger 2 Integer
    vbLong 3 Long integer
    ...
    vbError 10 Error value
    ...

    Tehát (az első mintába) ha kisebb mint 2, akkor nem tartalmaz adatot (Null vagy üres), Így egy fv a bemeneti hibás (vbError) adatot is tudja korrigálni.

    ---

    Ha elképzelhető, hogy nem ad a felhasználó paramétert, akkor a következőket lehet az "Optional" segítségével:
    Function fuggv(Optional egyik As Variant, Optional masik As Integer = 1) As Variant

    Az "egyik" változónak nem lesz értéke, ha nem adták meg a hívásnál, ezt a
    if IsMissing(egyik) then ' Nincs érték
    formával lehet kezelni. Ennek a változónak Variant-nak kell lennie.
    A "másik" változó tipusa bármi lehet, ha nincs értéke, akkor a mintámba 1 lesz. (Tehát tartalmaz egy értékadást is)

    Ha van kötelező és optionalis adat is, akkor a kötelezőket elöbb kell felsorolni, és utána jöhetnek az Optionalisak.
    ----
    "Akár egy munkalap is lehet?"

    Munkalap nem (ahhoz object, vagy worksheet változó kellene), de egy munkalap összes cellája igen.
    Mutasd a teljes hozzászólást!
  • Igy is lehet a Range-t kezelni:
    Public Function zizi(ParamArray p() As Variant) Dim i, j, r, cnt As Long, v As Variant, NC, NR On Error GoTo Xerr If IsMissing(p) Then zizi = 0: Exit Function r = 0: cnt = 0 For Each i In p If TypeName(i) = "Range" Then For NR = 1 To i.Rows.Count For NC = 1 To i.Columns.Count r = r + i.Cells(NR, NC) cnt = cnt + 1 Next NC Next NR Else r = r + i cnt = cnt + 1 End If Next i zizi = r / cnt Exit Function Xerr: Err.Clear zizi = "" End Function
    Ezta Fv.-t pl így is meg lehet hívni:
    =PERSONAL.XLS!zizi(A1:B4,1,2,3,4,C5)
    Ebben az esetben az A1:B4 egy Range objektum, az 1,2,3,4 sima szám, a C5 egy cella.
    Még egy érdekesség:
    Ha a kódszerkesztőben Tools->Options->General->Error Trapping értéke "Break on All Errors" akkor hibás paraméter esetén a visszatérési értéke "#Érték!", ha "Break on Unhandled Errors" akkor viszont a visszatérési érték "" (üres cella) lesz a
    Zizi=""
    sor hatására.
    Mutasd a teljes hozzászólást!
  • Köszönöm a válaszokat. Micu válasza sokat segített, de sorry, a kérdésemre a legjobb választ TibuD írta, mint érdekesség.
    Még egyszer köszönöm.
    Mutasd a teljes hozzászólást!
  • Kis kiegészítés:
    A belső dupla ciklus helyett
    If TypeName(i) = "Range" Then For Each NR In i r = r + NR Next NR cnt = cnt + i.Cells.Count Else

    Csak sebességi és trükközési kérdés
    Mutasd a teljes hozzászólást!
  • Kösz, átírtam
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd