תמונת שער.jpg


תמונת מקור - Leonardo AI

סביר להניח שנתקלתם בשמה של פונקציה זו לא אחת…

יתכן גם שתהיתם לרגע אודות תפקידה ועל הלוגיקה המיוחדת שבה…

במאמר זה (וכן במאמרים הבאים) תגלו כמה שהיא מסקרנת, נפלאה וסופר גאונית.

ואני מתכוון לפונקציית indirect באקסל / גוגל שיטס.

סקרנים לשמוע? קדימה התחלנו…

יומן מסע - חלק א:

תחילה, אפתח בכמה מילים על תפקידה של הפונקציה:

ובכן, פונקציית indirect מתרגמת כתובות של תאים ומחרוזות טקסט, מאתרת את התא ומחזירה את תוכנו.

ניתן להקליד בתוך הפונקציה שם של תא או טווח תאים והפונקציה תחזיר את הערך הנמצא בתא או ניתן להקליד בתוכה שם שנקבע לתא והיא תחזיר את תוכנו.

ובקצרה - פונקצית indirect "יודעת" לקבל טקסט, שהוא בעצם כתובת של תא (או של טווח תאים) ולהמיר אותו מטקסט אל כתובת תא.

בואו נראה דוגמה ויזואלית לכך:

לפניכם צילום מסך מתוך הגיליון המצורף בלינק להלן:

תמונה גיליון ראשי.png


בתא A1 כתוב הערך / המספר 1. את זאת כולכם רואים היטב…

זהו מבנה הפונקציה בתא A7:

קוד:
=INDIRECT("A1")

פונקציית indirect בנויה מ 2 ארגומנטים.

הארגומנט הראשון - חובה הוא ref_text. בארגומנט זה יש להזין הפניה לתא בפורמט A1 או R1C1 (על פורמט זה אסביר תיכף).

בדוגמה שלנו - ההפניה היא לתא A1.

שימו לב כי באקסל/שיטס יש להקיף / לעטוף את ההפניה לתא במרכאות כפולות.

תפקידן של המרכאות הכפולות הוא - "להסביר" לפונקציה שמחרוזת הטקסט "A1" היא מייצגת כתובת תא שהיא "יעד סופי".
לאחר "ההסבר הזה" הפונקציה "תסתכל" בתא A1 ותחזיר את התוכן שבו.


והתוצאה היא - 1.

יומן מסע - חלק ב:

ויש דרך נוספת להזין את ההפניה לתא באמצעות "מערכת הפניה R1C1" (באנגלית R1C1 Reference Style).

אני אסביר…

שורה באנגלית = row.

עמודה באנגלית = column.

במערכת זו R1C1 הכוונה לתא A1. כי תא זה נמצא בשורה הראשונה ובעמודה הראשונה.

אם נרצה לציין את תא B5 למשל אנו נכתוב במערכת זו R5C2 שהרי תא זה נמצא בשורה החמישית ובעמודה השניה.

על פי מערכת הפניה R1C1 חובה להזין את מספר השורה (R) ולאחר מכן את מספר העמודה (C) ולא להיפך!

אם אתם מתקשים להבין את השפה "המוזרה הזו" זה בסדר, אתם לא לבד…

רק שתדעו שסגנון זה היה הברירת מחדל באקסל החל משנת 1982. באיזה שהוא שלב בשנת 1993 (מסיבות כאלו ואחרות…) השתנתה הברירת מחדל באקסל וייצוג ההפניה לתאים נכתבת בפורמט הנהוג והמורגל לכולנו - A1.

(אם תרצו, תוכלו לקרוא עוד בנושא זה בלינק כאן.)

כיום, מערכת הפניה R1C1 "נהוגה" ופרקטית יותר בעיקר בכתיבת קידוד מאקרו - VBA באקסל.

כמו כן, ניתן לשנות את פורמט ההפניה לתאים בגיליון אקסל (דווקא) מפורמט "A1" לפורמט "R1C1" באמצעות הגדרות האקסל כדלהלן:

יש לפתוח את תוכנת אקסל > קובץ > אפשרויות > נוסחאות > תחת הכותרת עבודה עם נוסחאות > יש לסמן את התיבה סגנון הפניה R1C1 > אישור.

תמונה אקסל.png


ולאחר הקדמה זו נחזור שוב לפונקציית indirect ולצילום מסך הנ"ל.

