Excel OFSET işlevini kullanma sorunu


1

"Week1", "Week2", "Week3" ... "Week7" başlıklı çok sayıda sayfa içeren bir Excel çalışma kitabım var. Her hafta, müşterilerimi ürünümü satın alan kişilerin kimliğini C sütununa giriyorum ve - bunların müşterinin iade edilip edilmediğini veya yeni olup olmadıklarını bilmekle ilgilendiğim için - girdiğim müşterilerin olup olmadığını kontrol etmek için bir işlev yazdım 2. haftada 7. hafta yeni müşteriler veya daha önce ürünümü satın alıp almadıkları.

Bu amaçla, Hafta 2 için F sütununa girdiğim aşağıdaki formülü geliştirdim:

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

"Week1" in ilgili kısmı şöyle:

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

3|  ValPot1  |  *blank*  |

"Week2" nin ilgili kısmı şöyle:

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

3|  ValPot1  |    Old    |

Şimdi, bu iyi çalışsa da, aşağıdaki işlevi kullanmak zorunda kaldığımda Hafta 7'de oldukça hantallaşıyor:

= EĞER (OR (EĞERSAY (Week1 $ C $ 3:! $ C $ 100, C3)> = 1, EĞERSAY (Week2 $ C $ 3:! $ C $ 100, C3)> = 1, EĞERSAY (Week3 $ C $ 3: $ Cı $ 100, C3)> = 1, EĞERSAY (Week4 $ c $ 3: $ c $ 10> 0-C3)> = 1, EĞERSAY (Week5 $ c $ 3: $ c $ 100, C3)> = 1, EĞERSAY (Week6 ! $ C $ 3: $ C $ 100, C3)> = 1), "Eski", "Yeni")

Sonuç olarak, aşağıdaki VBA işlevini kullanmaya çalışıyorum (başarısız olarak):

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

Hücre F3, aşağıdaki şekilde "Hafta 2" sayfasına dahil edilerek :

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

Aslında, önceki çalışma sayfası referansımı (of Week1!$C$3:$C$100) yeni SHEETOFFSETfonksiyonumla değiştiriyorum.

Ne yazık ki, bu işe yaramaz ve sadece bir #VALUE!hata döndürür . Neyi yanlış yapıyorum ve fonksiyonumu nasıl düzeltebilirim?

Yanıtlar:


2

Verileri, ek bir Hafta sütunu ile tek bir sayfada yeniden düzenlerdim. Ardından, orijinal formunuzu kullanarak, Week1 referansını tek bir sayfaya referansla değiştirerek kullanabilirsiniz.

Bunun listelenmesi gereken çok fazla yararı olacak, dosyanızı kullanmak, bakımını yapmak, biçimlendirmek ve analiz etmek çok daha kolay olacak.


2
+1 - bilgiyi kötü veri mimarisinden çıkarmak için işlevselliği geliştirmek ve sürdürmek yerine, uygun veri mimarisini (bir sayfadaki ham veri, diğer sayfalarda raporlama) kullanmak için hattan aşağıya çok fazla zaman ve baş ağrısı gelir.
teylyn

0

UDF'niz ile doğru çizgilerdesiniz, ancak mantığı biraz değiştiririm.

Aranacak aralığı ve aranacak değeri verir ve hangi sayfalara bakılacağına karar vermek için çağrıldığı sayfanın adını kullanırdım.

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

İşlevinde kullanmak için IF, buna şöyle diyeceksin:

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

İşlev önceki tüm haftaları arayacak ve müşterinin yeni (YANLIŞ) veya eski (DOĞRU) olup olmadığını size bildirecektir.


0

neden yalnızca tüm çalışma sayfalarında müşteri kimliğini arayan bir işlev kullanmıyorsunuz ve birden fazla kez bulunursa "Eski İstemci" yi döndürüyor?

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

İyi günler dilerim!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.