Problemi con la funzione OFFSET di Excel


1

Ho una cartella di lavoro di Excel con numerosi fogli dal titolo "Settimana1", "Settimana2", "Settimana3" ... "Settimana7". Ogni settimana inserisco gli ID dei clienti delle persone che acquistano il mio prodotto nella colonna C e, poiché sono interessato a sapere se si tratta di clienti di ritorno o se sono nuovi, ho scritto una funzione per verificare se i clienti che inserisco in Week2-Week7 sono nuovi clienti o se hanno già acquistato il mio prodotto.

A tal fine, ho sviluppato la seguente formula che ho inserito nella colonna F per Week2:

=IF(COUNTIF(Week1!$C$3:$C$100,C3)>=1,"Old","New")

Con la parte rilevante di "Week1" simile a:

_|-----C-----|-----F-----|

3|  ValPot1  |  *blank*  |

Con la parte rilevante di "Week2" simile a:

_|-----C-----|-----F-----|

3|  ValPot1  |    Old    |

Ora, sebbene funzioni bene, diventa piuttosto ingombrante dal Week7, quando devo usare la seguente funzione:

= SE (OR (COUNTIF (Week1 $ C $ 3: $ C $ 100, C3)> = 1, COUNTIF (settimana2 $ C $ 3: $ C $ 100, C3)> = 1, COUNTIF (Week3 $ C $ 3: $ C $ 100, C3)> = 1, COUNTIF (Week4 $ C $ 3: $ C $ 10> 0, C3)> = 1, COUNTIF (Week5 $ C $ 3: $ C $ 100, C3)> = 1, COUNTIF (Week6 ! $ C $ 3: $ C $ 100, C3)> = 1), "vecchio", "Nuovo")

Di conseguenza, ho provato (senza successo) a utilizzare la seguente funzione VBA:

Function SHEETOFFSET(offset, Ref)

'   Returns cell contents at Ref, in sheet offset

    Application.Volatile

    With Application.Caller.Parent

        SHEETOFFSET = .Parent.Sheets(.Index + offset) _

         .Range(Ref.Address).Value

    End With

End Function

Incorporandolo nel foglio "Week2", cella F3, nel modo seguente:

=IF(COUNTIF(SHEETOFFSET(-1,$C$3):SHEETOFFSET(-1,$C$100),C3)>=1,"Old","New")

In effetti, sto solo sostituendo il mio precedente riferimento del foglio di lavoro (di Week1!$C$3:$C$100) con la mia nuova SHEETOFFSETfunzione ....

Sfortunatamente, questo non funziona e restituisce semplicemente un #VALUE!errore. Cosa sto sbagliando e come posso correggere la mia funzione?

Risposte:


2

Riorganizzerei i dati in un singolo foglio, con una colonna Settimana aggiuntiva. Quindi è possibile utilizzare la formula originale, sostituendo il riferimento Week1 con un riferimento al singolo foglio.

Ciò avrà troppi altri vantaggi da elencare, rendendo il tuo file molto più facile da usare, mantenere, formattare e analizzare.


2
+1: è più semplice e risparmia molto, molto tempo e mal di testa per utilizzare l'architettura dei dati corretta (dati grezzi in un foglio, rapporti in altri fogli), piuttosto che sviluppare e mantenere funzionalità per convincere le informazioni a non utilizzare architetture di dati errati.
teylyn,

0

Sei sulla giusta linea con il tuo UDF, ma cambierei leggermente la logica.

Gli darei l'intervallo da cercare, il valore da cercare e userei il nome del foglio da cui viene chiamato per decidere quali altri fogli guardare.

Function CheckCustomer(offset, Ref)

Dim InitialSheet As String
Dim WeekNum As Long
Dim SheetLoop As Long

InitialSheet = Application.Caller.Parent.Name 
'know where the function is called from
WeekNum = Val(Mid(InitialSheet, 5)) - 1
' week to start searching from is one less than current sheet name

For SheetLoop = 1 To WeekNum
    If WorksheetFunction.CountIf(Sheet("Week" & SheetLoop).Range(offset.address), Ref.Value) > 0 Then
        'Found name - return true, and stop looking for more
        CheckCustomer = True
        Exit Function
    End If
Next
'all searches didn't find value, so new customer
CheckCustomer = False

End Function

Per usarlo nella tua IFfunzione, lo chiameresti così:

=IF(CheckCustomer($C$3:$C$100,C3),"Old","New")

La funzione cercherà tutte le settimane precedenti e ti farà sapere se il cliente è nuovo (FALSO) o vecchio (VERO)


0

perché non usare semplicemente una funzione che cerca l'ID cliente in tutti i fogli di lavoro e se viene trovata più di una volta, restituirà "Vecchio client"?

Function newclient(clientID As String) As String
Dim count As Integer

For Each Worksheet In Worksheets
    If Not Worksheet.UsedRange.Find(clientID, lookat:=xlWhole) Is Nothing Then
      count = count + 1
      MsgBox (count)
    End If
Next Worksheet

If count > 1 Then
  newclient = "Old client"
Else

newclient = "New client"
End If

End Function

Buona giornata!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.