זהו מבנה הפונקציה בתא A8:

קוד:
=INDIRECT("R1C1",FALSE)

הרעיון כאן, שישנה דרך נוספת להסביר לפונקציה את ההפניה לתא באמצעות פורמט R1C1.

זו דרך נוספת לבטא את שמו של התא A1 וכנ"ל.

גם כאן, חוקי הפונקציה בכל הקשור לעטיפת ההפניה לתא במרכאות כפולות תקפים לחלוטין.

וכיון שההפניה היא לערך של תא A1 עצמו יש לעטוף את R1C1 במרכאות כפולות.

הופ…רגע רגע…נותר להבין מה משמעות ה false שהוזן בארגומנט השני ומה תפקידו?

שאלה מצוינת!

ובכן, ברמה העקרונית הארגומנט השני [a1] נחשב אופציונאלי. כלומר אינו חובה.

בארגומנט זה, יש להזין את הערך הלוגי שמציין את סוג ההפניה שמכיל התא ref_text.

אם [a1] הוא true או שהוא מושמט, הפונקציה תקרא את ref_text כהפניה בסגנון A1.

אם [a1] הוא false, הפונקציה תקרא את ref_text כהפניה בסגנון R1C1.


במקרה שלנו ההפניה היא בסגנון R1C1. ולכן ישנו הכרח וחובה להזין בארגומנט השני false. אחרת, תוחזר שגיאת ref.

יומן מסע - חלק ג:

זהו מבנה הפונקציה בתא A9:

קוד:
=INDIRECT(D1)

בארגומנט של הפונקציה כתוב - D1.

ומהו הערך שהוזן בתא D1?

יצאנו לבדוק…

ובכן, כפי שכולכם רואים, בתא D1 כתוב A1.

שימו לב כי בשונה מהאמור לעיל (בחלק א) הערך D1 אינו מוקף במרכאות כפולות בארגומנט של הפונקציה.

זו "הנחיה" לפונקציה שתראה את הערך D1 "כהפניה לתא אחר".


כעת, לאחר ההסבר של בעל הגיליון לפונקציה, מהלך פעולתה של פונקציית indirect נראה כך:

סימולציה.png


שלב 1:

הפונקציה "מאתרת" את תא D1 שהוזן בארגומנט שבה.

שלב 2:

הפונקציה "מבינה" ומתרגמת את "הטקסט" שנכתב בתא D1 (דהיינו A1) כהפניה לתא A1 ומחפשת שוב את תא A1.

שלב 3:

לאחר שהפונקציה "מאתרת" את תא A1 - הפונקציה מחזירה בתא A9 את התוכן שנכתב בתא A1.
והתוצאה היא - 1.

וואו, זהו ממש מסע "ארוך"...

כן, זה נראה סיבוב ארוך ומייגע אך אל דאגה, פונקציית indirect מספיק חרוצה וגאונית לבצע את כל התהליך הזה בשבריר שניה.

מה שחשוב עבורנו הוא להבין, להפנים ולזכור את הלוגיקה הייחודית והמיוחדת של פונקציית indirect.

כשהערך בתא D1 הוא מחרוזת טקסט המייצגת כתובת תא (למשל A1), הפונקציה משתמשת בתוכן של תא D1 בתור הפניה לתא המטרה. כלומר, התא D1 לא המטרה עצמה אלא ה"מפנה" (הפניה לכתובת).
וכי הערך שבתא D1 הוא בסה"כ טקסט שמייצג את כתובת התא אליו רוצים לגשת (כמו A1).

זו הייחודיות בפונקציית indirect הנפלאה!

זהו חלק מה - D.N.A שלה!

יומן מסע - חלק ד:

בואו נראה יחד מה קורה כאשר פונקציה אחרת כמו פונקציית sum נתקלת במקרה שכזה.

זהו מבנה הפונקציה בתא D7:

קוד:
=SUM(D1)

אתם זוכרים כבר מהו "הערך" שהוזן בתא D1.

נכון, מדובר בערך A1.

והתוצאה של פונקציית sum היא - 0!!!

אתם יודעים מה הסיבה לכך?

כי פונקציית sum מהותה לבצע פעולת חיבור - לִסְכּוֹם ותו לא!

פונקציית sum "מבינה" במספרים בלבד. ככה היא בדיוק המתמטיקה - מספרים בלבד!

