תמונת מסך של Visual Basic 6 שמדגימה כתיבה של התוכנית Hello world
**ויז'ואל בייסיק** (באנגלית: **Visual Basic,** או בקיצור **VB**) היא שפת תכנות מונחית אירועים וסביבת פיתוח משולבת (IDE) שפותחה על ידי חברת מיקרוסופט. השפה מוגדרת למעשה כשפת פיתוח אפליקציות מהיר (RAD) לממשקי משתמש (GUI) ומערכות עיבוד נתונים. השפה הושקה לראשונה כ-Visual Basic 1.0 ב-1991 וגרסתה האחרונה (VB6) יצאה בשנת 1998. החברה הוסיפה לתמוך בה בתמיכה המורחבת עד מרץ 2008. יורשתה היא VB.NET, שהיא שפה מודרנית בעלת יכולות מלאות (אם כי רבות מתכונותיה של VB הוטמעו גם בשפת C#‎). שפת VB יועדה לסביבת מערכת ההפעלה Windows בלבד, אך יש לה מימושים גם בלינוקס (Gambas). שפות הסקריפטים VBA ו- VBScript הן תת-גרסאות של VB.

היסטוריה
--------

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

הגרסה הראשונה פותחה והוצגה לראשונה בכנס Windows world באטלנטה ב-20 במאי 1991, יחד עם חלונות 3.1. באותה תקופה לא היו כמעט כלי פיתוח לכתיבת ממשקי משתמש למערכת ההפעלה Windows, שהייתה עוד בחיתוליה.

עיצוב גרירה והשלכה באמצעות עכבר ליצירת ממשק משתמש נגזר מאב טיפוס של מחולל טפסים שפותח על ידי אלן קופר והחברה שלו "Tripod". מיקרוסופט התקשרה עם קופר וחבריו במטרה לפתח Tripod למערכת טופס לתכנות עבור Windows 3.0, תחת שם הקוד "Ruby" (אין קשר לשפת תכנות רובי). Tripod לא כללה כלל שפת תכנות. מיקרוסופט החליטה לשלב את רובי עם בייסיק כדי ליצור את Visual Basic.

מחולל ממשק רובי סיפק את החלק "החזותי" של Visual Basic בשילוב עם "EB" מנוע בייסיק משובץ שעוצב למערכת מסד נתונים "אומגה" הנטושה של מיקרוסופט. רובי גם סיפק את היכולת לטעון ספריות קישור דינמיות המכיל פקדים נוספים (שנקרא אז "gizmos"), שהפכו מאוחר יותר לסיומת VBX.

בשלביה הראשוניים השפה הייתה חלשה למדי, ובעלת ביצועים נחותים ותחביר פרימיטיבי וחסר גמישות, ולכן לא התאימה למערכות מסחריות, אך במהלך השנים, במיוחד החל מגרסאות 5 ו־6 שבהן הוספו פקדים שיתופיים, יכולת של הידור של הפרויקט לקובצי EXE ,DLL ו־ActiveX וכן פקדי משתמש ומסכי MDI, היא נעשתה חזקה למדי והתאימה להיבטים תכנותיים מסוימים, ובמיוחד ליצירת ממשק משתמש גרפי ולעבודה מול מנועי בסיסי נתונים.

בעקבות או במקביל להצלחה של VB יצאו תוכנות דומות כמו דלפי של בורלנד ומחולל היישומים Access של מיקרוסופט.

פיתוח השפה הופסק אחרי גרסה 6, הסתיימה ב-31 במרץ 2005, והתמיכה המורחבת הסתיימה במרץ 2008.
עם זאת, הרכיבים העיקריים של סביבת הפיתוח Visual Basic 6 פועלים בכל גרסאות 32 סיביות של Windows עד וכולל Windows 11.

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

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

מאפיינים של Visual Basic
------------------------

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

