התקשרו אלינו: 052-2928949

התקשרו אלינו: 052-2928949

טופס לקליטת קבצים ב VBA

VBA Tip

טופס לקליטת קבצים ב VBA

VBA Tip

טופס לקליטת קבצים ב VBA

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

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

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

ואיך אני עושה את זה?

ראשית, אתן לתא שבו ארצה לקבל את הנתיב (התא הכחול) שם.
בחרתי לתת לו את השם FlPth, משום שהוא מיועד לשמירת הנתיב.
עכשיו ניצור מאקרו אירוע שיופעל בלחיצה כפולה על התא, כלומר -מאקרו אירוע מסוג Double Click
אני לוחצת לחיצה ימנית על שם הגיליון > הצג קוד

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

מאקרו אירוע מסוג Selection Change נפתח באופן אוטומטי (עוד מעט נמחק אותו משום שאין לנו בו צורך):

כעת נבחר בחלונית מימין את סוג האירוע הרצוי. מכיוון שאני מעוניינת לפתוח את הסייר בלחיצה כפולה, אבחר באירוע Before Double Click:

כעת אפשר למחוק את האירוע SelectionChange ולהקליד את הקוד הפשוט הבא:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

On Error Resume Next

Rng = Target.Name.Name

If Err.Number <> 1004 Then

    If Rng = "FlPth" Then

                    x = Application.GetOpenFilename

                    Range(Rng) = x

     End If

End If

Cancel = True

End Sub

וכך זה נראה בעורך:

(למי שתוהה, כן, בוודאי שאפשר לאחד את שתי הבדיקות לשורת IF אחת…)

אז מה הקוד עושה?

ראשית, הוא לוקח לתוך המשתנה Rng את שם התא.
ומה משמעות התחביר המשונה Name.Name?
פשוט מאוד – שמו של התא הוא הכתובת שלו, כך שהפקודה Target.Name תחזיר:

אבל אם נתנו לתא שם, ובמקרה שלי קראתי לתא FlPth, זה מה שישמר במשתנה Rng.
ומה קורה אם לא נתנו לתא שם? במקרה הזה נקבל שגיאה מס' 1004,
משום שאנחנו מבקשים לקבל את שם התא, ואילו במקרה הזה, לתא יש רק כתובת.
זו הסיבה שהקדמתי את שורת הקוד בפקודה On Error Resume Next שבעצם אומרת לעורך להתעלם משגיאות, אם יצוצו.
בשלב הבא אני אומרת לעורך שאם מספר השגיאה שונה מ 1004, כלומר – לתא יש שם,
(דרך אגב, במקרה הזה יכולתי גם לבדוק אם השגיאה שווה לאפס, כלומר – אין שגיאה)
ואם השם שהתקבל הוא FlPth, כלומר – זהה לשם שנתתי קודם לתא
(כשהמשמעות היא שלחצתי לחיצה כפולה על תא שיש לו שם, ושהשם זהה לשם שעליו אני רוצה להפעיל את הקוד),
תפתח את הסייר, ותזין את שם הקובץ שנבחר אל תוך המשתנה X.
את זה אנחנו עושים באמצעות הפקודה

x = Application.GetOpenFilename

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

רוצים ללמוד VBA מספר בעברית? לחצו כאן

הספר יסודות התכנות ב VBA

מעוניינים ללמוד בנוחות ביתכם בקורס מקוון? לחצו כאן

דילוג לתוכן