וכאן? הפונקציה פשוט "לא יודעת" לתרגם את הערך שנכתב בתא D1 כהפנייה לתא אלא כיעד סופי. הפונקציה רואה בערך A1 "טקסט בעלמא" ללא שום משמעות נוספת.

וכיוון שאין שום פעולת חיבור לטקסט "יבש" כמו A1 - פונקציית sum מחזירה 0 כלומר כלום, גורנישט.


את מה שפונקציית indirect "יודעת" ומצליחה לפענח ולתרגם - פונקציית sum אינה "יודעת"...

כאמור לעיל, פונקציית indirect ייחודית ומיוחדת…

יומן מסע - חלק ה:

אם נרצה לעקוף את המכשול הזה "ולסייע" לפונקציית sum להבין ולתרגם את הנכתב בארגומנט שבה כהפניה לתא- הדבר אפשרי בהחלט.

הפתרון הוא - לעטוף את הערך שהוזן בארגומנט הפונקציה בפונקציית indirect - וכמובן, ללא מרכאות כפולות כאמור לעיל.

זהו מבנה הפונקציה בתא G7:

קוד:
=SUM(INDIRECT(G1))

הופ! התוצאה היא - 1.

בדרך זו ניתן לסכום כמה תאים יחדיו (ולא רק תא בודד) כמו למשל בתא G8:

קוד:
=SUM(INDIRECT(G2))

יומן מסע - חלק ו:

זוכרים את מערכת R1C1 שהסברתי אודותיה לעיל בחלק ב?

זו "שפה" לציון מיקום תא שרק פונקציית indirect מבינה ויודעת (בברירת המחדל של האקסל).

וכאשר "נוספת למשוואה" פונקציית sum זה בהחלט פנטסטי ובבחינת "טובים השניים מן האחד"...

תראו למשל את מבנה הפונקציות בתא J8:

קוד:
=SUM(INDIRECT(J2,FALSE))

התוצאה היא 3.

אכן - 3 = 2 + 1 (הערך בתא A1 הוא 1. והערך בתא A2 הוא 2)

יומן מסע - חלק ז:


כן, אני סמוך ובטוח שהשאלה הבאה עומדת לכם על קצה הלשון. ובצדק…

השאלה הזו כל כך "זועקת" ומתבקשת מאליה…

במילה אחת - למה?

ובכמה מילים וביתר פירוט-

למה לנו להסתובב סחור סחור כדי להשיג תוצאה בעוד שניתן להשיג את אותה התוצאה בדרך הכי ישירה, פשוטה וקלה?

למה לנו להפנות (בתא A9 כפי שהסברתי לעיל בחלק ג) את פונקציית indirect לחפש את תא D1.

ואז…להמיר ולתרגם את תוכן התא להפניה לתא A1.

ואז…לאתר את תא A1.

ורק אז…להחזיר את תוכן תא A1 (דהיינו הספרה 1) לתא A9.


וכי מה יותר פשוט בעולם מביצוע הפניה ישירה לתא A1 כפי המודגם בתא A10?

קוד:
=A1

גם כאשר אנו מדברים על פונקציית sum כפי הנכתב בארוכה לעיל בחלק ד - ה עולה וזועקת השאלה - למה לא לכתוב את הטווח לסכימה באופן ישיר בארגומנט שבה כמו A1:A2 וכדומה ? מה יותר פשוט מכך?

בקיצור, למה ומדוע? ומה התועלת בכל זה?

יומן מסע - חלק ח:


אם אסכם במילה אחת את התשובה לשאלה הנ"ל אז התשובה היא - דִּינָמִיּוּת!

להלן (בחלק י)אני אסביר ואף אתן דוגמה לכך כהמחשה.

אבל לפני כן וברשותכם, אסביר תחילה 2 מושגים שאולי לא הכרתם.

מושג ראשון - טווח בעל שם:

טווח בעל שם באקסל/שיטס הוא שם שניתן לטווח תאים מסוים בגליון עבודה, במקום להשתמש בכתובות התאים הישירות (כמו A1:B5). כך ניתן להתייחס לטווח זה בשם פשוט וקל לזכור בתוך נוסחאות, מה שמייעל את העבודה ומפחית טעויות. למשל, במקום לכתוב בארגומנט של פונקציית sum את הטווח A1:B5 אפשר להגדיר את הטווח בשם "מכירות" ואז לכתוב(מכירות)sum=