* **תכנות חזותי באמצעות ממשק משתמש גרפי**: התכנות החזותי, שבו חלק ממלאכת התכנות מומר בגרירת פקדים (שהם אובייקטים תכנותיים שלמים) וציורם על-גבי טופס, דבר המחולל קוד מתאים. עדכון המאפיינים של הפקדים נעשה בגיליון מאפיינים, בהקלדה ובבחירה מתוך תיבות רשימה וטפסים שונים, והפעלתם באמצעות קריאה לשיטות הקיימות בהן. התפיסה הזו הורחבה לכלים **בונה המחלקה** שמאפשר בתכנות חזותי ליצור מחלקות, ול**בונה השאילתה** המאפשר ליצור שאילתות SQL בצורה גרפית. כמו כן, הפרדיגמה התכנותית ב-Visual Basic היא שתחילה יוצרים את הממשק הגרפי בציור הפקדים והגדרתם ולבסוף מגיעים אל הפונקציונליות של הקוד שמאחורי האובייקטים של הממשק, כך שהולכים מן הכלל אל הפרט.
* **תכנות מונחה אירועים**: לכל אחד מהפקדים המוצגים בממשק המשתמש מוגדרת בתוכנית סדרה של שגרות, המתבצעות כאשר מתרחש האירוע המתאים, כגון כניסה לפקד, יציאה ממנו, פעולת עכבר או מקלדת עליו, שינוי תוכנו ועוד. הביצוע הסדרתי המסורתי של תוכנית מחשב, באופן ליניארי פקודה אחר פקודה, הוחלף בשפה זו בביצוע מונחה אירועים: כל אירוע מפעיל את השגרה המתאימה לו.
* **פשטות וידידותיות**: התכנות בשפה זו פשוט וקל יחסית בניגוד לשפות שיש בהן מורכבות וסיבוכיות רבה (טיפוס מחרוזת אחד לעומת מספר רב של טיפוסי מחרוזת בשפת C++‎). בשפה זו קיימת אוריינטציה אנושית, כך שלפקודות והמילים השמורות והפונקציות של השפה, יש משמעות באנגלית פשוטה שאינה טכנית. בשפה זו מוטמעות פונקציות רבות כחלק ממנה, כך שקל ופשוט למשל לבצע פעולות על מחרוזות או תאריכים. גם התכנות החזותי מפשט את הכתיבה בשפה זו. אבל מאידך המחיר בתשלום על הפשטות הוא בהיעדר גמישות תכנותית, ומוגבלות רבה בניסיון לבצע דברים מורכבים.
* **אוטומציה פנימית**: השפה לוקחת על עצמה חלק מעבודת המתכנת היכן שהדבר אפשרי: כך למשל בשפה ניתן להשתמש במשתנים מבלי להגדירם כלל. בפעולות השמה מתבצעת המרה (קסטינג) אוטומטית בין סוגי משתנים כאשר הדבר אפשרי, אפילו בין מספר שנמצא במשתנה מחרוזתי לבין משתנה מספרי או בין מערכים של בתים למחרוזת. ניתן להגדיר משתנה מסוג משתנה (variant) שיכול לשנות את הטיפוס שלו לכל סוג במהלך הריצה, לפי סוג הנתונים שמשימים אליו. שימוש נפוץ בו הוא השמה של פונקציה שמחזירה מערך בגודל שאיננו ידוע מראש. אפשר להגדיר מערכים דינמיים שניתן לשנות את גודלם תוך כדי ריצה. בנוסף, קיימות בשפה בדיקות פנימיות שונות, ללכידת באגים נפוצים כמו למשל לכידת חריגה מאיברי מערך.
* **מודולריות**: שפת VB היא שפה "פתוחת קצוות" (Open-Ended). לשפה זו היו אפשרויות הרחבה, באמצעות פקדי VBX, שנכתבו בשפת C. (בגרסאות 1–3). יורשיהם של פקדים היו פקדי OCX (שכיום מכונים פקדי ActiveX), וניתן לכותבם בשפות שונות, באמצעות טכנולוגיית COM. הפקדים הם למעשה מיני תוכנות, המשמשים כאבני הבניין של התוכנית, ויוצרים בה מבנה מודולרי. בהמשך נוצרו פקדים נוספים לפי נושאים ותחומים, באופן שכיסו חלק נרחב מנושאי התכנות הקיימים, והביאו נושאי תכנות מסובכים לידי פשטות תכנותית, החל מפקד טורי שמטפל ביציאות המחשב ופקד היוצר תקשורת לאינטרנט וכלה בפקד שנותן פונקציונליות של לוח שנה. הפקדים ופקדי המשתמש של VB הם למעשה יישום של תכנות מונחה עצמים.
* **שפת תכנות סינתטית**: שפה שהיא שילוב של שפה מפורשת ושפה מהדרת. השפה במקורה היא שפה מפורשת, בה כל פקודה מורצת ברגע שמגיעים אליה, כך שאין כל צורך להדר את הקוד כולו, לפני כל ריצת ניסוי, ואפשר גם לשנות קוד תוך כדי ריצה (edit and continue), דבר שמאפשר לתהליך הפיתוח להיות יעיל ומהיר. ומצד שני התוכנית המוגמרת, זו המוגשת למשתמש, עוברת הידור לשפת מכונה, כך שמתקבלת לבסוף תוכנית יעילה יותר (הגם שהיא עדיין איטית משמעותית משפות תכנות כמו C).

