Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

creazione nuova funzione

59 views
Skip to first unread message

Stefano Piccioli

unread,
May 25, 2023, 10:41:41 AM5/25/23
to
Ho creato una nuova funzione

Public Function assenze(ese As String, rig As Range)
Dim c As Variant
Dim Colon_na, ore_mod1, ore_mod2, ore_mod3 As Integer
Dim Ri_ga, tot, tot_e As Integer
assenze = 0
Conta = 0
tot = 0
c = 0
n_foglio = ActiveWorkbook.Sheets(ActiveSheet.Index).Name
Application.Volatile
For Each c In rig
Ri_ga = c.Row
Colon_na = c.Column
ore_mod1 = Worksheets(n_foglio).Cells(31, Colon_na).Value
ore_mod2 = Worksheets(n_foglio).Cells(32, Colon_na).Value
ore_mod3 = Worksheets(n_foglio).Cells(33, Colon_na).Value

tot = ore_mod1 + ore_mod2 + ore_mod3
tot_e = ore_mod2 + ore_mod3
PRES = Worksheets(n_foglio).Cells(Ri_ga, Colon_na).Value

If PRES = "X" Or PRES = "x" Then
PRES = 0
End If

If ese = "E" Then
If tot_e - PRES > 0 Then
Conta = Conta + tot_e - PRES
End If
Else
If tot - PRES > 0 Then
Conta = Conta + tot - PRES
End If
End If
Next c

assenze = Conta
End Function


il problema che utilizzandola in diversi fogli la selezione rig si aggiorna su tutti i fogli con i valori del foglio attivo, mentre vorrei che considerasse la selezione diversa per ogni foglio

grazie

issdr

unread,
May 25, 2023, 8:05:15 PM5/25/23
to
Stefano Piccioli wrote:

> Ho creato una nuova funzione

[...]

> n_foglio = ActiveWorkbook.Sheets(ActiveSheet.Index).Name

elimina questa riga


[...]

> ore_mod1 = Worksheets(n_foglio).Cells(31, Colon_na).Value
> ore_mod2 = Worksheets(n_foglio).Cells(32, Colon_na).Value
> ore_mod3 = Worksheets(n_foglio).Cells(33, Colon_na).Value

diventano:

ore_mod1 = Cells(31, Colon_na).Value
ore_mod2 = Cells(32, Colon_na).Value
ore_mod3 = Cells(33, Colon_na).Value


[...]

> PRES = Worksheets(n_foglio).Cells(Ri_ga, Colon_na).Value

diventa:

PRES = Cells(Ri_ga, Colon_na).Value

[...]

in sostanza, la funzione "sa" in quale foglio si trova, togliendo i
riferimenti al foglio attivo dal codice dovresti risolvere

Stefano Piccioli

unread,
May 28, 2023, 2:41:00 PM5/28/23
to
Grazie, ma purtroppo non funziona succede sempre come prima

issdr

unread,
May 28, 2023, 8:03:22 PM5/28/23
to
Stefano Piccioli wrote:

>> in sostanza, la funzione "sa" in quale foglio si trova, togliendo i
>> riferimenti al foglio attivo dal codice dovresti risolvere
> Grazie, ma purtroppo non funziona succede sempre come prima

se puoi condividere un file d'esempio può essere d'aiuto

Stefano

unread,
Jun 1, 2023, 3:26:59 PM6/1/23
to

issdr

unread,
Jun 1, 2023, 7:28:34 PM6/1/23
to
Stefano wrote:

> Il giorno lunedì 29 maggio 2023 alle 02:03:22 UTC+2 issdr ha scritto:
>> Stefano Piccioli wrote:
>>
>> >> in sostanza, la funzione "sa" in quale foglio si trova, togliendo i
>> >> riferimenti al foglio attivo dal codice dovresti risolvere

mi sbagliavo!

