סיווג אוטומטי של הוצאות אשראי: בואו נבנה מאקרו שעושה את זה במקומנו 🙂

וידוי קטן לפתיחה: במשך שנתיים סיווגתי את ההוצאות של הבית ידנית. שורה-שורה, בסוף כל חודש. שופרסל זה מזון, פז זה דלק, PAYPAL *SPOTIFY זה מנויים, ורק ב-WOLT הייתי עוצר לשנייה להתלבט אם זה “מסעדות” או “משלוחים”.

בערך עשרים דקות בחודש. לא נורא, אבל משעמם עד דמעות.

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

אז בואו ניתן לו מישהו שכן מכיר.

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

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


התהליך שלך היום, ללא אוטומציה 7 שלבים ~45 דקות בכל פעם 🤯
אלו 12 שעות בשנה שחוזרות אליך
7📤שולח, ומקווה שלא פספסתי
6מחכה שמישהו יאשר
5📊בונה את הדוח מחדש
4#N/A — שוב טעות בנוסחה
3מתקן את מה שנשבר בהעתקה
2📋מעתיק ידנית לאקסל
1📥מוריד את הקובץ מהמייל
← גרור שמאלה 🤖 הפעל ✓
רמת אוטומציה 🤖 ידני לגמרי

7 שלבים הפכו לאחד. יש לך תהליך כזה?

השאירו טלפון — נדבר על זה. הפגישה הראשונה בחינם.

צריך משהו באקסל?
נחזור אליך היום. ✨

הקבצים המלווים את המדריך הזה

להורדת הקובץ - סיווג הוצאות עם Gemini

להורדת הקובץ - קוד VBA לקריאה ל-Geminiאחרי הפתיחה יש ללחוץ מקש ימני ולשמור את הקובץ

קודם כל, לאן אנחנו הולכים

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

תאריךתיאור בית העסקסכוםקטגוריה
01/09/2026שופרסל דיל רמת גן342.50 ₪
02/09/2026PAYPAL *SPOTIFY21.90 ₪
03/09/2026פז יבנה280.00 ₪
05/09/2026סופר-פארם דיזנגוף סנטר89.90 ₪
07/09/2026WOLT118.00 ₪
08/09/2026חברת החשמל לישראל612.40 ₪
10/09/2026ZARA עזריאלי ת"א259.00 ₪
12/09/2026רב-קו אונליין50.00 ₪
14/09/2026איקאה ראשון לציון1,149.00 ₪
15/09/2026העברה ב-BIT200.00 ₪

ועכשיו נריץ את המאקרו ונלך להביא כוס קפה. עשר שורות לוקחות בערך 20 עד 30 שניות:

תיאור בית העסקקטגוריה
שופרסל דיל רמת גןמזון וסופרמרקט
PAYPAL *SPOTIFYמנויים ובידור
פז יבנהדלק ותחבורה
סופר-פארם דיזנגוף סנטרבריאות ופארם
WOLTמסעדות ומשלוחים
חברת החשמל לישראלחשבונות ותקשורת
ZARA עזריאלי ת"אביגוד והנעלה
רב-קו אונלייןדלק ותחבורה
איקאה ראשון לציוןבית וריהוט
העברה ב-BITאחר

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

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


מה צריך שיהיה לנו ביד

  1. Excel ל-Windows. המודול נשען על רכיבים שקיימים רק בגרסת Windows, אז ב-Mac וב-Excel Online זה פשוט לא ירוץ. מצטער, באמת ניסיתי.
  2. חשבון Google. חשבון Gmail רגיל לגמרי מספיק, אנחנו צריכים אותו רק כדי להנפיק מפתח API.
  3. שני קבצים שמצורפים לפוסט: expenses-example.xlsx, שהוא קובץ הדוגמה עם 10 שורות הוצאות וגיליון קטגוריות, ו-modGemini.bas, שהוא מודול ה-VBA עצמו.

שלב 1: מנפיקים מפתח API של Gemini (בחינם)