חידושים עיקריים בשפה
--------------------

* משתנים מורכבים כמו מחרוזת (String), תאריך (Date), מטבע (Currency), משתנה (Variant - שיכול להחזיק כל סוג משתנה), ואובייקט (Object).
* שילוב פונקציות חישוביות לתמיכה במשתנים מורכבים, כמו פונקציות לחישוב תאריכים או פונקציות מחרוזתיות. (למשל פונקציית DateDiff לחישוב הפרשי תאריכים, ופונקציית Split שמפצלת מחרוזת למערך).
* טיפול מיוחד במערכים ואוספים. אובייקט אוסף (Collection), מערכי פקדים, ולולאת טווח (For Each) למעבר על מערכים ואובייקטי אוספים.
* תכנות חזותי מקיף שמהווה את ליבת הפיתוח: שימוש בטופס, פקדים, מאפיינים ואירועים, שמהווה אב טיפוס לשפות הדוט נט.

סביבת הפיתוח
------------

תמונת מסך של סייר האובייקטים ב- VB 6 שמאפשרת לאתר ולחקור שיטות, מאפיינים ואירועים של אובייקטים
סביבת הפיתוח של VB כוללת מספר של חלונות:

* חלון **הקידוד המרכזי** בו אפשר לצייר את הטופס או לכתוב את הקוד. בחלון הטופס ניתן לצייר את הטופס, לבחור פקד מסוים וכדומה. בחלון הקוד אפשר לקבל רשימה של כל האובייקטים ולקבל רשימה של כל שגרות האירוע שלהם. בכתיבה ניתן לקבל השלמה בכתיבת מילים, וכן לקבל את המבנה של הפונקציה וצורת הפרמטרים שלה תוך כדי הקלדה.
* חלונית **ארגז כלים** (Toolbox) בו מופיעים אייקונים של הפקדים הקיימים לשרטוט על גבי הטופס. ניתן לגרור ייצוג של פקד לטופס ובכך לחולל קוד שיוצר את הפקד בטופס.
* **סייר הפרויקט** (Project Explorer) בו אפשר לבצע חיפוש ולנווט בין כל רכיבי הפרויקט.
* **סייר האובייקטים** (Object Explorer) בו אפשר לאתר ולנווט בין האובייקטים השונים, ולקבל מידע על כל הפונקציות, המשתנים והקבועים שהפרויקט מקושר אליהם ויכול לעשות בהם שימוש.
* חלון **מאפיינים** (Properties) בו אפשר לקבל מידע ולבצע שינויים בתכונות של האובייקט שנבחר באמצעות תיבות טקסט ותיבות משולבות כמו גם בטפסים מיוחדים לשינוי צבע וגופן למשל.
* חלונית **תסדיר טופס** (Form Layout) באמצעותו ניתן לקבוע את מיקום הטופס במסך, בתחילת הריצה באופן חזותי.
* חלון **מידי** (Immediate) בו אפשר להפעיל ביטויים מתמטיים ופונקציות כדי לקבל תוצאות באופן מידי מבלי להריץ את התוכנה מחדש.
* חלונית **צפייה** (Watches) בו אפשר לבחון משתנים וביטויים בנקודות עצירה של התוכנית.
* חלונית **מקומי** (Locals) בו אפשר לבחון אובייקטים מקומיים מבלי לבקש אותם.
* טופס References, באמצעותו ניתן ליצור קישור של הפרויקט לספריות חיצונית. אפשר להוסיף תוספים לVB, וישנם כמה תוספים שמובנים בו ובאים כברירת מחדל.

