Jump to content

GetIf - Εύρεση δεδομένων σε Excel v3.00


4 Screenshots

About This File

Συνάρτηση για Excel. Βρίσκει και επιστρέφει αντικείμενα από Συλλογή_2 έτσι ώστε να αντιστοιχούν σε αντικείμενα Συλλογής_1 που είναι ίδια με Κριτήριο (ή ανισότητα)

Χρήση απλή σε κελί, με επιστροφή του πρώτου αποτελέσματος μόνο, ή σε Array με πληθώρα επιλογών

 

Συντάσσεται αντίστοιχα με την SUMIF(), δηλαδή: GetIf( Range1 ; Criteria ; Range2 ; ArraySize )

πχ: GetIf( {11;12;13;14} ; 12 ; {Μιτσος;Νικος;Πετρος;Μακης} ) = Νικος

 

Range1: εδώ ψάχνει (πχ {11;12;13;14})

Criteria: για αυτό ψάχνει (πχ 12)

Range2: (Προαιρετικό) Εδώ ψάχνει σε αντιστοιχία με τη θέση που βρήκε το Criteria στο Range1 (πχ {Μιτσος;Νικος;Πετρος;Μακης})

επιστρέφει: οτι/οσα βρήκε (πχ Νικος). Αν δεν υπάρχει Range2 τότε επιστρέφει τις θέσεις των ταιριασμάτων

(ArraySize): (Προαιρετικό) Πόσα αποτελέσματα θα επιστρέψει. Μικραίνοντας τον αριθμό γίνεται πιο γρήγορη η συνάρτηση γιατί μόλις βρεί τα απαραίτητα, σταματάει...

 

Βλέπετε οδηγίες εντός για περισσότερα!

Υπάρχουν 2 αρχεία, για Excel 2003 και Excel 2007

 

Αν δουλεύετε με πολλές αναζητήσεις το Excel και έχετε κουραστεί να παλεύετε με τις Index() Match() Smaller() κλπ τότε πιστεύω θα σας αρέσει.

Μην διστάσετε να στείλετε σχόλια/προτάσεις/προβλήματα.

ΠΡΟΣΟΧΗ: Για χρήση σε Arrays απαιτεί γνώση Arrays και τοποθέτηση με ctrl+shift+enter ...




User Feedback

Recommended Comments

Βάζω τον κώδικα εδώ για να αποφύγουν οι συνάδελφοι και φίλοι το download/insert module κλπ. και να κάνουν τις δοκιμές τους πιο εύκολα.

Δυο παρακλήσεις ωστόσο:

1) Διαβάστε τα αρχικά σχόλια και τη περιγραφή πριν από ερωτήσεις, και αν κάτι δεν σας τρέχει κάντε download και δείτε τις εφαρμογές που έχω στο excel

2) Κατά την αντιγραφή του κώδικα μην σβήσετε τίποτα (πληροφορίες/στοιχεία κλπ) ούτε από τα σχόλια. Το διαθέτω τελείως ελεύθερο προς χρήση και μεταβολή αλλά με την υποχρέωση να διατηρείτε και να ενημερώνετε με τις αλλαγές σας τα σχόλια (edit_4 κλπ) με τα στοιχεία σας. Καλό είναι να ξέρουμε ποιος κάνει τι...

 

ακολουθεί ο κώδικας:

' EDIT_3 (Jun 2012): Few MAJOR changes.
' Added "Optional ArraySize As Long = 1"
' now: a = range to look into for match (could be range/ranges/array/name)
'	  b = lime to look for OR lime with comparison elements (ex: >=2)
'	  c Optional: If c exists then GetIf will return items from c (range/array...) where b matches a
'				  if c is missing then GetIf returns the indexes of matches found
'	  ArraySize Optional: Default =  1 : return 1 result
'						  special = -1 : find quantity of matches through CountIF and return so many results
'						  normal 1 to...: find as many as exist in an array as big as Asked!
'							   When covering an array of N elements with GetIf it is especially useful to send an
'							   Arraysize of N since it will return 0 elemements in empty slots while (-1) or a
'							   smaller number will return #N/A in empty slots.
' GetIf will always return a Vertical Array of elements according to ArraSize {getif(N,1)}. Can be used normaly
' for one result (default) without Array experience. Use Traspose() of Excel to convert to Horizontal
' ex: transpose( GetIf(N,1) ) = GetIf(1,N)
'
' TIPS: Use with excel formulas: Offset(),Index(),Smaller(),Larger(),Rows(1:N),Columns(1:N) for unlimited usage.
' See examples
'
' Goylandris Apostolos
'
' EDIT_2 (Jun 2012): c (range2) made Optional. If c is missing then return
' the Counter found so that range1(Counter)=b, then use Counter with Offset function!!!
' GoRandom has gone bye bye... complicated things
'
' Goylandris Apostolos
'
' EDIT_1
' H Optional-> GoRandom proste8hke gia tyxaio gemisma pinaka - mperdema, sto IKA
' to b egine b as string ka8ws se merikes periptwseis den edeine ta anamenomena. Pleon doyleyei kalytera
'
' Goylandris Apostolos
'
' Original (Apr 2008)
' Syntax exactly like SUMIF, that is "GetIf (Range1;Criteria;Range2)"
' and finds range2(i) so that range1(i)=criteria
' No controls/checks, no speed or other improvements made by function
'
' Goylandris Apostolos
'
Public Function GetIf(a, b As String, Optional c, Optional ArraySize As Long = 1)
Dim Counter As Long, Counter2 As Long, Counter3 As Long, dum1, EvalFL As Boolean, matchFL As Boolean
Dim Counters() As Long, Holder()
' Fix ArraySize
If ArraySize = 0 Then ArraySize = Evaluate(Application.WorksheetFunction.CountIf(a, )
If ArraySize < 1 Then ArraySize = 1	 ' Restore to 1 even if evaluate finds 0 to avoid errors
' properly allocate arrays for VERTICAL results. Use TRANSPOSE() in excel fo HORIZONTAL
ReDim Counters(1 To ArraySize, 1 To 1), Holder(1 To ArraySize, 1 To 1)
' Enable trapping for Greater than or Smaller than functions
If InStr(b, ">") > 0 Then EvalFL = True
If InStr(b, "<") > 0 Then EvalFL = True
Counter = 0: Counter2 = 0: Counter3 = 0
For Each dum1 In a				  ' Search for index
   Counter = Counter + 1: matchFL = False
   If EvalFL Then
    If Evaluate(Format(dum1, "#0") +  Then matchFL = True
   Else
    If b = Trim(dum1) Then matchFL = True
   End If
   If matchFL Then
    Counter3 = Counter3 + 1
    Counters(Counter3, 1) = Counter
    If Counter3 = ArraySize Then Exit For   'Search only as many as asked for
   End If
Next
If Counter3 > 0 Then					    ' if something was found
   If IsMissing(c) Then				    ' Edit:Jun2012 Ommitting range2 (c) returns Position within range
    GetIf = Counters
   Else
    Counter = 1
    For Each dum1 In c				  ' Use index to find equivalent
	    Counter2 = Counter2 + 1
	    If Counter2 = Counters(Counter, 1) Then
		    Holder(Counter, 1) = dum1
		    Counter = Counter + 1
		    If Counter > Counter3 Then Exit For 'Search only as many as asked for
	    End If
    Next
    GetIf = Holder
   End If
Else
   GetIf = "-":
End If
End Function

Share this comment


Link to comment
Share on other sites

If InStr(b, ">") > 0 Then EvalFL = True
If InStr(b, "<") > 0 Then EvalFL = True

 

την ανισότητα δεν την χρειαζόμαστε και θα την βγάλω σε επόμενη έκδοση, καθώς μπορούμε να στείλουμε πίνακα με TRUE/FALSE τιμές:

πχ =getif(C27:C40*7<50;TRUE;;14) θα επιστρέψει τις θέσεις (σχετικές) των δεδομένων που επαληθεύουν τα υπογραμμισμένα...

 

όποιος έχει ιδέες για βελτίωση ή ανακαλύπτει χρήσεις νέες, μην διστάζετε να τα στέλνετε...

Share this comment


Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.