מפתח API הוא בסך הכול סיסמה ארוכה שמזהה אותנו מול השירות של גוגל. כל פנייה שאקסל ישלח ל-Gemini תיקח איתה את המפתח הזה, אחרת גוגל לא יודעת מי מדבר איתה.

  1. נכנסים ל-Google AI Studio: https://aistudio.google.com
  2. מתחברים עם חשבון Google.
  3. לוחצים על Get API key. הכפתור נמצא בתפריט הצד או בראש המסך, גוגל מזיזה אותו מדי פעם.
  4. לוחצים על Create API key. אם נתבקש לבחור פרויקט, אפשר בשקט לתת לגוגל ליצור פרויקט חדש.
  5. יופיע מפתח ארוך, בדרך כלל כזה שמתחיל ב-AIza. לוחצים Copy.

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

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

שלושה דברים שכדאי לדעת על המסלול החינמי

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

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

המפתח הוא שלנו בלבד. לא שולחים אותו לאף אחד ולא מפרסמים אותו בפורום. אם הוא דלף, נכנסים ל-AI Studio, מוחקים אותו ומנפיקים חדש. לוקח חצי דקה.


האקסל הפך לבלגן? הגיע הזמן לסדר.

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

✨ בואו נהפוך את הבלגן לאפליקציה

שלב 2: מוציאים את לשונית “מפתחים” מהמחבוא

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

  1. קובץ > אפשרויות (File > Options).
  2. בוחרים התאמה אישית של רצועת הכלים (Customize Ribbon).
  3. ברשימה בצד, מסמנים מפתחים (Developer).
  4. אישור.

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

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

3א. ההגדרה הכללית

  1. קובץ > אפשרויות > מרכז האמון (בחלק מהגרסאות בעברית זה מופיע כ"מרכז יחסי אמון", ובאנגלית Trust Center).
  2. לוחצים הגדרות מרכז האמון (Trust Center Settings).
  3. בוחרים הגדרות מאקרו (Macro Settings).
  4. מוודאים שמסומן “השבת מאקרו VBA עם הודעה” (Disable VBA macros with notification). זו ברירת המחדל, אז סביר שלא נצטרך לגעת בכלום.

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

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

3ב. הפס האדום: קבצים שהורדנו מהאינטרנט

עכשיו לחלק שמבלבל. מאז 2022 מיקרוסופט חוסמת לחלוטין מאקרו בקבצים שהורדו מהאינטרנט או הגיעו במייל. במקרה כזה לא נראה פס צהוב עם כפתור, אלא פס אדום עם ההודעה “Microsoft has blocked macros from running because the source of this file is untrusted”, ואין שם שום כפתור ללחוץ עליו. כלום.

מה שקרה זה ש-Windows סימן את הקובץ כמשהו שהגיע מבחוץ. הסימון הזה נקרא Mark of the Web. כדי להסיר אותו מקובץ שאנחנו סומכים עליו:

  1. סוגרים את הקובץ באקסל. זה חשוב, אחרת השינוי לא ייתפס.
  2. בסייר הקבצים, לחיצה ימנית על הקובץ > מאפיינים (Properties).
  3. בלשונית כללי (General), ממש בתחתית, מסמנים בטל חסימה (Unblock).
  4. אישור, ופותחים מחדש.

ההמלצה שלי: תעשו את זה ל-expenses-example.xlsx כבר עכשיו, עוד לפני שפותחים אותו בפעם הראשונה. יחסוך לכם את ההפתעה. ואם בהמשך, אחרי שנשמור כקובץ מאקרו, יצוץ פס אדום גם שם, פשוט חוזרים על אותו תהליך לקובץ ה-xlsm.

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


שלב 4: שומרים את קובץ הדוגמה כקובץ מאקרו

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

  1. פותחים את expenses-example.xlsx. אם הוא נפתח ב"תצוגה מוגנת", לוחצים הפוך עריכה לזמינה (Enable Editing).
  2. קובץ > שמירה בשם (Save As).
  3. בשדה סוג הקובץ, בוחרים חוברת עבודה של Excel עם מאקרו מופעל (*.xlsm).
  4. שומרים. מכאן והלאה אנחנו עובדים רק על קובץ ה-xlsm.

מה בעצם יש בקובץ הדוגמה

בואו ניקח דקה להכיר אותו, כי זה יעזור לנו להבין את הקוד אחר כך.