הטופס
-----

*תמונת מסך אופיינית של התוכנה בגרסתה השישית. בחלק השמאלי סימולי הפקדים, בחלק האמצעי טופס, ובחלק הימני נווט הפרויקט וחלון מאפיינים.*
הטופס הוא לב ליבה של שפה זו. התפיסה היא שמתחילים בשלב החזותי. יוצרים את כל הטפסים של הפרויקט, נותנים תפקודיות ראשונית לכל טופס, באמצעות ציור של פקדים מובנים ושל פקדי Active X על גבי הטופס (שווה להכרזה של משתנה). קינפוג מאפייני הפקדים שבאמצעות חלון התכונות, וכתיבת קוד VB היכן שצריך (גישה נוחה לקוד הרלוונטי בהקלקה כפולה על הטופס או על הפקד). בחלון הקוד אפשר לקבל את רשימת כל האירועים של הטופס ופקדיו, ובבחירת אירוע נוצרת לה אוטומטית שגרת אירוע עם כל הפרמטרים הרלוונטיים. בשגרה יש לכתוב קוד או לקרוא לשגרה/פונקציה שנמצאת במקום אחר. במקרה שעדיין הפונקציונליות הדרושה חסרה, אפשר ליצור הפניה לפונקציות בקובצי DLL או לקובצי COM, או להכריז על פונקציות שנמצאת ב-APIs של המערכת, או לכתוב את הקוד הנצרך במודול או במחלקה.

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

### User Control

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

### פקדים שיתופיים

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

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

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

### אוסף פקדים

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

תחביר השפה
----------

### תווים מיוחדים

