[ Pannello di Controllo Moderatore ]
Attilafdd ha scritto: ... perchè non ho capito bene la suddivisione che hai fatto tra primo, secondo e terzo periodo...
Riga = 28
charlie ha scritto:Già che ci siamo, se la data iniziale del periodo bolletta è inferiore alla data iniziale di permanenza, una quota non dovrebbe essere attribuita a nessuno inquilino (oppure al proprietario come ha interpretato correttamente Attilafdd)
Sub RipartoSpese
Dim oSheet As Object
Dim i As Long, n As Long
Dim Riga As Long
oSheet = ThisComponent.Sheets(0)
AddrSpese = ThisComponent.NamedRanges.getByName("TabellaSpese").ReferredCells.RangeAddress
AddrInq = ThisComponent.NamedRanges.getByName("TabellaInquilini").ReferredCells.RangeAddress
AddrElInq = ThisComponent.NamedRanges.getByName("Inquilini").ReferredCells.RangeAddress
ColTab = AddrSpese.StartColumn
CilInq = AddrInq.StartColumn
Riga = 28 REM RIGA DI INIZIO GRIGLIA
svc = createUnoService("com.sun.star.sheet.FunctionAccess")
For i = AddrSpese.StartRow To AddrSpese.EndRow REM CICLO CHE ATTRAVERSA LA TABELLA SPESE
Spesa = oSheet.getcellbyposition(ColTab, i).String
DatIniSp = oSheet.getcellbyposition(ColTab+1, i).Value
DatFinSp = oSheet.getcellbyposition(ColTab+2, i).Value
ImpSpesa = oSheet.getcellbyposition(ColTab+3, i).Value
ReDim ArrGiorni(0 To (DatFinSp - DatIniSp))
For t = 0 To Ubound(ArrGiorni)
ArrGiorni(t) = DatIniSp + t
Next t
For x = AddrInq.StartRow To AddrInq.EndRow REM CICLO CHE ATTRAVERSA LA TABELLA INQUILINI
Inquilino = oSheet.getcellbyposition(ColInq, x).String
DatIniInq = oSheet.getcellbyposition(ColInq+1, x).Value
DatFinInq = oSheet.getcellbyposition(ColInq+2, x).Value
Giorni = 0
For t = DatIniInq To DatFinInq
For p = 0 To Ubound(ArrGiorni)
If ArrGiorni(p) = t Then
Giorni = Giorni + 1
exit for
End if
Next p
Next t
oSheet.GetCellByPosition(0, Riga).String = Spesa
oSheet.GetCellByPosition(1, Riga).Value = DatIniSp
oSheet.GetCellByPosition(2, Riga).Value = DatFinSp
oSheet.GetCellByPosition(1, Riga).NumberFormat = 30
oSheet.GetCellByPosition(2, Riga).NumberFormat = 30
oSheet.GetCellByPosition(3, Riga).Value = ImpSpesa
oSheet.GetCellByPosition(3, Riga).NumberFormat = 104
oSheet.GetCellByPosition(AddrElInq.StartColumn-1 ,Riga).String = "GG"
oSheet.GetCellByPosition(AddrElInq.StartColumn-1 ,Riga+1).String = "Quota/Inq"
REM CERCO L'INQUILINO NELLA GRIGLIA
For y = AddrElInq.StartColumn To AddrElInq.EndColumn
iF oSheet.GetCellByPosition(y ,AddrElInq.StartRow).String = Inquilino Then
ColonnaInq = y
Exit For
End If
Next y
if Giorni > 0 Then
oSheet.GetCellByPosition(ColonnaInq, Riga).Value = Giorni
End if
TotGiorni = TotGiorni + Giorni
Next x
For q = AddrElInq.StartColumn To AddrElInq.EndColumn
If oSheet.GetCellByPosition(q, Riga).Value > 0 Then
oSheet.GetCellByPosition(q, Riga+1).Value = ImpSpesa/TotGiorni * oSheet.GetCellByPosition(q, Riga).Value
oSheet.GetCellByPosition(q, Riga+1).NumberFormat = 104
End If
Next q
Riga = Riga + 2
TotGiorni = 0
Set Dic = Nothing REM RIPORTO A NOTHNG IL DIZ
Next i
msgbox "Finito"
End Sub
charlie ha scritto:Ho modificato alcune date per semplificare la situazione e renderla (spero) comprensibile.
Sub RipartoSpese
Dim oSheet As Object
Dim i As Long, n As Long
Dim Riga As Long
calc = createUnoService( "com.sun.star.sheet.FunctionAccess" )
oSheet = ThisComponent.Sheets(0)
AddrSpese = ThisComponent.NamedRanges.getByName("TabellaSpese").ReferredCells.RangeAddress
AddrInq = ThisComponent.NamedRanges.getByName("TabellaInquilini").ReferredCells.RangeAddress
AddrElInq = ThisComponent.NamedRanges.getByName("Inquilini").ReferredCells.RangeAddress
ColTab = AddrSpese.StartColumn
CilInq = AddrInq.StartColumn
Riga = 28 REM RIGA DI INIZIO GRIGLIA
svc = createUnoService("com.sun.star.sheet.FunctionAccess")
For i = AddrSpese.StartRow To AddrSpese.EndRow REM CICLO CHE ATTRAVERSA LA TABELLA SPESE
Spesa = oSheet.getcellbyposition(ColTab, i).String
DatIniSp = oSheet.getcellbyposition(ColTab+1, i).Value
DatFinSp = oSheet.getcellbyposition(ColTab+2, i).Value
ImpSpesa = oSheet.getcellbyposition(ColTab+3, i).Value
Proprietario = False
ReDim ArrGiorni(0 To (DatFinSp - DatIniSp))
For t = 0 To Ubound(ArrGiorni)
ArrGiorni(t) = DatIniSp + t
Next t
For x = AddrInq.StartRow To AddrInq.EndRow REM CICLO CHE ATTRAVERSA LA TABELLA INQUILINI
Inquilino = oSheet.getcellbyposition(ColInq, x).String
DatIniInq = oSheet.getcellbyposition(ColInq+1, x).Value
DatFinInq = oSheet.getcellbyposition(ColInq+2, x).Value
Giorni = 0
For t = DatIniInq To DatFinInq
For p = 0 To Ubound(ArrGiorni)
If ArrGiorni(p) = t Then
Giorni = Giorni + 1
exit for
End if
Next p
Next t
oSheet.GetCellByPosition(0, Riga).String = Spesa
oSheet.GetCellByPosition(1, Riga).Value = DatIniSp
oSheet.GetCellByPosition(2, Riga).Value = DatFinSp
oSheet.GetCellByPosition(1, Riga).NumberFormat = 30
oSheet.GetCellByPosition(2, Riga).NumberFormat = 30
oSheet.GetCellByPosition(3, Riga).Value = ImpSpesa
oSheet.GetCellByPosition(3, Riga).NumberFormat = 104
' oSheet.GetCellByPosition(AddrElInq.StartColumn-1 ,Riga).String = "GG"
' oSheet.GetCellByPosition(AddrElInq.StartColumn-1 ,Riga+1).String = "Quota/Inq"
REM CERCO L'INQUILINO NELLA GRIGLIA
For y = AddrElInq.StartColumn To AddrElInq.EndColumn
iF oSheet.GetCellByPosition(y ,AddrElInq.StartRow).String = Inquilino Then
ColonnaInq = y
Exit For
End If
Next y
if Giorni > 0 Then
oSheet.GetCellByPosition(ColonnaInq, Riga).Value = Giorni
Redim Preserve ArrayDatIniInq( 0 To g)
ArrayDatIniInq(g) = DatIniInq
g = g + 1
End if
TotGiorni = TotGiorni + Giorni
Next x
g = 0
If DatIniSp < calc.callFunction( "MIN", ArrayDatIniInq()) Then
GiorniPr = calc.callFunction( "MIN", ArrayDatIniInq()) - DatIniSp
TotGiorni = TotGiorni + GiorniPr
End If
If GiorniPr> 0 Then
oSheet.GetCellByPosition( AddrElInq.StartColumn-1, Riga).Value = GiorniPr
GSpesa = DatFinSp - DatIniSp + 1
oSheet.GetCellByPosition( AddrElInq.StartColumn-1, Riga+1).Value = ImpSpesa/GSpesa * GiorniPr
ImpSpesa = ImpSpesa - ImpSpesa/GSpesa * GiorniPr
TotGiorni = TotGiorni - GiorniPr
oSheet.GetCellByPosition( AddrElInq.StartColumn-1, Riga+1).NumberFormat = 104
End If
For q = AddrElInq.StartColumn To AddrElInq.EndColumn
If oSheet.GetCellByPosition(q, Riga).Value > 0 Then
oSheet.GetCellByPosition(q, Riga+1).Value = ImpSpesa/TotGiorni * oSheet.GetCellByPosition(q, Riga).Value
oSheet.GetCellByPosition(q, Riga+1).NumberFormat = 104
End If
Next q
Riga = Riga + 2
TotGiorni = 0
GiorniPr = 0
Next i
msgbox "Finito"
End Sub
Gaetanopr ha scritto:le ultime 5 righe escono fuori perchè la tabella non è tutta piena
Gaetanopr ha scritto:Altrimenti inserisci manualmente i risultati dove credi sia l'errore
charlie ha scritto:Ho cambiato i dati per evidenziare meglio il problema, si tratta di un periodo dal 01/01/16 al 31/01/16 in cui non ci sono inquilini.
Attilafdd ha scritto:ho modificato le formule per la ripartizione...
Gaetanopr ha scritto:però mi da un risultato diverso dal tuo
Visitano il forum: Nessuno e 8 ospiti