גיליון “הוצאות”: עמודה A היא התאריך. עמודה B היא תיאור בית העסק, בדיוק כמו שהוא מופיע בדוח האשראי, וזה מה שאנחנו שולחים ל-Gemini. עמודה C היא הסכום, וגם הוא נשלח, כי לפעמים הסכום עוזר להכריע (בית קפה ב-18 ₪ וטיסה ב-1,800 ₪ הם לא אותו סיפור). עמודה D היא הקטגוריה, והיא ריקה, כי המאקרו הוא זה שימלא אותה.

גיליון “קטגוריות”: בעמודה A, בתאים A2:A20, יושבת רשימת הקטגוריות המותרות. שימו לב לפרט אחד חשוב: לטווח הזה יש שם טווח בשם Categories. המאקרו מחפש את הרשימה לפי השם הזה ולא לפי מיקום, כך שאפשר לשנות שמות גיליונות, להזיז דברים, והוא עדיין ימצא אותה. בעמודה B יש סה"כ לכל קטגוריה בנוסחת SUMIF פשוטה.

רוצים לראות את שם הטווח במו עיניכם? נוסחאות > מנהל השמות (Formulas > Name Manager).


צריך משהו באקסל?
נחזור אליך תוך 3 שעות.

שלב 5: מייבאים את מודול ה-VBA

  1. בקובץ ה-xlsm הפתוח, לוחצים Alt+F11. נפתח עורך ה-VBA.
  2. בצד שמאל יש חלונית Project. אם היא לא מוצגת, Ctrl+R יביא אותה.
  3. לוחצים על השורה VBAProject (expenses-example.xlsm). אל תדלגו על זה. אם יש לכם עוד קבצי אקסל פתוחים, המודול עלול להיכנס לקובץ הלא נכון, וזה מבלבל רצח.
  4. בתפריט העליון: File > Import File… (או פשוט Ctrl+M).
  5. בוחרים את modGemini.bas ולוחצים Open.
  6. עכשיו תחת VBAProject (expenses-example.xlsm) הופיעה תיקייה Modules, ובתוכה מודול בשם modGemini. לחיצה כפולה עליו תפתח את הקוד.
  7. שומרים: Ctrl+S.
  8. חוזרים לאקסל, שוב עם Alt+F11.

וזהו, סיימנו. לא צריך להוסיף References ולא להתקין שום דבר.

“למה הקוד כתוב באנגלית?” שאלה שנשאלתי המון. עורך ה-VBA לא תומך ביוניקוד, ולכן טקסט בעברית בתוך הקוד נראה כמו ג’יבריש גמור אצל כל מי שהגדרות האזור שלו ב-Windows אינן עבריות. כדי שהמודול יעבוד אצל כולם, גם אצל מי שעובד על מחשב באנגלית, הקוד וההערות וההודעות באנגלית. הנתונים עצמם בגיליון, כלומר התיאורים והקטגוריות בעברית, נקראים ונכתבים מצוין, כי אקסל עצמו כן תומך ביוניקוד.


שלב 6: מריצים

הרגע שחיכינו לו.

  1. עוברים לגיליון הוצאות. המאקרו עובד על הגיליון הפעיל, אז חשוב שנעמוד עליו.
  2. Alt+F8 (או מפתחים > פקודות מאקרו).
  3. בוחרים ClassifyExpenses ולוחצים הפעל.
  4. בהרצה הראשונה ייפתח חלון שמבקש את מפתח ה-API. מדביקים את המפתח משלב 1, OK. הוא נשמר במחשב ולא נתבקש שוב.
  5. בשורת המצב למטה נראה את ההתקדמות: Classifying row 3 of 11....
  6. בסוף תופיע הודעת סיכום: כמה שורות סווגו, כמה דולגו וכמה סומנו בצהוב.

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

רוצים להריץ את הדוגמה שוב מההתחלה? יש מאקרו בשם ClearCategories שמנקה את עמודה D בגיליון הפעיל. מריצים אותו, ואז שוב את ClassifyExpenses.

טיפ קטן שמשפר את החיים: במקום Alt+F8 בכל פעם, נוסיף כפתור. הוספה > צורות, מציירים מלבן, לחיצה ימנית עליו > הקצה מאקרו > ClassifyExpenses. עכשיו זו לחיצה אחת.


