Keresés

Hirdetés

!!! SZERVERLEÁLLÁS, ADATVESZTÉS INFORMÁCIÓK !!!
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!

Új hozzászólás Aktív témák

  • Mutt

    senior tag

    válasz csongi #27684 üzenetére

    Hello,

    ...egy adott cellába, legyen egy képlet, de ha kézzel beleírok akkor a beírt érték legyen, viszont ne vesszen el a képlet sem....

    Van egy kevésbé használt függvény az S (angolul N), ami ha szöveget kap értéknek, akkor nem számol vele.
    pl. =N("komment") értéke 0 és ezek után =2+N("komment") cella értéke is 2 lesz.

    Ez a függvény jön itt nekünk segítségre, mivel a cella képletét ebbe a függvénybe elrejtjük.

    A lenti makróval első lépésként megjegyezzük a cella tartalmát és képletét ha van a Worksheet_SelectionChange eseménnyel. Az egyszerűség kedvéért csak akkor tesszük, ha egyszerre 1 cella van módosítva.

    A második lépésben ha a változik vmi a lapon, akkor a Worksheet_Change esemény lép akcióba és attól függően, hogy volt-e képlet vagy sem, esetleg töröltük a cella bedobja ami kell éppen.

    A kód nem tökéletes, iránymutatásnak szántam.

    Option Explicit
    Dim KepletVanBenne As Boolean
    Dim Tartalom As String

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    KepletVanBenne = False
    Tartalom = ""

    If Target.Cells.Count = 1 Then 'egyszerűség kedvéért csak 1 cellára dolgozunk
    KepletVanBenne = Target.HasFormula 'megnézzük hogy van-e képlet a cellában
    If KepletVanBenne Then Tartalom = Target.FormulaLocal 'elmentjük a képletet egy változóba
    End If

    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim EredetiKeplet
    Dim Keresni As String

    'Excel nyelvének megállapítása
    If Application.LanguageSettings.LanguageID(msoLanguageIDUI) = 1038 Then
    Keresni = "+S("
    Else
    Keresni = "+N("
    End If

    If Target.Cells.Count = 1 Then 'egyszerűség kedvéért csak 1 cellára dolgozunk
    'ha az új cella konstans akkor mögétesszük a képletet, ha volt korábban
    If Not Target.HasFormula Then
    'megnézzük hogy a korábban volt-e képlet a cellában, ha igen akkor kinyerjük az eredeti képletet onnan
    EredetiKeplet = Split(Tartalom, Keresni) 'bízunk benne, hogy nincs a cellában +N( kifejezés más indok miatt
    If IsArray(EredetiKeplet) And UBound(EredetiKeplet) > 0 Then
    'itt kicsit formázni kell mivel vmi ilyet kapunk vissza "=A1"), de nekünk csak =A1 kell
    Tartalom = Mid(EredetiKeplet(1), 2, Len(EredetiKeplet(1)) - 3)
    End If

    'ha törlik a cella tartalmát, akkor berakuk az eredeti képletet
    If Target.Value = "" Then
    Target.FormulaLocal = Tartalom
    Else
    Target.Formula = "=" & Target.Value & "+N(""" & Tartalom & """)" 'az új cellatartalom az lesz, hogy bevitt érték + korábbi formula
    End If
    End If
    End If

    End Sub

    üdv.

  • azopi74

    addikt

    válasz csongi #27684 üzenetére

    Egy cella egyszerre csak értéket tud tárolni, de persze vba-val minden megoldható. De előtte tisztázzuk: a munkalap minden cellájára alkalmazni szeretnéd, vagy csak adott tartományra? És ennek mi értelme is van pontosan? Csak mert lehet, hogy van más, ésszerűbb megoldás is, pl tábla használat, vagy képletek backupolása egy másik munkalapra, csak attól függ, mi a cél pontosan.

Új hozzászólás Aktív témák