modoste
Altın Üye
- Katılım
- 31 Mayıs 2008
- Mesajlar
- 3,710
- Excel Vers. ve Dili
- Microsoft OFFİCE Ev ve İş 2019 TR
DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
Altın Üyelik Hakkında Bilgi
Option Explicit
Sub KalemleriDengele()
Dim ws As Worksheet
Dim sonSatir As Long
Dim i As Long
Dim hedefToplam As Double
Dim sabitToplam As Double
Dim serbestEskiToplam As Double
Dim kalanToplam As Double
Dim eskiTutar() As Double
Dim yeniTutar() As Double
Dim altSinir() As Double
Dim ustSinir() As Double
Dim manuelMi() As Boolean
Dim aktifMi() As Boolean
Set ws = ThisWorkbook.Worksheets("Sayfa1")
sonSatir = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
hedefToplam = ws.Range("J1").Value
ReDim eskiTutar(2 To sonSatir)
ReDim yeniTutar(2 To sonSatir)
ReDim altSinir(2 To sonSatir)
ReDim ustSinir(2 To sonSatir)
ReDim manuelMi(2 To sonSatir)
ReDim aktifMi(2 To sonSatir)
For i = 2 To sonSatir
eskiTutar(i) = ws.Cells(i, "B").Value
altSinir(i) = ws.Cells(i, "C").Value
ustSinir(i) = ws.Cells(i, "D").Value
If Trim(ws.Cells(i, "E").Value) <> "" Then
manuelMi(i) = True
yeniTutar(i) = ws.Cells(i, "E").Value
Else
manuelMi(i) = False
yeniTutar(i) = eskiTutar(i)
End If
aktifMi(i) = Not manuelMi(i)
Next i
sabitToplam = 0
For i = 2 To sonSatir
If manuelMi(i) Then
sabitToplam = sabitToplam + yeniTutar(i)
End If
Next i
serbestEskiToplam = 0
For i = 2 To sonSatir
If Not manuelMi(i) Then
serbestEskiToplam = serbestEskiToplam + eskiTutar(i)
End If
Next i
kalanToplam = hedefToplam - sabitToplam
If kalanToplam < 0 Then
MsgBox "Hata", vbCritical
Exit Sub
End If
If serbestEskiToplam = 0 And kalanToplam <> 0 Then
MsgBox "Hata", vbCritical
Exit Sub
End If
For i = 2 To sonSatir
If Not manuelMi(i) Then
yeniTutar(i) = eskiTutar(i) / serbestEskiToplam * kalanToplam
End If
Next i
Dim degisti As Boolean
Dim serbestToplam As Double
Dim dagitilacak As Double
Do
degisti = False
dagitilacak = hedefToplam
For i = 2 To sonSatir
If manuelMi(i) Then
dagitilacak = dagitilacak - yeniTutar(i)
End If
Next i
For i = 2 To sonSatir
If Not manuelMi(i) And aktifMi(i) Then
If yeniTutar(i) < altSinir(i) Then
yeniTutar(i) = altSinir(i)
aktifMi(i) = False
degisti = True
ElseIf yeniTutar(i) > ustSinir(i) Then
yeniTutar(i) = ustSinir(i)
aktifMi(i) = False
degisti = True
End If
End If
Next i
If degisti Then
For i = 2 To sonSatir
If Not manuelMi(i) And Not aktifMi(i) Then
dagitilacak = dagitilacak - yeniTutar(i)
End If
Next i
serbestToplam = 0
For i = 2 To sonSatir
If Not manuelMi(i) And aktifMi(i) Then
serbestToplam = serbestToplam + eskiTutar(i)
End If
Next i
If serbestToplam = 0 And Abs(dagitilacak) > 0.0001 Then
MsgBox "Hata", vbCritical
Exit Sub
End If
For i = 2 To sonSatir
If Not manuelMi(i) And aktifMi(i) Then
yeniTutar(i) = eskiTutar(i) / serbestToplam * dagitilacak
End If
Next i
End If
Loop While degisti
Dim kontrolToplam As Double
kontrolToplam = 0
For i = 2 To sonSatir
kontrolToplam = kontrolToplam + yeniTutar(i)
ws.Cells(i, "F").Value = Round(yeniTutar(i), 4)
Next i
ws.Range("J2").Value = kontrolToplam
End Sub