עכשיו בואו נבין מה בעצם קרה שם

צריך משהו באקסל?
נחזור אליך תוך 3 שעות.

המודול modGemini בנוי משני חלקים נפרדים לגמרי, וההפרדה הזו היא לא במקרה:

  1. פונקציה כללית בשם GetGeminiAnswer. היא מקבלת טקסט, שולחת אותו ל-Gemini, ומחזירה את התשובה לתוך הקוד שלנו. היא לא יודעת כלום על הוצאות, על קטגוריות או על דוחות אשראי. היא סתם צינור.
  2. מאקרו לדוגמה בשם ClassifyExpenses, שמשתמש בפונקציה הזו כדי לסווג הוצאות.

אם תשאלו אותי מה החלק השווה כאן, זה דווקא הראשון. את GetGeminiAnswer אפשר לקחת לכל מאקרו אחר שתכתבו בחיים. סיווג ההוצאות הוא רק התירוץ.

חלק 1: הפונקציה GetGeminiAnswer

ככה קוראים לה:

answer = GetGeminiAnswer(prompt, systemPrompt, temperature)
פרמטרחובה?מה זה
promptכןהטקסט שאנחנו שולחים, השאלה או הנתונים.
systemPromptלאהוראות קבועות למודל: מה התפקיד שלו ואיך לענות.
temperatureלא (ברירת מחדל 0)כמה “יצירתי” המודל. 0 זה הכי עקבי וצפוי, בדיוק מה שרוצים בסיווג. ערכים גבוהים יותר, נגיד 0.7, מתאימים לכתיבת טקסט חופשי.

ומה היא מחזירה? בהצלחה, את טקסט התשובה. בכישלון, מחרוזת ריקה (""), והסיבה האמיתית מחכה לנו במשתנה GeminiLastError.

הנה השימוש הכי פשוט שאפשר, רק כדי לראות שזה עובד:

Sub SimpleExample()
    Dim answer As String
    answer = GetGeminiAnswer("What is the capital of France?")
    If answer = "" Then
        MsgBox "Error: " & GeminiLastError
    Else
        Range("A1").Value = answer
    End If
End Sub

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

מנגנון הניסיונות החוזרים, ולמה הוא הכרחי

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

אז במקום זה היא מחכה ומנסה שוב, עד 10 פעמים, וזמן ההמתנה גדל בכל ניסיון:

ניסיון חוזרהמתנה לפניו
12 שניות
24 שניות
38 שניות
416 שניות
5 עד 1030 שניות כל אחד

בסך הכול, במקרה הכי גרוע, היא תילחם על הקריאה הזו במשך כ-3.5 דקות לפני שתרים ידיים. ואם Gemini עצמו טורח לומר כמה זמן לחכות, מה שהוא עושה לפעמים כשעוברים את המכסה, הפונקציה מכבדת את זה ומחכה בדיוק כמה שביקשו. בינתיים שורת המצב מספרת לנו מה קורה, בסגנון Gemini: rate limit (HTTP 429) - retry 2 of 10 in 4 seconds..., כדי שלא נחשוב שאקסל נתקע.

אבל לא על כל שגיאה שווה לנסות שוב. הנה החלוקה:

שגיאהניסיון חוזר?למה
תקלת רשת / timeoutכןזמני
429, חריגה ממגבלת קצבכןאחרי המתנה המכסה מתפנה
500 עד 599, תקלת שרתכןזמני
400, בקשה שגויה או מפתח לא תקיןלאניסיון נוסף ייכשל בדיוק באותה צורה
403, אין הרשאהלאכנ"ל
404, שם מודל שגוילאכנ"ל

ההיגיון פשוט: אם המפתח שגוי, הוא יישאר שגוי גם בעוד 30 שניות. אין טעם לבזבז את הזמן שלנו.

רוצים לשנות את מספר הניסיונות או את זמני ההמתנה? הכול יושב בראש המודול:

Private Const MAX_RETRIES As Long = 10
Private Const FIRST_RETRY_WAIT_SEC As Long = 2
Private Const MAX_RETRY_WAIT_SEC As Long = 30
צריך משהו באקסל?
נחזור אליך תוך 3 שעות.

איפה נשמר המפתח, ולמה זה משנה