* **תו הערה**. ניתן לגרום לקומפיילר להתייחס לטקסט כאל הערה באמצעות התו גרש בתחילת הטקסט ('). ניתן לשים את התו בכל מקום בשורה. בשפה לא מוגדר סט של תווים שיכול ליצור הערה על פני כמה שורות.
* **תו המשך שורה**. הקומפיילר מתייחס לתו אנטר כאל תו הפסקה בין פקודות, ולכן לא צריך לשים תו מפריד בסוף כל פקודה. אם רוצים לכתוב פקודה על פני כמה שורות, אפשר לעשות זאת באמצעות התווים רווח ומקף תחתון (\_).
* **תו הפרדת פקודות**. כדי להפריד בין כמה פקודות ולכתוב אותן באותה שורה, ניתן להשתמש בתו נקודתיים (:), שמקביל לתו נקודה פסיק (;) בשפת C.

### הצהרות

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

הצהרה נוספת היא הצהרה על פונקציות בקובצי DLL חיצוניים, באמצעות המילים השמורות Declare ו-Lib.

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

1. יש להצהיר על פונקציית PlaySound שנמצאת בקובץ winmm.dll.
2. יש להגדיר את הקבועים ששולחים כפרמטרים בפונקציה, שתפקידם להורות כיצד לנגן את קובץ הקול.
3. ולאחר מכן לבצע קריאה אליה.

```
Public Declare Function PlaySound Lib "winmm.dll" (ByVal FileName _
 As String, ByVal hmod As Integer, ByVal flags As Integer) As Long
Public Const SND\_FILENAME = &H20000
Public Const SND\_ASYNC = &H1

PlaySound("C:\App.wav",0,SND\_FILENAME+SND\_ASYNC)

```

### הכרזת קבועים

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

```
Public Const HKEY\_USERS = &H80000003
Const KEY As Integer = 12

```

### הכרזת משתנים

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

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

* **תאריך** (Date), שמכיל חותמת של תאריך ושעה ומאפשר באמצעות פונקציות תאריכיות לבצע חישובים תאריכיים באופן קל.
* **מטבע** (Currency), לביצוע חישובים מדויקים במטבע.
* **אובייקט** (Object), להצבעה על אובייקטים ולעבודה איתם.
* משתנה רב תכליתי מסוג **משתנה** (Variant), שמשתנה לפי טיפוס הערך, ויכול להכיל ערך מכל סוג.
* **אוסף** (Collection), לעבודה עם אוספים (ראו להלן).
* **גופן** (StdFont)
* **תמונה** (StdPicture).

צורת הכרזה של משתנה

```
Dim|Private|Public VariableName As variableType

```

משתני מחרוזת ניתן להגדיר בגודל קבוע באמצעות התו \*,

```
Dim String64 As String \* 64

```

#### הכרזה מקוצרת

ניתן להכריז על משתנים באמצעות כתיב מקוצר, באמצעות הצמדת סימן מיוחד בהגדרת משתנה, כאשר לכל סוג משתנה מוקצה תו מסוים. למחרוזת (String) - $, למספר שלם (Integer) - %, לשלם ארוך (LongInteger) - &, לנקודה צפה יחיד (Single) - !, לנקודה צפה כפול (Double) - #, למטבע (Currency) - @.

* למשל המשפט הבא: &Dim Key1 - יגדיר משתנה Key1 מסוג LongInteger.
* והמשפט הבא: Dim Key2$ - יגדיר משתנה Key2 מסוג מחרוזת.

#### וריאנט

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

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

ניתן להצהיר על משתנה וריאנט A בשתי צורות - מרומזת (implicit) ומפורשת (explicit):

```
Dim A
Dim A as Variant

```

#### המרה אוטומטית

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

```
 A = "2" \* 3

```

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

```
 Dim bytesArray() As Byte
 bytesArray = "I am a string"

 Dim str As String
 str = bytesArray

```

### מיספור - Enum

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

```
Public Enum CityList
 Albuquerque\_nm = 10
 Anchorage\_AK = 22
 Atlanta\_GA = 31
 Austin\_TX = 44
 Birmingham\_AL = 55
 Bismarck\_ND = 63
End Enum

Private CityList1 As CityList

```

בדוגמה ברגע שנבקש לבצע השמה למשתנה CityList1, נקבל רשימה נפתחת ובו הערכים שבEnum

### הגדרת משתני משתמש

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

```
Private Type City
 CityName As String
 SunRise As Date
 SunSet As Date
End Type

```

### אוספים - Collections

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

### הגדרת פונקציה

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

```
Private Function SunRisen(ByVal nt As Double) As Double
 Dim ne As Double
 ...
 SunRisen=value
End Function

```

### הגדרת שגרה

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

```
Private Sub SunRisen(ByVal nt As Double)
 Dim ne As Double
 ...
End Sub

```

מודול
-----

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

תכנות מונחה עצמים - מודול מחלקה
-------------------------------

מודול מחלקה (Class Modules) הוא היישום של VB לתכנות מונחה עצמים. המימוש של מתודולוגיה זו הוא מוגבל ולמעשה מממש את העיקרון של כימוס בלבד, ללא אפשרות לירושה, פולימורפיזם ויצירת ממשקים. מודול מחלקה יכול להכיל משתנים, שיטות, מאפיינים (Property) ליצירת גישה מבחוץ למשתנים פרטיים, ואירועים (Event) לתיקשור בין מחלקות שונות. למודול המחלקה יכול להיות בנאי (Class\_Initialize) ומפרק (Class\_Terminate). הטופס ב-VB הוא למעשה מקרה פרטי של מודול מחלקה.

כל מחלקה חייבת להיות בקובץ נפרד. לא ניתן ליצור מחלקות מקוננות. ב-VB מובנה אשף חזותי לבניית מחלקות בשם Class Builder, שבו אפשר לקבוע ולנהל את תצורת המחלקות שבפרויקט: שמות המאפיינים, השיטות והאירועים והפרמטרים שלהם.

עבודה בקבצים
------------

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

```
Private Function LoadFile(FileName As String) As String
 Dim Temp As String, AllFile As String
 Open App.Path & FileName For Input As #1
 Do While Not EOF(1)
 Input #1, Temp
 AllFile = AllFile & Temp
 Loop
 Close #1
 LoadFile = AllFile
End Function

FileTxt = LoadFile("\Data.dat")

```

בסיסי נתונים
------------

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

### Visual Data Manager

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

### Data Environment

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

### Data Report

רכיב זה אף הוא אובייקט Active X המשולב בסביבת VB, הנועד לעזור ביצירת דוחות. באמצעותו ניתן לפצל את הנתונים לאזורים שונים (כמו כותרת דוח, כותרת עמוד, מקטע פירוט), לקבץ אותם לפי ערכים. לרכיב זה בדומה לטופס פקדים שונים המאפשרים תצוגה של נתונים. שדות מוגדרים מראש, שדות מבוססות פונקציות לחישובי דוח, יכולות גרפיות, הצגה מוקדמת והדפסה.
מחולל דוחות נוסף שבאמצעותו ניתן לייצר דוחות הוא Crystal Reports שאף הוא מצורף לחבילת הפיתוח של VB.

### פקדי בסיסי נתונים

בVB ישנם פקדי נתונים מסוגים שונים כמו DAO ו ADO המאפשרים תקשורת עם בסיסי נתונים בשיטות שונות. ניתן גם לתקשר ישירות בקוד ללא פקדים עם בסיסי הנתונים באמצעות אובייקטי גישה לנתונים בסוגים השונים. ישנם פקדים נוספים לתצוגת נתוני המסדים, שמאפשרים תצוגת נתונים באופנים שונים: רשומה בודדת, גיליון נתונים (רשת DataGrid), רשומות בקשר אב ובנים, רשת היררכית ותרשים. כאשר לפקדי התצוגה ישנה יכולת לתקשר עם פקדי הנתונים, באמצעות איגוד נתונים עם תוכני הרשומות של טבלאות המסדים.

תתי גרסאות
----------

שגרה באקסל שמעלה בריבוע בטור Y את איברי טור X
ישנן שתי תתי גרסאות נפוצות ל**Visual Basic**:

* **Visual Basic For Applications - VBA**, שמיועדת לשילוב בתוכנות אחרות, כגון כל תוכנות המוכללות בחבילת האופיס של מיקרוסופט וביניהם Word וExcel. גרסה זו מאפשרת הרחבת יכולות ואוטומציה של תוכנה קיימת בידי המשתמש, ושימוש גמיש וחזק בפונקציונליות של התוכנה שמכילה אותה. כל המאקרו בתוכנות האופיס הן למעשה קוד של Visual Basic (ניתן לראותו על ידי לחיצה על Alt-F11).
* **VBScript** - גרסה מוקטנת של Visual Basic המשמשת לכתיבת קטעי קוד קצרים (Scripts) שמורצים על ידי תוכנות אחרות. דוגמאות לשימושים כאלו:
	+ מערכת ההפעלה חלונות יכולה להריץ VBScript שמשמשים בדרך כלל לפעולות אחזקה (נפוץ בעיקר בארגונים). ישנם מספר וירוסים שכתובים ב-VBScript (סיומת VBS). הם עושים שימוש בקבצים אלו כשהם מועברים בדואר אלקטרוני.
	+ IIS - שרת האינטרנט של מיקרוסופט, מריץ דפי Active Server Pages - ASP שכתובים ב-VBScript.
	+ ניתן להריץ VBScript בתוך דפדפן האינטרנט "אקספלורר", כתחליף לא פופולרי ל-JavaScript.
	+ דוגמה לסקריפט של VBScript:

```
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
MsgBox ("The script opens notepad")
WshShell.Run("notepad")

```

מגבלות השפה
-----------

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

### מגבלות ביכולתה ליישם אובייקטים

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

### מגבלות בתחביר השפה

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

### פונקציונליות

שפה זו חסרה את היכולות לכתוב שירותי חלונות. היא גם חסרה את היכולות לכתיבה של תהליכונים מבלי לעשות שימוש ב-Windows API, וחסרה את האפשרות לעשות שימושים במצביעים. מלבד זאת נצרכה לעשות שימוש ב-Windows API לצורך דברים רבים, חלקם טריוויאליים. לטיפוסי Variant הייתה תקורה גבוהה בנפח הזיכרון, לעומת שפות בעלות טיפוסיות חזקה. בהרבה תחומים תכנותיים כמו תקשורת ווידאו חסרה ל-VB תשתית ראויה בשפה עצמה, והיא מושלמת באמצעות פקדי ActiveX שנכתבים לרוב בשפת C++. גם לא ניתן לכתוב בשפה זו מערכות תשתיתיות כמו מערכות הפעלה וכדומה.

### איטיות בזמן ריצה

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

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

דוגמה לקידוד של VB
------------------

### תוכנית שלום עולם

```
Sub main()
 msgbox("Hello World!")
End Sub

```

### פונקציה שמחזירה את המספר הגדול מבין שניים

```
Function MaxOf(Number1 As Long, Number2 As Long) As Long
 If Number1 >= Number2 Then
 MaxOf = Number1
 Else
 MaxOf = Number2
 End If
End Function

```

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

Visual Basic .NET
-----------------

 ערך מורחב – **Visual Basic .NET**  

גרסת 2005 של VB.NET
גרסה זו של ויז'ואל בייסיק שהוכרזה לראשונה בפברואר 2002, (ב-2003, סוף 2005, וסוף 2007) עברה מקצה שיפורים נרחב לכיוונם של השפות העיליות. אם בגרסה 6 הוסיפו אובייקטים, יכולת הידור, יצירת אובייקטי Active X וקובצי DLL, בגרסה זו שהיא מערכת חדשה מומשה פרדיגמת תכנות מונחה עצמים במלואה, עם אפשרות של ירושה, פולימורפיזם וממשקים וכן תכנות פונקציונלי. כמו כן, הוספו יכולות לשפה כמו תמיכה בתכנות מקבילי וריבוי משימות, טיפול בקטע קריטי, תחשיב למדא, LINQ ועוד. התחביר שונה והוגמש כך שיהיה תואם יותר לתפיסות המקובלות. נוספו אובייקטים וספריות רבות שמקלות על עבודת התכנות. השפה החדשה מתבססת על סביבת NET Framework. של מיקרוסופט, שהוסיפה יכולות נרחבות שכלל לא היו קיימות בגרסאות הקודמות, כמו כתיבת ישומי ושירותי רשת וטפסי Web, וחיזוק העבודה עם בסיסי נתונים באמצעות ה-ADO.NET. התוכנה הפכה להיות רב פלטפורמית, ואפשר לפתח בה יישומים להתקנים ניידים, לשולחן העבודה (desktop) וישומי אינטרנט. הוספה לה יכולת תקשורת עם שפות תכנות אחרות הכלולות בדוט נט, באופן שמאפשר מיחזור קוד משפה לשפה, ללא צורך של כתיבה מחדש. שינוי התחביר של ה-VB והכללתה בסביבת הדוט נט, הפך את התכנות בה ליותר מסובך, וחייב המרה של הגרסאות הקודמות, דבר שעורר תרעומת אצל חלק ממתכנתי ה-VB, עם זאת השינויים הרבים שהיא עברה, הפכו אותה למעשה משפת נישה שמיועדת לממשקים ובסיסי נתונים, למעמד של שפה מובילה בפלטפורמת NET Framework, בעלת מעמד דומה לשפת C#‎.

ראו גם
------

* רשימה של שפות תכנות

לקריאה נוספת
------------

* בריאן שילר וג'ף ספונטס, **Visual Basic 6 - סדנת לימוד**, מהדורה אנגלית: QUE, מהדורה עברית: הוד עמי, 1999, 1024 עמ', בעריכת יצחק עמיהוד.
* מייקל הלוורסון, **Visual Basic 6 - צעד אחר צעד ערכת לימוד**, מהדורה אנגלית: Microsoft Press, מהדורה עברית: פוקוס מחשבים, 1999, 678 עמ', בתרגום ענת קדם בן צבי.

קישורים חיצוניים
----------------

| מיזמי קרן ויקימדיה |
| --- |
| ויקיספר ספר לימוד בוויקיספר: **Visual Basic** |
| ויקישיתוף תמונות ומדיה בוויקישיתוף: **ויז'ואל בייסיק** |

* 

* אתר האינטרנט הרשמי של ויז'ואל בייסיק (באנגלית)
* דוקטור ויבי - אתר המסביר רבות בנושא
* מדריך ללימוד Visual Basic
* מדריך ללימוד VB ודוט נט
* האתר הרשמי של השפה בגרסה החדשה
* להורדה של גרסה חינמית ועדכנית של ויזואל בייסיק, להתנסות, באתר מיקרוסופט
* אוסף פקדים חיצוניים כלליים לוויזואל בייסיק.
* אוסף פקדים חיצוניים לתכנות אודיו בוויזואל בייסיק.
* גאמבאס סביבת פיתוח לVB בלינוקס, אתר sourceforge

הערות שוליים
------------

1. ↑  הצגה של הגרסה, אתר יוטיוב

| מיקרוסופט |
| --- |
| שירותי אונליין | Live (msn) ‏• Outlook.com ‏• בינג • OneDrive ‏• Microsoft Azure •‏ Office Online ‏• מיקרוסופט 365 • ‏Groove |
| חומרה | Surface ‏• Xbox Series X/S ‏• Xbox One ‏• Xbox 360 ‏• Xbox ‏• Kinect ‏• זון |
| מערכות הפעלה | Microsoft Windows •‏ Windows Phone ‏• Windows Server ‏• Windows CE ‏• Windows Mobile |
| פלטפורמות וסביבות פיתוח | ויז'ואל סטודיו‏ • Visual Studio Code •‏ Microsoft Silverlight |
| תוכנות מחשב | מיקרוסופט טיסה • אינטרנט אקספלורר • מיקרוסופט אדג' • סקייפ • Microsoft Mathematics ‏• Microsoft Security Essentials •‏ Microsoft Office ‏• Windows Defender ‏• SQL CE ‏• Microsoft Teams |
| תוכנות שרת | Microsoft SQL Server‏ • SharePoint‏ • Internet Information Services • שרת Exchange‏ • Microsoft Biztalk Server‏ • Active Directory |
| אנשי מפתח | ביל גייטס • פול אלן • סטיב באלמר • סאטיה נאדלה |
| טכנולוגיות | ‎.NET •‏ DirectX •‏ ‎.NET Core |
|  |

|  |  |
| --- | --- |
| בקרת זהויות עריכת הנתון בוויקינתונים | 
* LCCN: sh2013001451

 |