חשבתי רבות לסדר את כל הסוגיא כאן דבר דבור על אופניו, אני אדגים את מהלך הדברים בדוגמאות וצילומי מסך עם ההסבר כמובן:
סעיף 1:
בצילום מסך כאן
צפה בקובץ המצורף 1585413
בתא a8 אנו מבקשים מפונקציית len לספור את ס"ך התוים (מבלי להיכנס עכשיו להבדלים בין פונקצייה זו לפונקציות דומות כמו counta בשאלת אילו תוים נכללים ואלו לא...)שבכל תא מתא a1 עד a5
עד כאן הכל טוב,יפה ומובן.
סעיף 2:
כעת אנו נוסיף בתא a15 תנאי למשוואה ,התנאי הוא לכלול בספירה רק תאים שמכילים מעל 3 תוים
צפה בקובץ המצורף 1585417
כאן כללי הספירה כבר שונים.יש כאן תנאי!
תנאי נמדד בהחזר של true או false.סה טו!
ולכן אין כאן החזר של מספר התוים בכל תא אלא תשובה כלפי השאלה של התנאי.(אני מדגיש זאת וחשוב לזכור את הניואנס הזה)
הפונקצייה מחזירה בשרשור את סדר התאים והתשובה האם מדובר בtrue או false
הלאה,הבה נתקדם שלב...
סעיף 3:
אם נרצה לדעת במספר כמה תאים בסה"כ הוחזר true
לכאורא הפיתרון הוא לעטוף את כל הסיפור הזה בפונקציית sumproduct
אז הנה עשיתי זאת בתא a22
צפה בקובץ המצורף 1585426
הופ!! התשובה היא 0
מה קרה פה בדיוק?
ראשית.צריך להזכיר שלמרות שפונקצייה זו בדרך כלל מקבלת שני(או יותר) טווחים/מערכים ,מכפילה(כברירת מחדל) בין המערכים (תא כנגד תא באותה שורה) ואז מסכמת את התוצאות,
כאשר יש רק מערך אחד היא פשוט מסכמת את כל התאים שבו.
ומה קרה פה ?
התשובה היא שההחזר שהתקבל פה הוא ביטוי לוגי.הביטוי אמנם שווה ערך בפוטנציאל שלו לערך מספרי של 0 או 1
אבל הפונקצייה "לא יודעת" לבצע לבד את ההמרה הזו מביטוי לוגי לערך מספרי.
שהפונקצייה עושה חיבור של כל התוצאות ,אז כל התוצאות שוות ל0 .
0+0+0+0+0=0
סעיף 4:
אנו צריכים "לעזור לפונקצייה" ולתת לה כלי שיתווך לה שתוכל לבצע את ההמרה הזו בקלות-איזה push קטן...
צפה בקובץ המצורף 1585450
כאן בתא a25 זה קורה סוף סוף בעזרת טכניקת Double unary , התוצאה היא 3
3 פעמים של החזר true . כל true שכזה שווה ערך ל1
1+1+1=3
אדגיש כאן נקודה חשובה כי כל ההסבר כאן תקף לגיליון אקסל בלבד.
בגיליון שיטס ישנם חשבונות אחרים והכרח לעטוף את הפונקציות בפונקציית arryformula וזה כבר משנה את כל כללי המשחק והלוגיקה...
@למה כעת אמשיך ואתייחס לשאלותיך
שאלה 1:
בגיליון אקסל ללא הוספת דאבל מינוס התוצאה תהיה 0
צפה בקובץ המצורף 1585455
כאן זה עם דאבל מינוס -כאשר הדאבל מינוס מופיע לפני הסוגריים עם התנאי
רק כך זה עובד!
שאלה 2:
אני אדגים ואסביר שורה אחת במערך פה ותקיש על כל יתר השורות
צפה בקובץ המצורף 1585457
בחשבון של הפונקצייה
הואיל והתקיים התנאי וכתוב בתא a2 אברהם
זה כאילו כתוב בתא a2 את הספרה 1.ואת ערך זה הפונקצייה כופלת בתא שבעמודה e מאותה שורה, קרי תא e2
שכתוב בה 30 ש"ח
אז 1*30= 30
וכן הלאה והלאה בכל השורות למטה.לאחר מכן הפונקצייה סוכמת את כל המכפלות והתוצאה 431
שאלה 3:
בנידון כאן אין נפקא מינה לתוספת ארגומנט שיהיה מופנה לעמודה שכתוב בה 1
כי יש כאן פלט של 1 כאשר מתקיים התנאי ומה התועלת במכפלה נוספת ב1
אם אחזור לדוגמא בשאלה 2 אז
1*30=30
וכן 1*1*30=30
וכן 1*1*1*30=30
עכשיו.אני רוצה לחדד את הלוגיקה פה לגבי שאלתך מהפיתרון לעיל בxlookup
צפה בקובץ המצורף 1585462
יפה שאלת...למה כאן נוסף אחד וכן למה לא היה צורך בשימוש בטכניקת פעולת חיסור כפולה?
א. "בפשטות" היה ניתן להשיב שאלו שתי פונקציות שונות "ואין לאדמויי מילתא למילתא"....
ב.אבל זה לא רק זה.יש כאן עומק נוסף...
שים לב שבכל הארגומנט השני נוסף פעולת כפל
.כאשר יש פעולה מתאמטית זה "כופה" על האקסל להמיר ערך טקסט או לוגי לפורמט מספרי.
בעבר הזכרתי את עיקרון זה בלינק המצורף
האקסל שלי 'השתגע'. יש לו נוסחה כבר שנים רבות לחשב תשלומים, ועכשיו מכניסים לדוג' על תלמיד ששילם 500 ובסיכום כתוב 7833, מחליפים ל-5 נהיה 12440 האם יש באג בקובץ? האם יתכן שזה קובץ מדי כבד? דחוף ממש
www.prog.co.il
ולכן כל הפלט בארגומנט השני שבפונקציית xlookup כאשר מתקיים התנאי שווה ל1
הxlookup בסופו של ענין "מסתכל" על הערך שכתוב בארגומנט הראשון שכתוב בו 1
"ורושם לעצמו בצד" את כל התוצאות שהתקבל בהן הערך 1 מהארגומנט השני ומחזיר את הערך התחתון ביותר(תוצאה בודדת)
בדוגמא ששאלת לא התקיים מיסגור שני המערכים בסוגריים עם סימון כפל ממשי בינהם
ואם ההינו עושים כך. זה היה "כופה" על הפונקצייה את ההמרה הזו
רוצה הוכחה? הנה...
תראה כאן שוב את תא g25 לאחר עריכה מחודשת
צפה בקובץ המצורף 1585489
הכל עובד פתאום! ללא סימון חיסור כפול...
ג. יש כאן שוני במבנה הארגומנטים שבפונקציות וכן בפעולה הבסיסית של הפונקציות.
פונקציית xlookup היא לא נחשבת פונקצייה "מתאמטית"
תפקידה היא להחזיר תוצאה (בארגומנט 3) כאשר מותאמת השוואה בין ארגומנט 1 לארגומנט 2
אבל פונקציית sumproduct בבסיסה היא פונקצייה שמבצעת פעולות מתאמטיות
וכאשר מתקיים תנאי הפונקצייה מחזירה 1
מכאן ולהבא אין צורך להשוות את ההחזר שהתקבל באיזה ערך, הפונקצייה פשוט סוכמת את התוצאה וזהו,
ולכן להוסיף עוד ארגומנט שכתוב בו 1 בכל הטווח זה מיותר לחלוטין ולא מוסיף שום דבר.
מצורף גיליון אקסל עם הדוגמאות שהבאתי לעיל
הארכתי כאן רבות("שיעור כללי" שלם
) כדי לחדד ולהבהיר מספר נקודות חשובות. ואני מקווה שכעת הכל מובן ומתיישב על הדעת...
(עמלתי עמל רב בשכלי ודעתי ליישב כאן את כל הדוגמאות והקושיות. שהכל יהיה ערוך ומובן.
בשורה תחתונה זה היה תהליך מהנה...)
תודה רבה לך על שאלותיך המחכימות...!