המפתח לא נשמר בתוך קובץ האקסל. הוא נשמר ברישום (Registry) של Windows, תחת המשתמש שלנו בלבד.

למה זה חשוב? כי זה אומר שאפשר לשלוח את קובץ ה-xlsm לקולגה, והמפתח שלנו לא נוסע איתו. הוא יתבקש להזין מפתח משלו. אם המפתח היה נשמר בתוך הקובץ, היינו מחלקים את הסיסמה שלנו לכל מי שמקבל את הקובץ.

שני מאקרו לניהול המפתח: SetGeminiKey להזנה או החלפה, ו-DeleteGeminiKey למחיקה מהמחשב.

חלק 2: המאקרו ClassifyExpenses, צעד אחרי צעד

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

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

Set catCells = ws.Parent.Names(CATEGORIES_RANGE_NAME).RefersToRange
...
For Each c In catCells.Cells
    catName = Trim$(CStr(c.Value))
    If catName <> "" Then
        validCategories.Add catName, True
        catList = catList & "- " & catName & vbLf
    End If
Next c

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

צעד 2, ההוראות הקבועות למודל. אלה ההוראות שנשלחות בכל קריאה, ה-System Prompt:

systemPrompt = "You classify credit card and bank transactions. " & _
    "The description is usually in Hebrew and is the merchant name as it appears on the statement. " & _
    "Choose exactly ONE category from the list the user gives you. " & _
    "Reply with the category name only, copied exactly as written in the list - " & _
    "no explanation, no quotes, no punctuation. " & _
    "If no category fits, or you are not sure, reply with the LAST category in the list."

בתרגום חופשי: “אתה מסווג עסקאות אשראי ובנק. התיאור בדרך כלל בעברית. בחר קטגוריה אחת בדיוק מהרשימה, והחזר רק את שמה, בדיוק כפי שהוא כתוב, בלי הסברים. אם אף קטגוריה לא מתאימה או שאינך בטוח, החזר את הקטגוריה האחרונה ברשימה.”

ככה התהליך שלך יכול להיראות — בלחיצה אחת ככה התהליך שלך נראה היום?
😌 בוצע ✓ הכול רץ לבד. שקט.
זמן שחוזר אליך: 0 שעות בחודש
רמת אוטומציה 🤖 ידני לגמרי
גררו לגלות ‹ ›

יש לך תהליך כזה שגוזל זמן? אפשר לעשות אותו חכם יותר.

השאירו טלפון — נדבר על זה. הפגישה הראשונה בחינם.

צריך משהו באקסל?
נחזור אליך היום. ✨

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

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

צעד 3, רצים על השורות. לכל שורה:

For r = FIRST_DATA_ROW To lastRow
    description = Trim$(CStr(ws.Cells(r, COL_DESCRIPTION).Value))

    If description = "" Then
        ' empty row - nothing to do
    ElseIf Trim$(CStr(ws.Cells(r, COL_CATEGORY).Value)) <> "" Then
        skippedCount = skippedCount + 1     ' already classified
    Else
        prompt = "Categories:" & vbLf & catList & vbLf & _
                 "Transaction description: " & description & vbLf & _
                 "Amount: " & ws.Cells(r, COL_AMOUNT).Text

        answer = GetGeminiAnswer(prompt, systemPrompt, 0)
        ...

שלושה דברים קטנים כאן ששווים תשומת לב:

  • שורה שכבר יש בה קטגוריה מדולגת. זו לא סתם אופטימיזציה. המשמעות היא שאם המאקרו נעצר באמצע, כי נגמרה המכסה או כי נפל האינטרנט, פשוט מריצים אותו שוב והוא ממשיך מאיפה שהפסיק. בונוס: אם תיקנו ידנית קטגוריה שהמודל טעה בה, הוא לא ידרוס לכם את התיקון.
  • temperature = 0, כדי שאותו תיאור יקבל כמעט תמיד את אותה קטגוריה. בסיווג אנחנו רוצים משעמם ועקבי, לא מקורי.
  • .Text ולא .Value בסכום. ככה נשלח הסכום כמו שהוא מוצג בתא, עם ₪ ופסיקים, וזה פשוט קריא יותר למודל מאשר מספר עשרוני יבש.

