איתור מיקוד מקוון

הנושא בפורום 'פורום תוכנות מייקרוסופט אופיס' פורסם ע"י סבתא111, ‏12/4/16.

  1. סבתא111

    סבתא111 משתמש רשום

    הצטרף:
    ‏6/10/14
    הודעות:
    251
    לייקים:
    6
    נקודות:
    19
    יצרתי פונקציה המאתרת מיקוד מקוון לאתר דואר ישראל.

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

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

    קבצים מצורפים:

  2. moishy

    moishy משתמש מקצוען

    הצטרף:
    ‏26/12/11
    הודעות:
    1,453
    לייקים:
    134
    נקודות:
    74
    עיסוק:
    יועץ נישואין, מדריך חתנים
    מיקום:
    רכסים
    תודה על השיתוף.
    וכעת להערות :)

    ראשית כמה הערות כלליות שלא קשורות דוקא (אבל בהחלט גם) לקובץ המוכחי שהעלת:

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

    2. כדאי מאוד לשמור על מוסכמות למתן שמות לאובייקטים ופקדים. לא חשוב כ"כ מה הסגנון, אתה יכול אפי' לפתח סגנון משלך (אם כי לדעתי מומלץ להיצמד לקיים כדי האחרים יבינו את הקוד שלך) אבל חשוב שהוא יהיה עקבי. דבר זה עוזר לקורא להבין את הלוגיקה והזרימה של האלגוריתם, וגם מונע טעויות טפשיות רבות. הנה כמה קישורים העוסקים בנושא:
    https://msdn.microsoft.com/en-us/library/aa263493(v=vs.60).aspx
    https://en.wikipedia.org/wiki/Leszynski_naming_convention
    http://ss64.com/access/syntax-naming-variables.html
    http://www.xoc.net/standards/rvbanc.asp#Access

    3. יש להקפיד על הצהרת משתנים. זה טוב לביצועים (משתנה שלא הוצהר הוא מסוג variant) שצורך יותר זכרון ואיטי יותר בביצועים, וגם מונע טעויות טפשיות רבות. ע"מ להכריח הצהרת משתנים (מומלץ בחום), בראש כל מודול יש להוסיף את צמד המילים Option Explicit. ניתן לשנות הגדרה בVBE כדי שזה יקרה אוטומטית (בתוך הVBE מתפריט tools>>options לוודא ש require variable declaration מסומן).

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

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

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

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

    1. עובדתית, ברוב המקרים שניסיתי את הדוגמא שלך, המיקוד לא הוחזר נכון, השורה mikud = Mid(mikud, 49, 8) לא עושה את מה שציפית. (מה עוד שהמיקוד אמור להיות 7 ספרות ואילו כאן אתה מחזיר 8 תוים). לדעתי הפונקציה הבאה היא הדרך הכי קלה ונקיה להוציא את המיקוד מהHTML:
    קוד:
    Function fGetZip(strResponse As String) As String
        With CreateObject("VBScript.RegExp")
            .Pattern = "RES[0-9]+"
            If .Test(strResponse) Then
                fGetZip = Right(.Execute(strResponse)(0), 7)
            End If
        End With
    End Function
    2. לאיחזור הHTML בחרת להשתמש עם האינטרנט אקספלורר (MSXML2.XMLHTTP), החסרונות בזה הם כדלהלן:
    א. לא לכל מחשב יש אינטרנט אקספלורר
    ב. הקוד צריך להמתין לטעינת הדף ולאחר מכן לבדוק את הסטטוס.
    הייתי ממליץ במקום זה להשתמש עם האפשרות המובנה בתוך וינדוס, הנה דוגמא:
    קוד:
        Dim objHttpRequest As Object
        Dim strResponse As String
    
        Set objHttpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
        
        objHttpRequest.Open "GET", strUrl
        objHttpRequest.Send
        
        strResponse = oHttpRequest.responseText
    
        Set objHttpRequest = Nothing
    אגב, שים לב למרווחים בין השורות, הם לא מקריים, הם מחלקים בין קבוצות הפעולות.

    ושוב לסיום, תודה על השיתוף.
     
  3. סבתא111

    סבתא111 משתמש רשום

    הצטרף:
    ‏6/10/14
    הודעות:
    251
    לייקים:
    6
    נקודות:
    19
    1. תודה רבה לmoishy על ההערות! ההערות שלך בונות את כולנו!!
    2. לגבי הערה 6, שאלה: בקוד ארוך, שמשתמשים בו עם עשרות משתנים, ובתחילת הקוד יש תנאי שברוב המקרים משמש ליציאה מהקוד. האם כדאי להצהיר על המשתנים רק אחרי התנאי? או שעדיין הכלל הוא "הצהרה בראש הקוד".
    3. לגבי השדה כניסה: בניסיונות שעשיתי הוא החזיר מיקוד לא נכון, ולכן השמטתי אותו.
    4. הפונקציה fGetZip שהבאת ממש מדהימה. היכן ניתן לקרוא על הפונקציות השונות של VBScript.RegExp?
    5. את כולנו מעניין ללמוד יותר, למשל בפונקציה CreateObject בתגובה שלך יצרת שני אובייקטים מעניינים. האם יש למישהו חומר למידה על הפונקציות השונות, בעיקר הנעלמות? כמו"כ, יש הרבה קודים שמשתמשים עם הספריות kernel32 ו- user32, היכן ניתן ללמוד על הפונקציות שבהם?

    ושוב תודה רבה על ההערות ועל העזרה הרבה.

    אההםםם, עוד משהו, אולי מתאים לפתוח בשבילו אשכול חדש... האם יש דרך לשלוח פקודות API בטכנולוגיית POST ע"י VBA?
     
  4. סבתא111

    סבתא111 משתמש רשום

    הצטרף:
    ‏6/10/14
    הודעות:
    251
    לייקים:
    6
    נקודות:
    19
    ו.. תודה על הכלי של ההזחה (indentation), הוא עובד מדהים, באמת לא מבין כיצד הסתדרתי בלעדיו!
     
  5. moishy

    moishy משתמש מקצוען

    הצטרף:
    ‏26/12/11
    הודעות:
    1,453
    לייקים:
    134
    נקודות:
    74
    עיסוק:
    יועץ נישואין, מדריך חתנים
    מיקום:
    רכסים
    חד משמעית, כן. מהסיבות שכתבתי.

    זה רק הוכחה שהקוד שלך לא פועל כראוי ;)

    גוגל...

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

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

    קבצים מצורפים:

  6. 957

    957 משתמש רשום

    הצטרף:
    ‏6/2/16
    הודעות:
    224
    לייקים:
    7
    נקודות:
    19
    עיסוק:
    טכנאי מחשבים ורשתות
    דיון פורה ומענין moishy התגובות שלך בהחלט מעשירות תודה רבה אין עליך תותח,

    גם הנושא שסבתא111 העלה בעניין פקודות API בטכנולוגיית POST ע"י VBA נשמע מעניין לגמרי.
    תותחים
     
  7. סבתא111

    סבתא111 משתמש רשום

    הצטרף:
    ‏6/10/14
    הודעות:
    251
    לייקים:
    6
    נקודות:
    19
    בהחלט דיון פורה ומעשיר את הידע.
    מצו"ב קובץ משודרג, עם פונקציה שפועלת בשאילתות, וכן באקסל!

    1. את האמן גוגל אני מכיר... הוא מגלה לי הרבה סודות, אם כי אפשר לטבוע בים החומר שיש בו, וכן לפעמים חסום לי :eek:... אם יש לינקים מפורשים, אפשר לארגן פתרון...
    2. לגבי הAPI, תוכל להעלות דוגמא? כשיתאפשר לך.
     

    קבצים מצורפים:

    A052 אוהב/ת את זה.
  8. moishy

    moishy משתמש מקצוען

    הצטרף:
    ‏26/12/11
    הודעות:
    1,453
    לייקים:
    134
    נקודות:
    74
    עיסוק:
    יועץ נישואין, מדריך חתנים
    מיקום:
    רכסים
    נושא חדש, אשכול חדש...
    תכתוב גם לאיזה API אתה מתכוון.
     
  9. מורדי

    מורדי משתמש רשום

    הצטרף:
    ‏23/5/10
    הודעות:
    117
    לייקים:
    16
    נקודות:
    19
    לא הצלחתי להבין איך מתקינים את זה (אופיס 2010), והאם זה מתלבש על האופיס, ומזיח תוך כדי כתיבה, או שצריך להעתיק לזה את הקוד שכתבתי וזה מסדר אותו.
     
  10. moishy

    moishy משתמש מקצוען

    הצטרף:
    ‏26/12/11
    הודעות:
    1,453
    לייקים:
    134
    נקודות:
    74
    עיסוק:
    יועץ נישואין, מדריך חתנים
    מיקום:
    רכסים
  11. מורדי

    מורדי משתמש רשום

    הצטרף:
    ‏23/5/10
    הודעות:
    117
    לייקים:
    16
    נקודות:
    19
  12. moishy

    moishy משתמש מקצוען

    הצטרף:
    ‏26/12/11
    הודעות:
    1,453
    לייקים:
    134
    נקודות:
    74
    עיסוק:
    יועץ נישואין, מדריך חתנים
    מיקום:
    רכסים
    הכל כתוב שם