Hirdetés
- gban: Ingyen kellene, de tegnapra
- Chosen: Intel Arc B580 játék kompatibilitás (2026.01)
- eBay-es kütyük kis pénzért
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- Candy: Kossuth Lajos azt üzente, elfogyott a gémergépe
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- potyautas: Okos?telefon
- sh4d0w: Nyitlocker
- Luck Dragon: Alza kuponok – aktuális kedvezmények, tippek és tapasztalatok (külön igényre)
-
LOGOUT
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Mutt
senior tag
válasz
lacid90
#15975
üzenetére
Hello,
Hogyan lehet egy cella értékét eltárolni úgy, hogy lenullázás után is valahol megmaradjon az értéke.
A munkalap SelectionChange és Change eseményére kell tenned makrókat.
A Change csak akkor fut le amikor a cella értéke már megváltozott, itt a korábbi értéket már nem látod, ezért érdemes amikor a cellát kiválasztod (ez a SelctionChange) megjegyezni a korábbi értéket.Feltöltöttem egy lehetséges megoldást ide
http://www.filedropper.com/15975backupPróbáltam több logikát is beépíteni, amit a kommentek alapján akár te is ki tudsz ütni.
1. Nyit egy új munkalapot (Backup névvel) és oda menti az eredeti értéket, vmint a módosult cella címét.
2. Csak akkor ment, ha a cella tényleg megváltozik, ha ugyanaz kerül be akkor nem ment. Ha erre nem tartasz igényt akkor töröld ezt a részt:
vEredeti <> Target.Resize(1, 1).Value
3. Nem ment akkor sem, ha üres cella volt eredetileg. Ha ez sem kell, akkor ezt vedd ki:
And vEredeti <> ""
4. Ha egy cellában egy képlet van, akkor a képletet másolja és nem az eredményét. Ha ezzel nem akarsz élni, akkor a SelectionChange-ben csak ez legyen:
vEredeti = Target.Resize(1, 1).Value
bFuggvenytTartalmaz = FalseHátrányok:
1. Érvényesítést (Data Validation-t) használó celláknál nem megy.
2. Több cella egyidejű módosításakor csak a tartomány bal felső sarkában lévő cellára megy (ennek kikerülésére a második lapon próbáltam egy másik megoldást is csinálni, de az sem 100%-os).
3. Nem teszteltem túl, ezért lehet benne hiba.Itt a kód, ha a fájl már nem lenne letölthető:
Option Explicit
Public vEredeti 'ez tartalmazza majd az eredeti értéket
Public bFuggvenytTartalmaz As Boolean 'ez akkor lehet hasznos ha függvényből jön a cella érték
Private Sub Worksheet_Change(ByVal Target As Range)
Const vBackupSheet As String = "Backup"
Dim vLastRow
Dim wsNew As Worksheet
Dim wsCurrent As String
'ha az eredeti és az új érték eltér és eredetileg nem üres volt a cella akkor módosítunk
If vEredeti <> Target.Resize(1, 1).Value And vEredeti <> "" Then
'megnézzük hogy létezik-e a munkalap ahova a korábbi értékeket mentjük
On Error Resume Next
Set wsNew = Worksheets(vBackupSheet)
If Err Then
wsCurrent = ActiveSheet.Name
Set wsNew = Sheets.Add
With wsNew
.Name = vBackupSheet
'ha akarod akkor a lenti sorral rejtetté tudod tenni a lapot
'.Visible = xlSheetHidden
End With
Sheets(wsCurrent).Activate
End If
'megnézzük hogy melyik az utolsó sor a backup munkalapon (a B oszlopban mindig lesz érték)
vLastRow = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(vBackupSheet).Range("B:B")) + 1
'ha már nincs a munkalapon több üres sor akkor leállunk a naplózással
If vLastRow > ThisWorkbook.Sheets(vBackupSheet).Rows.Count Then
MsgBox "Nincs több hely a mentésre!", vbOKOnly, "Hiba"
Exit Sub
End If
'adunk egy fejlécet a backup munkalapnak
If vLastRow = 1 Then
ThisWorkbook.Sheets(vBackupSheet).Range("A" & vLastRow) = "Eredeti érték"
ThisWorkbook.Sheets(vBackupSheet).Range("B" & vLastRow) = "Módosított cella"
vLastRow = vLastRow + 1
End If
'mentjük az eredeti értéket és hogy melyik cellából jött
If bFuggvenytTartalmaz Then
ThisWorkbook.Sheets(vBackupSheet).Range("A" & vLastRow) = "'" & vEredeti
Else
ThisWorkbook.Sheets(vBackupSheet).Range("A" & vLastRow) = vEredeti
End If
ThisWorkbook.Sheets(vBackupSheet).Range("B" & vLastRow) = Target.Resize(1, 1).Address
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'ha függvényt tartalmaz a cella, akkor a függvényt másoljuk, különben az értékét
If Range(Target.Address).Resize(1, 1).HasFormula Then
vEredeti = Target.Resize(1, 1).Formula
bFuggvenytTartalmaz = True
Else
vEredeti = Target.Resize(1, 1).Value
bFuggvenytTartalmaz = False
End If
End Subüdv.
Új hozzászólás Aktív témák
Hirdetés
- Eredeti Microsoft termékek - MEGA Akciók! Windows, Office Pro Plus, Project Pro, Visio Pro stb.
- Kaspersky, BitDefender, Avast és egyéb vírusírtó licencek a legolcsóbban, egyenesen a gyártóktól!
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
- Game Pass Ultimate előfizetések 1 - 36 hónapig azonnali kézbesítéssel a LEGOLCSÓBBAN! AKCIÓ!
- Antivírus szoftverek, VPN
- BESZÁMÍTÁS! 4TB Seagate Skyhawk ST4000 SATA HDD meghajtó garanciával hibátlan működéssel
- Beszámítás! Acer Nitro V16 ANV16 120Hz Gamer notebook - R7 8845HS 32GB DDR5 1TB SSD RTX 4060 8GB W11
- iPhone 13 mini 128GB 100%(1év Garancia)
- MSI CreatorPro Z16P RTX A5500 TOUCH! (vapor chamberrel)
- Lenovo ThinkPad X1 Yoga G6 (6th Gen) - i7-1185G7, 32GB, 512GB SSD, multitouch + TOLL
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Central PC számítógép és laptop szerviz - Pécs
Város: Pécs
Fferi50