חשוב להזכיר כי הטווח הוא נחשב מקובע "לחלוטין" והוא רלוונטי במקרים בהם אנו נרצה להזין באופן רגיל טווח שהוא מקובע "לחלוטין" דהיינו הן כלפי תחילת הטווח והן כלפי סוף הטווח - הן כלפי השורה והן כלפי העמודה.
במקרים בהם אנו נרצה להזין קיבוע "חלקי" - יש להזין בדרך הרגילה, הפשוטה והידועה לכולם.

כיצד ליצור טווח בעל שם באקסל/שיטס?

ובכן, אני אסביר את הדרך הקלה והמהירה לביצוע משימה זו:

לאחר בחירת התא/ים הרצוי/ים יש לעבור לחלון כתובת התא ושם למחוק את השם הקיים (שהוא כתובת התא לדוגמא B5 או כתובת טווח תאים לדוגמא A1:B10) ולרשום את השם הרצוי (בעברית או באנגלית וכדומה). לבסוף יש להקיש Enter.

הערה חשובה - השם חייב להיות ללא רווחים בכלל, אם נרצה לרשום שם המכיל יותר ממילה אחת יש לרשום (קו תחתי כזה _) במקום רווח. לדוגמא: ספק_A

כך זה נראה באקסל:


טווח בעל שם אקסל.png


וכך זה נראה בגוגל שיטס:

טווח בעל שם שיטס.png


בצילומי מסך הנ"ל ספק_A הוגדר כשמו של הטווח A3:B6.

מושג שני - מִשְׁתַּנֶּה (variable):


מושג זה אולי מוכר לכם מענפי מדע שונים כמו בתכנות (מקום בזיכרון המחשב שבו מאוחסן ערך שניתן לשנותו במהלך הריצה) או במתמטיקה (סימן שמייצג ערך כלשהו שיכול להשתנות) או במדעי הנתונים, המחקר והסטטיסטיקה (מאפיין או מדד שנמדד או משתנה בין דגימות) כאשר הצד השווה שבכולם שמדובר על משהו שניתן לשינוי.

"משתנה" הוא מושג שמייצג ערך או מצב שיכול להשתנות, בניגוד לערך "קבוע" או "מוחלט".

ובעולמם של האקסל / שיטס והפונקציות (ובדגש על פונקציית indirect שעליה מוסב מאמר זה) - כאשר אומרים "משתנה" הכוונה היא לערך שמשתנה בהתאם למקום או לתנאים – כלומר, הערך בתא מסוים הוא לא קבוע, אלא יכול להשתנות ולהתעדכן.

אם נחזור שוב לצילום מסך הנ"ל (מתוך הגיליון המצורף בלינק להלן) זהו מבנה הנוסחה בתא A10:

קוד:
=A1

במקרה כאן, הדבר שמשתנה הוא הערך שמאוחסן בתא שאליו אנו מפנים (התא A1).

במקרה כאן, בתא A1 כתוב המספר 1, ולכן הנוסחה שמכילה הפניה ל-A1 תקבל את הערך 1.אם נשנה את התוכן של A1 ל-10, הנוסחה תשתנה אוטומטית ותציג 10 במקום 1.

כלומר, הערך בתא הוא משתנה כי הוא יכול להשתנות ולהשפיע באופן דינמי על כל נוסחה שמפנה אליו.

והנה כלל חשוב ויסודי שחשוב שתשננו אותו שוב ושוב:

כל ערך משתנה אינו מוקף במירכאות כפולות.

וכל ערך קבוע מוקף (כלומר, חובה להקיפו) במירכאות כפולות.

כעת, נבין היטב מדוע אין צורך להקיף את ההפניות לתא בנוסחה שכזו - כי הערך שהוזן בהפניה נחשב "משתנה".

נפלא מאוד…

נתקדם עוד שלב…

יומן מסע - חלק ט:

בכל הקשור לפונקציית indirect וסוגיית הצורך במירכאות כפולות שביארתי לעיל בהרחבה בחלק א & ג - ונכון, הכול ברור ומובן…

אבל אני רוצה להוסיף כאן עוד נדבך של לוגיקה ופילוסופיה המאפיין ומייחד את פונקציית indirect.

אני אזכיר, זהו מבנה הפונקציה בתא A7:

קוד:
=INDIRECT("A1")

וזהו מבנה הפונקציה בתא A9:

קוד:
=INDIRECT(D1)

כלפי הנכתב בארגומנט של פונקציית indirect כל המושג משתנה מתייחס לכתובת עצמה (של "היעד הסופי").

כאשר אנו כותבים בארגומנט הפונקציה (A1) באופן ישיר, הכתובת תא נחשבת משהו קבוע שהוגדר בארגומנט.

כלומר, שאם נרצה "להוזיז" / להפנות לתא אחר (מתא היעד A1) יהיה צורך לבצע שינוי בגוף הפונקציה בלבד.

זו הסיבה שיש צורך להקיף במירכאות כפולות את הנכתב בארגומנט הפונקציה - בכדי "להסביר" לפונקציה שמדובר פה על הפניה לתא שנחשבת "קבועה".

אך כאשר הכתובת לתא אינה קבועה אלא משתנה בהתאם לתוכן של התא D1 (כלומר, שאם נרצה מכל סיבה שהיא שהיעד הסופי יהיה התא A2 במקום A1 אנו נוכל לבצע את השינוי בתא D1 עצמו) אנו לא מקיפים את אותו הטקסט (שהפונקציה מתרגמת אותו כהפניה לתא כזכור בהסבר לעיל…) במירכאות כפולות…

זה הכלל:

כל ערך משתנה - אינו מוקף במירכאות כפולות!

וכל ערך קבוע - מוקף (כלומר, חובה להקיפו) במירכאות כפולות!

יומן מסע - חלק י:

סוף סוף הגענו בס"ד "למנה העיקרית" מכל מטעמי מאמר זה...

ובכן, בתחילתו של חלק ח לעיל הזכרתי (כתשובה לשאלה הזועקת שנכתבה בחלק ז) במילה אחת את יתרונה של פונקציה זו והיא - דינמיות…

לפניכם צילום מסך נוסף מתוך הגיליון המצורף בלינק להלן:

תמונה גיליון נספח.png


בגיליון זה הוגדרו מראש 2 טווחים "בעלי שם".

ספק_A הוא שמו של הטווח A3:B6.

ספק_B הוא שמו של הטווח A12:B15.


וכן, כולכם מכירים כבר את פונקציית vlookup שמוכתרת לא אחת בתואר "מלכת הפונקציות של האקסל"...(במאמר שכתבתי כאן הארכתי אודותיה ועל הלוגיקה שבה.)

אני רק אזכיר שוב את הארגומנט השני שבה - table_array כלומר, הטווח המכיל את הנתונים. כאשר הערך לחיפוש (שהוזן בארגומנט הראשון) חייב להיות בעמודה הראשונה של טווח זה.

אך מה ניתן לעשות כאשר מדובר לא בטווח אחד אלא בשני טווחים שונים ויש צורך "להסביר" לפונקציה באיזה טווח לחפש בכל מקרה לגופו?

שימו לב לעמודה E. בעמודה זו בכל פעם נכתב שמו של ספק אחר - A או B.

המתכונת של פונקציית vlookup קלאסית לא תעזור לנו בכלל במקרה כאן.

תחשבו קצת על מורכבותה של שאלה זו לפני שתקראו תיכף את הפתרונות לכך…

זו שאלה מעניינת ומאתגרת…

מה הפתרון לכך?

פתרון 1:

זהו מבנה הפונקציות בתא F2:

קוד:
=VLOOKUP(D2,IF(E2="A",ספק_A,ספק_B),2,0)

