איך לעשות כפתור "שמור וסגור" בטופס scriptcase ?

הבעיה

בטופס של scriptcase אין אפשרות מובנה לשמור וסגור ביחד

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

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

הפתרון

באירוע של AfterUpdate

להכניס 2 פקודות

אחת ששומרת את הנתונים

והשניה שיוצאת אל הטופס הרצוי

דוגמא :

sc_commit_trans();
sc_redir(grid_leads.php);

 

בהצלחה

 

איך ב-ScriptCase לשים ערך ברירת מחדל מתוך Session אל שדה בשורה חדשה ב-Editable grid view ?

הבעיה

כאשר משתמשים ב Editable grid view של scriptcase , אז בהוספת שורה – נניח ונרצה ערך ברירת מחדל מתוך session או מתוך global variable

הבעיה היא שגם האירועים OnLoad וגם OnRecordLoad  נטענים לגבי כל השורות

הפתרון

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

למשל – האם המפתח הראשי קיים או שהוא empty ?

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

בהצלחה.

נגישות אתרים

נגישות אתרים – שימוש ב aria-label

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

מבחינת נגישות – אנחנו אמורים לתת תויות עם כיתוב , אלא שלא תמיד זה מתאים למה שרוצים לעשות. במקרה כזה באה לעזרתנו ה ARIA API ובאופן ספציפי ה aria-label .

אם מוסיפים את המאפיין aria-label אל אלמנט מסוים בדף , אז קורא-מסך ידע במקרים כאלו להקריא את תוכן המאפיין.

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

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

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