>> > Grazie, ma purtroppo non funziona succede sempre come prima
>> se puoi condividere un file d'esempio può essere d'aiuto
> Ecco il link per scaricare copia il file

ho risolto con un riferimento all'oggetto "genitore" dell'argomento rig
passato alla funzione, ovvero il foglio da cui viene chiamata. tramite
l'istruzione with, ogni chiamata .cell pesca i valori dal foglio dove
sta la funzione.

--8<---------------cut here---------------start------------->8---
Function assenze(ese As String, rig As Range) As Integer
Dim C As Variant
Dim Colon_na, ore_mod1, ore_mod2, ore_mod3 As Integer
Dim Ri_ga, tOt, tot_E As Integer
assenze_ap = 0
ConTa = 0
tOt = 0
C = 0

Application.Volatile

For Each C In rig
Ri_ga = C.Row
Colon_na = C.Column

With rig.Parent 'restituisce il foglio in cui sta l'intervallo "rig"

ore_mod1 = .Cells(31, Colon_na).Value
ore_mod2 = .Cells(32, Colon_na).Value
ore_mod3 = .Cells(33, Colon_na).Value

tOt = ore_mod1 + ore_mod2 + ore_mod3
tot_E = ore_mod2 + ore_mod3

PReS = .Cells(Ri_ga, Colon_na).Value

End With

If PReS = "X" Or PReS = "x" Then
PReS = 0
End If

If ese = "E" Then
If tot_E - PReS > 0 Then
ConTa = ConTa + tot_E - PReS
End If
Else
If tOt - PReS > 0 Then
ConTa = ConTa + tOt - PReS
End If
End If
Next C

assenze = ConTa
End Function
--8<---------------cut here---------------end--------------->8---

casanmaner

unread,
Jun 2, 2023, 11:57:23 AM6/2/23
to
Il giorno venerdì 2 giugno 2023 alle 01:28:34 UTC+2 issdr ha scritto:

>
> With rig.Parent 'restituisce il foglio in cui sta l'intervallo "rig"
>
> ore_mod1 = .Cells(31, Colon_na).Value
> ore_mod2 = .Cells(32, Colon_na).Value
> ore_mod3 = .Cells(33, Colon_na).Value
>
> tOt = ore_mod1 + ore_mod2 + ore_mod3
> tot_E = ore_mod2 + ore_mod3
>
> PReS = .Cells(Ri_ga, Colon_na).Value
>
> End With


Forse, se ho inteso qual è ciò che si desidera ottenere, una possibile alternativa:

With rig
ore_mod1 = .Item(31 - Ri_ga + 1, Colon_na - 4).Value
ore_mod2 = .Item(32 - Ri_ga + 1, Colon_na - 4).Value
ore_mod3 = .Item(33 - Ri_ga + 1, Colon_na - 4).Value
tOt = ore_mod1 + ore_mod2 + ore_mod3
tot_E = ore_mod2 + ore_mod3
PReS = .Item(1, Colon_na - 4).Value
End With

Stefano

unread,
Jun 2, 2023, 2:14:24 PM6/2/23
to
Questo funziona Grazie!!!!

issdr

unread,
Jun 2, 2023, 5:51:08 PM6/2/23
to
casanmaner wrote:

> Forse, se ho inteso qual è ciò che si desidera ottenere, una possibile
> alternativa:
>
> With rig
> ore_mod1 = .Item(31 - Ri_ga + 1, Colon_na - 4).Value
> ore_mod2 = .Item(32 - Ri_ga + 1, Colon_na - 4).Value
> ore_mod3 = .Item(33 - Ri_ga + 1, Colon_na - 4).Value
> tOt = ore_mod1 + ore_mod2 + ore_mod3
> tot_E = ore_mod2 + ore_mod3
> PReS = .Item(1, Colon_na - 4).Value
> End With

.item, certo, così il riferimento diventa l'oggetto stesso.

grazie

0 new messages