אנו "אומרים" לפונקציית vlookup בארגומנט הראשון תסתכלי על הערך שכתוב בתא D2 (דהיינו מק"ט 1).

ואז…תחפשי אותו באחד משני הטווחים בעלי שם. ואנו מוסיפים את פונקציית if "שתעזור ותסייע" לפונקציית vlookup להבין באיזה טווח לחפש בדיוק.

כאשר, פונקציית if מחזירה את טווח ששמו ספק_A במידה והתקיים התנאי דהיינו שבתא E2 הוזן הטקסט "A". ואת טווח ששמו ספק_B במידה ולא התקיים התנאי.

(שימו לב, שבמקרה כאן הטווחים בעלי שם אינם מוקפים במרכאות כפולות מהסיבה הפשוטה שהסברתי לעיל והיא - שטווח בעל שם נחשב במהותו "משתנה" כיוון שניתן לשנות אותו בכל עת מטווח x לטווח y)

במקרה שלנו התקיים התנאי שהרי בתא E2 כתוב הטקסט - A.

ואנו ממשיכים בארגומנט השלישי ומגדירים לפונקציה להחזיר את הערך (מותאם לשורה) בעמודה השניה בטווח כלומר עמודת המחיר = עמודה B.

כמו כן אנו "מבקשים" שתהיה כאן התאמה מדויקת ולא משוערת.(עיין במאמר בלינק הנ"ל שהסברתי על כך באריכות רבה).

נו, מה אתם אומרים…

פתרון יפה/פנטסטי…נכון?

אבל רגע רגע…אולי ננסה "לקצר מעט" את הנוסחה "הארוכה הזו" לנוסחה קצרה במעט ומבלי "להזדקק" לעזרתה של פונקציית if.

איך? אתם שואלים…הנה, כמו מבנה הפונקציה בתא F7:

קוד:
=VLOOKUP(D7,"ספק_"&E7,2,0)

כיוון ששמם של שני הטווחים בעלי שם זהים בתחילתם (כלומר ספק_) ושונים רק בסיומם A או B. לכאורה היה ניתן לכתוב בארגומנט השני "ספק_" (לאחר כל ההסברים לעיל שימו לב שטקסט זה חייב להיות מוקף במירכאות כפולות כי נכון לשלב זה זהו טקסט "יבש" ואינו מותאם לשום טווח בעל שם. כלומר אין כאן "דין" של הפניה לטווח כדינו של "משתנה" אלא "דין" של "קבוע") ולאחר מכן לבצע חיבור בעזרת אמפרסנד (כזה & שמהותו הוא להיות מעין "דבק" וחיבור בין טקסטים) ולחבר את הנכתב בתא E7 (גם כאן, שימו לב שהתא E7 אינו מוקף במרכאות כיוון שמדובר כאן - כלומר אם נתייחס לערך E7 שלעצמו משהו משתנה שהרי מדובר פה בהפניה לתא "קלאסית…) לתחילתה של המחרוזת.

במקרה כאן פלט המחרוזת בסיומו של "כל תהליך זה" הוא - ספק_A.

אבל הופ!

במבחן המציאות מוחזרת שגיאה (באקסל value ובשיטס ref)...

זה סימן שמשהו כאן לא תקין!


מה באמת קורה פה ומה מקור התקלה?

שאלה מצוינת…

הנה ההסבר הלוגי לכך:

פונקציית vlookup "מצליחה להבין" ולפענח שמדובר על טווח בעל שם שנקרא ספק_A בתנאי אחד ויחיד ששמו של הטווח נכתב ברציפות כיחידה אחת אך לא שמדובר במחרוזת שנוצרה כשרשור שניתן לכנותו "כלאיים".

בספרות חז"ל להבדיל ישנו ביטוי ומונח "בתר רישא אזיל גופא" (עיין במסכת עירובין דף מ"א עמוד ב').

"הרישא" של שם הטווח בעל שם נכתב כטקסט בעלמא דהיינו ספק_ שזה עדיין לא אומר לנו ולפונקציית vlookup שום דבר.

ניסינו להתחכם ולחבר לטקסט היבש הזה עוד "הפניה לתא"...

ניסינו…אכן, אך ללא הצלחה…

כי בשורה תחתונה, דינו של שרשור זה נשאר כתחילתו דהיינו טקסט בעלמא!

אין כאן הפנייה אמיתית ותקנית לטווח בעל שם כל שהוא!

"מאחורי הקלעים" אולי הפונקציה "מנחשת" מה המסר שאנו מעוניינים לומר לה…אבל מה לעשות, לפונקציית vlookup "אין כלים פרקטים" לבצע משימה כזו.


היא פשוט לא יודעת לתרגם ולהמיר את הטקסט הקבוע להפנייה לטווח בעל שם!

פתרון 2:


אתם יודעים מי כן מסוגלת לתרגם ולהמיר טקסט להפניה לתא / טווח בעל שם?

נכון מאוד! פונקציית indirect הנפלאה והגאונית!

תראו את מבנה הפונקציות בתא F12:

קוד:
=VLOOKUP(D12,INDIRECT("ספק_"&E12),2,0)

המתכונת בארגומנט השני של פונקציית vlookup לא השתנה מאומה…מה שנוסף כאן הוא עטיפת כל הטוב הזה בפונקציית indirect.

פונקציית indirect יודעת להמיר את שרשור הטקסט שנראה ככה ספק_A ולתרגם אותו כהפנייה לתא כלומר לטווח בעל שם…

וואו…פשוט וואו!

אם אחזור למילת הקסם - "דינמיות" אז בדיוק לזה התכוונתי…

כחלק מהדינמיקה של הפונקציה הוא כוחה הרב "לקצר תהליכים" ולקצר באופן משמעותי את הרכבן של הפונקציות…

בדיוק כמו במקרה המתואר לעיל.
(ובעזרת ה' במאמרים הבאים תראו דוגמאות נוספות שמעניינות לא פחות וכל כך פרקטיות…)

ועד כאן ליומן המסע אל נבכי פונקציית indirect…

מקווה שנהניתם…



לסיום. למדנו לעיל (בחלק ג) אודות המאפיין המרכזי והייחודי של פונקציית indirect בכך שהיא "יודעת" לתרגם את הטקסט היבש כהפניה לתא.

בדוגמה שציינתי לעיל - כשהערך בתא D1 הוא מחרוזת טקסט המייצגת כתובת תא (למשל A1), הפונקציה משתמשת בתוכן של תא D1 בתור הפניה לתא המטרה.
הפונקציה "מבינה" כי הערך בתא D1 הוא לא המטרה עצמה אלא ה"מפנה" (טקסט המייצג הפניה לכתובת).

ולהבדיל בין קודש לחול…זה מזכיר את הסברו של רבי אלחנן וסרמן זצ"ל הי"ד בספרו "קובץ מאמרים ואגרות" (עמודים שא - שב) על דברי רבותינו ז"ל בנבואתם על דור עקבתא דמשיחא.

חז"ל הקדושים במסכת סוטה (דף מ"ט עמוד ב') אמרו וניבאו על דור זה "פְּנֵי הַדּוֹר כִּפְנֵי הַכֶּלֶב".

ופירוש נבואה זו נתבאר בדברי המפרשים זה בכה וזה בכה.

ורבי אלחנן וסרמן פירש (בשם מרן החפץ חיים זצ"ל בשם הגאון רבי יצחק מוולוז'ין בן בעל נפש החיים זצ"ל) וזהו לשונו הזך:

מטבעו של הכלב, אם יסקלו אותו באבן, מיד הוא מתנפל על האבן לנשכה. בשעה שהמן קם על ישראל יש לדעת, כי המן זה אינו אלא מקל השלוח מן השמים לחבטנו בו.

הוֹי אַשּׁוּר שֵׁבֶט אַפִּי (ישעיה י'.ה').

אין שום טעם להלחם עם המקל, כי כלום חסרים מקלות בשמים. "הרבה שלוחים למקום". יש לנקוט באמצעים שימנעו את העמים מלהקים "מקלות" עלינו.

בימי עקבתא דמשיחא תהיה הדעת נעדרת, וככלב שוטה ינשכו את המקל וכו'. המנהיגים רואים רק את המקל ומסרבים להכיר את המכה במקל.

"וְהָעָם לֹא שָׁב עַד הַמַּכֵּהוּ וְאֶת יי צְבָאוֹת לֹא דָרָשׁוּ"
(שם ט'.י"ב)


עד כאן לשונו ז"ל.

באנלוגיה לעולמה של פונקציית indirect "המקל" הוא כאותו טקסט שנכתב בתא D3. הפונקציה מבינה ויודעת שטקסט זה הוא לא היעד אלא מייצג הפניה בלבד לתא היעד (לתא A1).

חז"ל באו ללמד את כל אחד ואחד בדור עקבתא דמשיחא שהמקל הוא לא היעד אלא "הפנייה" עבורינו להתעורר בתשובה לפני הקב"ה ששלח את המכה והוא "היעד" האמיתי. וממילא לא יהיה צורך בשום הכאה במקל כזה או אחר…

"נַחְפְּשָׂה דְרָכֵינוּ וְנַחְקֹרָה וְנָשׁוּבָה עַד ה'"(איכה ג.מ)

לינק לגיליון שיטס אודות פונקציית indirect - מצורף כאן.