*** הפוסט בכתיבה ועדין לא גמור ( נכון ל-17.8.2016 לסה"נ ) ***

 

טכניקות נגישות

טכניקות נגישות כלליות

 

  • הקישור הראשון בדף צריך להיות "דלג לתוכן"
    והוא צריך להוביל ישירות לעוגן (#) של התוכן
    זה לא חייב להיות גלוי , מותר לשים class שמסתיר את זה ,
  • דוגמא :
<a href="#content">דלג לתוכן</a>
  • אל תגביל את המשתמש בזמן – שיוכל לסיים מה שהוא רוצה לעשות.  לדוגמא – באתר מכרזים, שמנגנון הניצחון יקבע לפי ההצעה הטובה ביותר ולא לפי זמן.
    דוגמא נוספת – משחקי מחשב – לאפשר הוספת זמן
  • תן אפשרות להפסיק רענון אוטומטי – אם אתה מרענן אוטומטית את הדף \ חלק בדף, אתה צריך לספק לגולש אפשרות לעצור את הרענון.
    החריג היחיד – הוא במקרים של "חירום" – כמו למשל ההתראות שפיקוד העורף סיפק עבור נפילות של טילים בצוק איתן – במקרה כזה, לא צריך לאפשר לגולש להפסיק את הרענון.
  • תן אפשרות לרענן חלק בדף ( למשל קישור שמבצע רענון של מצב המניות \ חדשות וכדומה )
  • צריך לספק תחליף לכל דבר שהוא לא טקסט
    אני מסביר זאת בפירוט בהמשך, אך בכל מקרה העיקרון הוא שאתה צריך לקחת בחשבון שיש אנשים שלא מסוגלים לראות : תמונות, וידאו, אנימציות, קאפצאה , ולכן תספק לכל אלו תחליף בטקסט
    כאשר – בקטע הזה, המינימום שאתה צריך – זה לתת תיאור קצר שמסביר למשתמש שיש פה תמונה שמציגה משהו.
    אבל עדיף – לתת תיאור מלא, למשל – עבור וידאו, לתת תמליל מלא של הוידאו בתוך תגית הוידאו.
  • להודיע למשתמש מה הולך לקרות כתוצאה מפעולה שהוא יעשה בטופס \ בממשק לפני שזה מתרחש
    דוגמא  –
    יש לנו שאלות שבו כל פעם שעונים נכונה על שאלה מסויימת – אוטומטית המשתמש מועבר לשאלה הבאה .
    אז צריך להסביר לפני השאלה הראשונה שזה מה שהולך לקרות.דוגמא 2 – יש לנו מקום שבו בוחרים את שפת האתר באמצעות כפתורי רדיו  – אז בהסבר שיופיע לפני כפתורי הרדיו נכתוב בצורה ברורה שהשפה הולכת להשתנות.
  • אם משלבים באתר גם Components כמו JSP  או ActiveX , אז צריך לדאוג שהם יעבדו מול ה-Accessibility API ( כלומר מאפייני ARIA, roles ועוד )
    כדי שתוכנות שמסייעות לאנשים מוגבלים יוכלו להתחבר למידע.
  • חובה לוודא שאלמנטים בדף נקראים היטב על ידי עזרים של נגישות
    בעיקרון – התקן מציין שמי שכותב HTML תקין לפי התקן אז הוא יעמוד בזה בקלות
    יש כמה דברים בסעיף זה – שצריך להזכיר אותם:

    • נניח ויש תמונה שמשמשת ככפתור לחיץ – זה בעייתי, כי קורא מסך לא יבין במה מדובר
      לעומת זאת – אם נהפוך את התמונה לכפתור שיכלול Value ואת שם הכפתור – אז קורא מסך כן יוכל לקרוא את זה ולתת לגולש העיוור תיאור שמסביר שזה כפתור שנקרא….(הערך שכתבת במאפיין value) – קישור לדוגמא לכפתור שמוגדר נכון
  • כל מידע שמוצג בצבע – צריך להציג אותו גם עם הסבר במילים
    דוגמא -יש טופס עם שדות חובה  והם מסומנים באדום
    בנוסף  לייד כל שדה חובה מסומנת כוכבית אז המשפט בתחילת הטופס צריך לומר "השדות הדרושים מופיעים בצבע אדום וגם מסומנים ב- * כוכבית"נקודה לשים לב – הסימן כוכבית הוא דורש תשומת לב לגודל – כי לא כל קוראי המסך מתייחסים אליו ולא כל המשתמשים כבדי ראיה – שמים לב לכוכבית, בגלל הגודל שלה.
  • ניגודיות – ישנה נוסחה שקובעת מה "יחס הניגודיות" בין צבע הרקע לצבע הכתב. המטרה היא לקהל על כבדי ראיה.
    • בגדול – צריך לשמור על יחס 4.5:1
    • עבור טקסט גדול -אפשר גם יחס 3:1
    • אם קהל היעד הוא כבדי ראיה, או שרמת הנגישות הנדרשת היא AAA – אז נחוץ יחס של 7:1

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

  • מקלדת:לוודא שאפשר להגיע לכל מקום בדף עם המקלדת ( בעיקר Tab ) .
    לוודא שאין "מלכודות מקלדת" בדף – כלומר שאין מקום מסוים שאם נכנסים אליו – אז אי אפשר לצאת ממנו באמצעות המקלדת בלבד.
    לא לדרוש קצב הקלדה מסוים
  • אפשר להבין מה המשמעות של כל קישור מתוך הטקסט של הקישור עצמו
    לדוגמא :
    במשפט הבא – אפשר להבין מתוך ההקשר שהקישור מוביל אל הכתבה …
    המאמר בעיתון הזה מאפיין את הכותב.
  • השתמש בכותרות של HTML כדי לתת כותרת ( ולא רק הדגשה של כתב באמצעות CSS  )
  • תן פתרון טכני שמאפשר לראות כל פעם איפה הפוקוס של המקלדת
    כלומר שעוברים בין אלמנטים בדף באמצעות טאב – אז אפשר לראות ויזואלית על המסך איפה אנחנו נמצאים. (קישור עם דוגמא ל- CSS ודוגמא ל- JS כדי להציג ויזואלית היכן הפוקוס )
  • לסדר את התוכן ב-DOM כך שיהיה תואם לסדר שלו על המסך – זה תקף בעיקר ב-2 עניינים:
    • לוודא שאם עשיתם עיצוב CSS הוא תואם לסדר שמופיע ב-Html, כדי שמי שמשתמש ב"קורא מסך" יוכל להבין את הסדר  – למשל נניח ויש רשימת של פריטים בקטלוג , ובאמצע יש תמונה, ואחריה תיאור של התמונה. ובאמצעות Css דאגנו שהתיאור של התמונה יבוא מתחתיה – אז צריך לוודא שגם ב-Html התיאור של התמונה הוא אחרי התמונה המתאימה ( ולא לפניה, למרות שמבחינה טכנית זה אפשרי כמובן ) .
    • בערבוב של שפות , למשל אנגלית בתוך משפט בעברית, צריך להשתמש בתגיות שמאפשרות ל"קורא מסך" להבין שהשפה התחלפה
      דוגמא :

      <p>The title says "<span lang="he" 
      dir="rtl">פעילות הבינאום, W3C</span>" in Hebrew.</p>

טכניקות נגישות שנוגעות לניווט

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

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

טכניקות נגישות שנוגעות ל-Meta ול-Header

  • בתגית Html הפותחת, צריך להכניס מאפיין שפה ( סעיף 3.1.1 )
  • <html lang="fr">
  • צריך לשים תגית title שמתארת באמת מה מציג הדף

טכניקות נגישות – מידע שמתעדכן אוטומטית

  • תאפשר לגולש לשלוט בעדכון – כלומר – לעצור אותו, לבצע עדכון, וכדומה.

טכניקות נגישות – תמונות

  • תשתמש ב-alt  על כל תמונה
  • אם התמונה היא חסרת משמעות – למשל חלק מהרקע של האתר – אז תשים עבורה alt="" רייק.

טכניקות נגישות – אנימציות / הבהובים / דברים זזים

  • אפשר למשתמש להפסיק כל דבר שזז ( אנימציה \ וידאו \ פלאש \ סרגל חדשות , משהו זז)
    צריך ליידע את המשתמש באיזה מקש להשתמש כדי לעצור.
    אם לדוגמא אנחנו מציגים קישור למצגת בתוך Modal, אז אפשר לתת תיאור בתחתית ה-Modal שאומר "לחץ על מקש הרווח כדי לעצור" .
    יש חריגים כאן – בסעיף 2.2.2
    דוגמא לסרגל חדשות שיש בו כפתור עצירה
  • אל תגביל את המשתמש בזמן – שיוכל לסיים מה שהוא רוצה לעשות.  לדוגמא – באתר מכרזים, שמנגנון הניצחון יקבע לפי ההצעה הטובה ביותר ולא לפי זמן.
    דוגמא נוספת – משחקי מחשב – לאפשר הוספת זמן
  • הבהוב :
    להגביל הבהוב עד 3 פעמים בשניה.
    רכיב מהבהב בכל מקרה לא יותר מ-5 שניות
    לתת שליטה על עצירת ההבהוב
    סעיף מיוחד עבור הבהוב אדום – במידה ויש לכם משהו כזה – צריך לוודא שעומדים בסעיף כאן

טכניקות נגישות – סרטונים / אודיו

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

טכניקות נגישות – גרפים

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

טכניקות נגישות  – טפסים

  • תשתמש ב-Lables כדי להסביר למשתמש מה למלא בכל שדה
  • וולידציות – אם הגולש טועה – צריך להסביר לו באיזה שדה ספציפית הוא טעה, ומה הטעות
    צריך גם לספק דוגמא לתיקון ( אלא אם כן זה יוצר בעיית אבטחה ).
  • עבור דברים פיננסים או משפטיים – צריך לעמוד בלפחות אחד מתנאים :
    • הפעולה צריכה להיות הפיכה – כלומר אם הוא ירצה הוא יוכל לבטל זאת
      או
    • שהנתונים שהוא הקליד יבדקו – ואם ימצאו שגיאות – הוא יוכל לתקן
      או
    • שלפני שהוא מבצע את השמירה\שליחה – יהיה עמוד שבו הוא יוכל לסקור את כל מה שהוא מילא, ולאשר סופית
  • אם אתה דורש בשדה מסוים שיקלידו רק בפורמט מסויים –
    אז תספק דוגמא או הסבר לפורמט הרצוי.
  • אם  סדר השדות במעבר באמצעות tab שונה מאשר הסדר שבו צריך למלא אותם
    אז להשתמש ב tabindex עבור השדות \ הפקדים – כך שהסדר בו צריך למלא את השדות – יהיה הסדר הנכון ב tabindex
  • טריק – בכל אלמנט בתוך הטופס שאינו שדה – בדרך כלל הטאב לא עוצר בו, אבל – אם נשים בו tabindex="0"   אז זה יגרום לכך שבמעבר טאב – המשתמש יעצור על זה
    זה אידיאלי עבור הוראות, כמו למשל תגיות p בתוך הטופס שבהם אומרים למשתמש דברים כמו "מינימום 6 תווים" וכדומה ( קישור לדוגמא עם טאב אינדקס אפס ).
  • לא לשנות תוכן של אלמנט שמקבל פוקוס
  • לא לעשות משהו בלתי צפוי כתוצאה ממילוי דברים בטופס אלא אם כן הודעת למשתמש על זה
    • דוגמא טרוייאלית ביותר – יש טופס על המסך, וכדי לשמור אותו – צריך לשים כפתור Submit עם המילה "שמור" – זה כבר עונה על הסעיף הזה בתקן
    • למשל – יש לך שדה שאם ממלאים בו ערך מסוים – אז אתה אוטומטית פותח טופס מודאלי למילוי עוד כמה פרטים – במקרה זה צריך לכתוב משפט שאומר למשתמש שזה מה שהולך לקרות.
    • אל תגרום להעברה לדף אחר כתוצאה מבחירת ערך בדרופ דאון.

 

 

גכ

עוד פעולות נגישות שצריך לבצע אם מנגישים לרמה  AAA :

  • וידאו :
    מתורגמן לשפת הסימנים בשידור חי
  • אודיו :
    אם יש קולות רקע במקביל לדיבור, למשל מוזיקת רקע תוך כדי שהקריין מסביר – אז צריך לתת אפשרות להשתיק את קולות הרקע,
    ובכל מקרה צריך להקפיד שקולות הרקע יהיו לפחות 20 דציבלים פחות מהדיבור. ( סעיף 1.4.7 )
  • עבור כל ביטוי מיוחד \ מקצועי וכדומה – יש לתת קישור להסבר או להשתמש בתגיות של "הגדרות" dl/dt וכדומה
  • להוסיף "פירורי לחם" בעמודי האתר – כלומר מקום כלשהוא בעמוד שאומר למשתמש איפה הוא נמצא בתוך האתר,
  • לתת קישור לעזרה בכל דף – והעזרה צריכה להיות רלוונטית עבור הדף .
  • לתת אפשרות להקראה אוטומטית של תוכן האתר
  • מתרגם לשפת הסימנים עבור וידאו
  • לתת מנגנון טכני שיפרש ראשי תיבות או קיצורים
  • הכלל שחל על דברים פיננסים או משפטיים ברמה AA – אז ברמה AAA הוא חל על הכל, כלומר בכל טופס, צריך לספק אחד מ-3 אפשרויות – אפשרות לבטל , אפשרות לתקן לאחר שנמצאו שגיאות, ודף סקירה שמציג את התוכן לאישור סופי לפני שמירה.
  • גם אם משתמש יצא מה-Session בטעות, צריך לתת לו אפשרות לחזור ולהמשיך מחדש מאותה נקודה – בלי למלא שוב פעם את הנתונים

שימוש ב-WebApi של SendGrid עבור משלוח מיילים ( לא באמצעות SMTP )

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

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

לצורך כך השתמשתי ב-WebAPI של SendGrid.

מה היתרון של WebAPI על פני שימוש רגיל ב-SMTP ?

כל ספקי האחסון השיתופיים חוסמים מיילים ב-SMTP בצורה זו או אחרת (מגבלה יומית, שעתית, שבועית וכדומה). כאשר שליחת המיילים מנוטרת דרך port 25/26/465 עבור משלוח מיילים ב-Smtp.

אז כדי לעקוף את המגבלה, ל-SendGrid יש WebApi מאוד נוח ומאוד קל לתפעול.

יחד עם זאת התיעוד סביר – אך היה יכול להיות יותר טוב.

אני השתמשתי בגירסה עבור php ( קישור ל-git פה )

התקנת הספריה ב-php באמצעות composer

(אני מניח שאתם משתמשים ב-composer, אם לא, אפשר גם להוריד את הספריה בגיט ולעשות לה require בעצמכם )

בחלק של ה-require בתוך composer.json תוסיפו הפניה לספריה שלהם:

{
  "require": {
    "sendgrid/sendgrid": "~5.0.7"
  }
}

ולאחר מכן להריץ composer update דרך שורת הפקודה (console).

להשיג Api Key בחשבון שלכם ב-SendGrid

כעת – גשו לחשבון שלכם ב-SendGrid והפיקו לעצמכם API KEY , עם ההרשאות שדרושות ( ניתן לשינוי בהמשך , אך הקוד עצמו מופיע רק פעם אחת על המסך ).

והחלק האחרון – המשלוח עצמו.

דוגמא למשלוח מייל באמצעות WebAPI של SendGrid ב-php

הנה דוגמא פשוטה :

הערות : הקוד פה חלקי בלבד .

הקוד מתבסס על use שלא הדבקתי פה.

ואני כותב ב-Laravel ולכן הפונקציה View עם מתודת render().

try {
    $from = new SendGrid\Email(self::SENDER_NAME, self::MANAGER_EMAIL);
    $subject = $e->subject;
    $to = new SendGrid\Email(null, $e->To);
    $body = view('emails.emailWithButton', [
        'body' => $e->body,
        'button' => $e->btn,
        'link' => $e->link,
        'title' => $e->subject])->render();
    $content = new SendGrid\Content("text/html", $body);
    $mail = new SendGrid\Mail($from, $subject, $to, $content);

    $sg = new \SendGrid($apiKey);

    $response = $sg->client->mail()->send()->post($mail);
    echo $response->statusCode();
    echo $response->headers();
    echo $response->body();


ובצורה הזו – שולחים מייל באמצעות API.

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

בהצלחה.

 

מה קרה לאתר ? הסבר קצר

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

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

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

עם מנויי ה-RSS שקיבלו הפצצה – הסליחה 🙂

להשתמע

איל

פרוצדורת VBA למחיקת עיצובים מותאמים אישית ב-Excel

יש הטוענים שעיצובים אלו יוצרים בעיות

להלן פונקציה שמוחקת אותם

השורה On error resume next מיועדת בין השאר, למצבים שהגיליון שמכיל עיצוב כזה – נעול, במצב כזה, תתקבל תקלה.

Sub StyleKill()
     Dim styT As Style
     Dim intRet As Integer
     On Error Resume Next
     For Each styT In ActiveWorkbook.Styles
         If Not styT.BuiltIn Then
             If styT.name <> "1" Then styT.Delete
         End If
     Next styT
 End Sub

מקור כאן

פונקצית VBA לחישוב ערכים באמצעות אקסל חיצוני (למשל מאקסס או מוורד)

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

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

פונקציה זו נועדה לחשב דברים באמצעות אקסל
יש לספק 3 פרמטרים:
1. שם הקובץ
2. מערך המכיל את המידע שיש לשתול באקסל
3. מערך המכיל את התאים שיש לקבל מאקסל
הפונקציה שותלת את המערך מהפרמטר השני
ואז ממלאת את המערך מהפרמטר השלישי ומחזירה אותו
כלומר תוצאה הפונקציה היא מערך!
במקרה של תקלה – תוצאה הפונקציה תהיה בוליאנית – שקר

מבנה המערכים –
שתי המערכים באותו מבנה – דו מימדי, כאשר תיאור העמודות נשמר ב
ENUM = E_XL_DataAry

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

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

Public Enum E_XL_DataAry
    
    SheetNameCol = 0
    CellAddressCol = 1
    ValueCol = 2

End Enum


Public Function CalculateByExcel(file_name As String, DataToPutAry As Variant, DataToGetAry As Variant) As Variant
    
    Dim xl As Object, wb As Object, ws As Object, I As Integer
    'open the xl
    Set xl = CreateObject("Excel.Application")
    xl.Visible = False
    Set wb = xl.Workbooks.Open(file_name, 2, True)
    
    If (Not IsArrayAllocated(DataToPutAry)) Or (Not IsArrayAllocated(DataToGetAry)) Then GoTo Err_Handel
    
    'Put Data into cells
    For I = LBound(DataToPutAry) To UBound(DataToPutAry)
            wb.Worksheets(DataToPutAry(I, E_XL_DataAry.SheetNameCol)).range(DataToPutAry(I, E_XL_DataAry.CellAddressCol)).Value = DataToPutAry(I, E_XL_DataAry.ValueCol)
    Next I
    
    For I = LBound(DataToGetAry) To UBound(DataToGetAry)
            DataToGetAry(I, E_XL_DataAry.ValueCol) = wb.Worksheets(DataToGetAry(I, E_XL_DataAry.SheetNameCol)).range(DataToGetAry(I, E_XL_DataAry.CellAddressCol)).Value
    Next I
     
    CalculateByExcel = DataToGetAry
     
    wb.Close False ' close the source workbook without saving any changes
    Set wb = Nothing
    xl.Quit
    Set xl = Nothing

Exit_Func:
    Exit Function


Err_Handel:
    CalculateByExcel = False
    Resume Exit_Func
    
End Function

דוגמא לשימוש פשוט – כאשר מוחזר רק תא אחד בודד


Sub TryIt()
Dim x As Variant, a As Variant, b As Variant
ReDim a(0, 3)
a(0, 0) = "Sheet1"
a(0, 1) = "A1"
a(0, 2) = "1"
ReDim b(0, 3)
b(0, 0) = "Sheet1"
b(0, 1) = "A2"


x = CalculateByExcel("YourXLFile.xlsx", a, b)
Debug.Print x(0, 2)

End Sub

ודוגמא לשימוש מורכב יותר, כאשר מוחזר טווח של 2 תאים לדוגמא


Dim x As Variant, a As Variant, b As Variant
ReDim a(0, 3)
a(0, 0) = "Sheet1"
a(0, 1) = "A1"
a(0, 2) = "1"
ReDim b(0, 3)
b(0, 0) = "Sheet1"
b(0, 1) = "A2:A3"


x = CalculateByExcel("YourXLFile.xlsx", a, b)
Debug.Print x(0, 2)(1,1)

End Sub

בהצלחה!

המתנה ב-ACCESS VBA באמצעות WINDOWS API

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

להלן קוד.

#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If


Sub SleepVBA(ms As Integer)
'ms = milisecondes
Sleep ms
End Sub

העברת ADO RECORDSET אל מערך ב-VBA

קורה לפעמים שעדיף לרוץ על מערך בזיכרון מאשר על רקורדסט – זה הרבה הרבה יותר מהיר

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


Public Function RecordsetToArray(ByRef rs As Object) As Variant
    Dim tmp As Variant, cols_num As Integer, K As Integer, rows_num As Integer, J As Integer
    
    If Not (rs.EOF And rs.BOF) Then
    
        rs.MoveFirst
        cols_num = rs.fields.Count
        rows_num = rs.RecordCount
        
        ReDim tmp(rows_num, cols_num)
            
            J = 0
            Do While Not rs.EOF
                For K = 0 To cols_num - 1
                      tmp(J, K) = Nz(rs.fields(K).Value, "")
                Next K
                J = J + 1
                rs.MoveNext
            Loop
    
    Else
        tmp = Array("")
    
    End If
    
    RecordsetToArray = tmp
    
End Function