וככה נראה בפועל הפרומפט שנשלח עבור השורה הראשונה:

Categories:
- מזון וסופרמרקט
- מסעדות ומשלוחים
- דלק ותחבורה
- חשבונות ותקשורת
- בריאות ופארם
- ביגוד והנעלה
- מנויים ובידור
- בית וריהוט
- אחר

Transaction description: שופרסל דיל רמת גן
Amount: 342.50 ₪

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

צעד 4, מה עושים כשנכשלנו. אם GetGeminiAnswer החזירה מחרוזת ריקה, כלומר גם אחרי 10 ניסיונות לא הלך, אין טעם להמשיך לשורה הבאה. המאקרו עוצר ומראה לנו למה:

If answer = "" Then
    MsgBox "Stopped at row " & r & "." & vbLf & vbLf & GeminiLastError & ...
    Exit Sub
End If

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

צעד 5, מנקים ובודקים את התשובה. מודלים אוהבים לפעמים להוסיף נקודה בסוף, או מרכאות, או כוכביות משום מקום. הפונקציה CleanAnswer מורידה את כל זה. ואז מגיעה הבדיקה שאני הכי אוהב במאקרו הזה:

If validCategories.Exists(answer) Then
    .Interior.Pattern = xlNone
Else
    .Interior.Color = RGB(255, 235, 156)   ' yellow = check manually
End If

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

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


התהליך שלך היום, ללא אוטומציה 7 שלבים ~45 דקות בכל פעם 🤯
אלו 12 שעות בשנה שחוזרות אליך
7📤שולח, ומקווה שלא פספסתי
6מחכה שמישהו יאשר
5📊בונה את הדוח מחדש
4#N/A — שוב טעות בנוסחה
3מתקן את מה שנשבר בהעתקה
2📋מעתיק ידנית לאקסל
1📥מוריד את הקובץ מהמייל
← גרור שמאלה 🤖 הפעל ✓
רמת אוטומציה 🤖 ידני לגמרי

7 שלבים הפכו לאחד. יש לך תהליך כזה?

השאירו טלפון — נדבר על זה. הפגישה הראשונה בחינם.

צריך משהו באקסל?
נחזור אליך היום. ✨

עכשיו נתאים את זה לדוח האשראי שלכם

קובץ הדוגמה זה נחמד, אבל הדוח שאתם מורידים מהבנק נראה אחרת. בואו נסדר את זה.

כשהעמודות במקום אחר

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

Private Const FIRST_DATA_ROW As Long = 2      ' row 1 = headers
Private Const COL_DESCRIPTION As Long = 2     ' column B - merchant / description
Private Const COL_AMOUNT As Long = 3          ' column C - amount
Private Const COL_CATEGORY As Long = 4        ' column D - category (filled by the macro)

המספרים הם פשוט מספרי העמודות: A=1, B=2, C=3 וכן הלאה. נניח שבקובץ שהורדתם מהבנק התיאור יושב בעמודה C, הסכום בעמודה E, והכותרות תופסות חמש שורות. אז נשנה ל:

Private Const FIRST_DATA_ROW As Long = 6
Private Const COL_DESCRIPTION As Long = 3
Private Const COL_AMOUNT As Long = 5
Private Const COL_CATEGORY As Long = 8        ' any empty column

זהו. ארבע שורות, ואנחנו מסודרים.

קטגוריות משלכם

כאן לא צריך לגעת בקוד בכלל. פשוט עורכים את הרשימה בגיליון “קטגוריות”, בתאים A2 עד A20. שני כללים בלבד:

“אחר” (או “שונות”, או איך שתקראו לזה) חייבת להיות אחרונה. הסברתי למה בצעד 2.

שמות ברורים עובדים הרבה יותר טוב. “רכב, דלק וחניה” אומר למודל משהו. “רכב1” לא אומר כלום, ואז הוא מנחש.

כדי שהמאקרו יהיה זמין בכל הקבצים שלכם

במקום לייבא את המודול לקובץ הדוגמה (שלב 5), ייבאו אותו ל-PERSONAL.XLSB, חוברת המאקרו האישית, אם יש לכם כזו. ככה המאקרו יהיה זמין בכל קובץ שתפתחו. רק שימו לב ששם הטווח Categories עדיין צריך להיות מוגדר בקובץ ההוצאות עצמו.

