Nechápem, prečo nechceš pracovať s Excelom normálnym spôsobom. To, že máš v jednej bunke základnú hodnotu, v druhej percento a v tretej vypočítanú hodnotu, je najlepší spôsob, ako to riešiť.
Pridaná hodnota takéhoto makra je nulová. Okrem toho, že používateľ musí povoliť makrá, aby mu to vôbec fungovalo, úplne zbytočne prichádzaš aj o možnosť Undo.
Keď už to chceš tak veľmi riešiť makrom, tak:
1. Vyhoď celý modul s funkciami CalculatePercentage a SetNewBase.
2. Uprav funkciu Workbook_Open v ThisWorkbook na:
Private Sub Workbook_Open()
Sheet1.Initialize
End Sub
3. Do Sheet1 vlož nasledovný kód:Private aPercentageNumbers() As PercentageNumber
Private Type PercentageNumber
PercentageAddress As String
NumberAddress As String
BaseNumber As Variant
End Type
Public Sub Initialize()
Dim aIndex As Integer
ReDim Preserve aPercentageNumbers(1 To 2)
With aPercentageNumbers(1)
.PercentageAddress = "P16"
.NumberAddress = "M16"
End With
With aPercentageNumbers(2)
.PercentageAddress = "P17"
.NumberAddress = "M17"
End With
For aIndex = LBound(aPercentageNumbers) To UBound(aPercentageNumbers)
With aPercentageNumbers(aIndex)
.BaseNumber = Range(.NumberAddress) / (1 - Range(.PercentageAddress))
End With
Next aIndex
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aIndex As Integer
Application.EnableEvents = False
For aIndex = LBound(aPercentageNumbers) To UBound(aPercentageNumbers)
With aPercentageNumbers(aIndex)
If Not Intersect(Target, Range(.PercentageAddress)) Is Nothing Then
Range(.NumberAddress).Value = .BaseNumber * (1 - Range(.PercentageAddress))
End If
If Not Intersect(Target, Range(.NumberAddress)) Is Nothing Then
.BaseNumber = Range(.NumberAddress)
Range(.PercentageAddress).Value = 0
End If
End With
Next aIndex
Application.EnableEvents = True
End Sub
4. Buď ručne spusti makro Initialize, alebo zošit ulož, zatvor a otvor.