האקסל הפך לבלגן? הגיע הזמן לסדר.

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

✨ בואו נהפוך את הבלגן לאפליקציה

להחליף מודל

שם המודל מוגדר בשורה אחת:

Private Const GEMINI_MODEL As String = "gemini-2.5-flash"

גוגל מוסיפה מודלים חדשים ומוציאה ישנים משימוש בקצב מרשים. אם יום אחד תקבלו שגיאה 404 שאומרת שהמודל לא נמצא, אל תיבהלו. נכנסים ל-AI Studio, בודקים איזה מודל Flash זמין כרגע במסלול החינמי, ומעתיקים את השם המדויק לכאן.


המגבלות, בלי לייפות

הייתי מרגיש לא בנוח לסיים בלי החלק הזה.

זה לא מדויק ב-100%. ברוב המקרים המודל יקלע, אבל תיאורים עמומים כמו “העברה ב-BIT”, או “PAYPAL” בלי פירוט, או שם של עסק קטן ומקומי שהמודל פשוט לא מכיר, יסווגו לפעמים לא כמו שהייתם רוצים. תעברו על התוצאות, במיוחד על התאים הצהובים ועל כל מה שנחת על “אחר”.

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

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

Windows בלבד. אמרתי את זה בהתחלה, אני אומר שוב.

פרטיות. כמו שהסברתי בשלב 1, במסלול החינמי הנתונים עשויים לשמש את גוגל. אם זה לא מתאים לכם, הפעלת חיוב (Billing) בחשבון ב-Google AI Studio מעבירה למסלול בתשלום, ושם גוגל מתחייבת לא להשתמש בנתונים. בהיקפים של סיווג הוצאות ביתיות, העלות היא גרושים.


כשמשהו לא עובד

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

מה רואיםמה הסיבהמה עושים
פס אדום: “Microsoft has blocked macros…”הקובץ מסומן כקובץ מהאינטרנטסוגרים את הקובץ, לחיצה ימנית > מאפיינים > בטל חסימה (שלב 3ב)
פס צהוב “הפוך תוכן לזמין”הכול תקין, זו ההתנהגות הרגילהלוחצים על הכפתור
המאקרו לא מופיע ב-Alt+F8המודול לא יובא, או שהקובץ נשמר כ-xlsxמוודאים שהקובץ xlsm ושהמודול modGemini מופיע בעורך ה-VBA (שלבים 4 ו-5)
No API key. Run the macro SetGeminiKey...לחצתם Cancel בחלון המפתחמריצים את המאקרו SetGeminiKey
HTTP 400: API key not validהמפתח שגוי או שהועתק חלקיתמריצים SetGeminiKey ומדביקים שוב את המפתח המלא
HTTP 404: models/... is not foundשם המודל אינו זמין יותרמעדכנים את GEMINI_MODEL (ראו “להחליף מודל”)
HTTP 403אין הרשאה, לרוב מפתח שבוטל או פרויקט חסוםמנפיקים מפתח חדש ב-AI Studio
Failed after 10 retries. Last error: rate limit...נגמרה המכסה היומיתמנסים שוב מחר, המאקרו ימשיך מאיפה שעצר
network error: ...אין חיבור לאינטרנט, או חסימה של רשת ארגונית (Proxy/Firewall)בודקים חיבור. ברשת ארגונית, נסו מהבית או דברו עם ה-IT
The named range 'Categories' was not foundאין שם טווח כזה בקובץנוסחאות > מנהל השמות > חדש, בשם Categories, שמפנה לרשימת הקטגוריות
You are on the categories sheetהרצתם את המאקרו מגיליון הקטגוריותעוברים לגיליון ההוצאות ומריצים שוב
הרבה תאים צהוביםהמודל מחזיר שמות שלא תואמים בדיוק לרשימהבודקים שאין רווחים מיותרים או תווים מיוחדים בשמות הקטגוריות

מה באמת בנינו כאן

שני דברים, ואני חושב שהשני חשוב יותר.

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

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

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

אם תבנו משהו מעניין עם זה, אשמח לשמוע. באמת.

צריך משהו באקסל?
נחזור אליך תוך 3 שעות.