@NETZ יש דרך פשוטה בלי קוד,על ידי Word:
- צור טבלה עם עמודה אחת ומספר שורות כרצונך, נגיד 500.
- סמן את כל העמודה הראשונה, ומהתפריט למעלה, הגדר תבנית מספר חדשה:
- תסיר את הנקודה אחרי האות:
ותלחץ אישור. - הרשימה מוכנה, העתק והדבק לאקסל:
@NETZ יש דרך פשוטה בלי קוד,על ידי Word:
@dovid אמר בVLOOKUP עם ערך לחיפוש משתנה, אפשרי בלי IF?:
מה זה התחביר הזה:
(B2=J:J)?
זו נוסחת מערך, פיצ'ר מאוד שימושי שנכנס בשנת 2018.
הרעיון הוא שנוסחא יכולה מעתה להחזיר מערך של תוצאות, ולא רק ערך יחיד.
הנוסחה המסויימת הזו היא להשוואה של B2
מול כל העמודה J
. הערך שיוחזר הוא מערך בוליאני של השוואת B2
מול כל ערך בעמודה J
.
במקרה הזה הנוסחא לא כ"כ יעילה, כי לא צריך להשוות ממש את כל העמודה, אלא רק את 5 התאים בעלי הערך. אבל קיצרתי כדי שיהיה מובן. יותר טוב לכתוב כך:
B2=J2:J6
וכן הלאה.
בגרסאות הראשונות של נוסחאות המערך, היה צורך להקליד אותן בצורה מתוסבכת עם Shift+Enter
כמו שציין @Y-Excel-Access, והן הופיעו בשורת הנוסחא עם סוגריים מסולסלות. כיום אקסל חוסך מאיתנו את כאב הראש הזה ואפשר להקליד כמו נוסחא רגילה.
תוכל לנסות על ידי הקלדה של הנוסחא B2=J2:J6
בתוך תא כלשהו (מחוץ לטבלה) ולראות שמתקבל מערך בוליאני.
@Sfsf3925 אפשר לחפש על ידי MATCH
בכל עמודה, ולצרף את מערכי התוצאות. לדוגמא:
הנוסחא בתא G2
היא:
=IFERROR(INDEX(K:K,MATCH(1,(B2=J:J)+(C2=J:J)+(D2=J:J)+(E2=J:J),0)),"אין תוצאה")
הסבר:
INDEX
מאחזר ערך מתוך עמודה לפי אינדקס.MATCH
מחזיר את אינדקס הערך המבוקש בטווח.1
(כפי שיוסבר מיד). הטווח כאן הוא חיבור של טווחים (מערכים בוליאנים), שמתקבלים על ידי השוואת העמודה של הטלפונים J:J
עם מספר מסויים, כאשר B2
הוא המספר הראשון, C2
הוא המספר השני וכו'.1
.{0,0,1,0,0,0}
(יש 6 איברים כי לא התעלמתי משורת הכותרת)
ולכן הנוסחא MATCH(1,{0,0,1,0,0,0},0)
תחזיר את הערך 3 לפונקציה INDEX
, מה שיגרום לה לרוץ כך:
INDEX(K:K,3)
ולהחזיר את הערך: 1000
.
כדי שנוכל להדפיס את הקבלות שיצרנו, אנו צריכים ליצור דוח.
באופן עקרוני, דוח באקסס מאוד דומה לטופס:
היתרון הגדול ביצירת דוח הוא היכולת להציג נתונים בצורה נוחה להדפסה.
אז בואו וניצור את הדוח הראשון שלנו: דוח עבור קבלות לתורמים.
נחשוב:
אילו נתונים צריכים להופיע על הקבלה?
מסתמא נרצה את כל הנתונים שבטבלת הקבלות, אך חסרים שם הרבה פרטים, כמו סכום ותאריך התרומה, ושם התורם והכתובת שלו.
למעשה, אין לנו שדה כתובת בטבלת התורמים עדיין, אז בואו ניצור אחד כזה:
כדי להציג את כל פרטי הקבלה, ניצור שאילתת צירוף.
שלב א: יצירת שאילתת צירוף להצגת פרטי הקבלה
ניצור שאילתה חדשה, ונוסיף את שלושת הטבלאות: קבלות, תרומות, ותורמים, למשטח העבודה, אקסס תזהה את הצירוף בין הטבלאות לפי מה שהגדרנו ביחסי הגומלין:
נבחר להציג את השדות הבאים:
הממ... עדיין חסר לי את שדה שם התורם.
אני יכול להציג את שם המשפחה ואת השם הפרטי בנפרד, אבל אני רוצה כמובן להציג את שם התורם המלא.
לא בעיה!
אני יכול ליצור שדה מחושב FullName שמחבר את השם הפרטי ושם המשפחה של התורם.
אבל רגע, זה נשמע לי מוכר...
יש לי כבר שאילתה שעושה זאת: qryDonor_FullName.
במקום ליצור שוב שדה מחושב, בואו ונשתמש בה.
למה?
עיקרון ה-DRY
לפני כעשרים שנה, פירסמו שני מתכנתים אמריקאים את העיקרון הבא בתכנון מערכות:
Don't Repeat Yourself (אל תחזור על עצמך) או בקיצור DRY. הנוסח הרשמי לעיקרון זה הוא:
לכל פיסת ידע צריך להיות ייצוג יחיד, חד משמעי וסמכותי במערכת.
במילים פשוטות, זה אומר שלא נשכפל שום חלק במערכת אלא אם כן הדבר הכרחי.
עקרון זה נועד כדי להפחית כפילויות מיוצרות במערכת, ועל ידי כך ליצור מערכת קלה לתחזוקה, כי שינוי של גורם יחיד במערכת לא יאלץ שינויים נוספים בגורמים אחרים שאינם קשורים אליו לוגית.
ניקח לדוגמא את המקרה שלנו:
כרגע, שם התורם המלא מוצג לפי הסדר הבא: שם משפחה + רווח + שם התורם. נניח שבעוד שנה ירצה בעל הבית להציג את שמות התורמים המלאים בסדר הפוך, דהיינו במקום כהן אברהם – אברהם כהן וכו'.
אם הרכבת השם המלא של התורם מבוצעת רק במקום יחיד במערכת, דהיינו בשאילתה הנ"ל, כל שעלינו לעשות הוא לשנות את הגדרת השדה המחושב שם – והשינוי ישתקף בכל מקום במערכת.
אבל, אם בכל פעם יצרנו שוב את השדה המחושב מחדש – זה הופך לעבודת נמלים מייגעת...
אז יופי, בואו ונוסיף גם את השאילתה למשטח העבודה, והופ – נראה שהפעם אקסס לא הייתה כל כך מבריקה, והחליטה לצרף את השדה ID מטבלת התרומות לשדה ID בשאילתה, כפי שמוצג בדרמטיות בתמונה הבאה:
מדוע זה קרה?
אקסס זיהתה את שם השדה ID הזהה בשתי מקורות הנתונים, והחליטה "לעזור לנו" על ידי יצירת הצירוף עבורנו. אבל זה כמובן לא נכון!
אם היינו קוראים לשדה המפתח בכל טבלה בשם מלא, כפי שנהגנו במפתח הזר, למשל DonationID במקום ID בטבלת התרומות, או DonorID במקום ID בטבלת התורמים וכו', המנגנון של אקסס אכן היה עוזר לנו.
זו אכן סכמה נפוצה, ובאמת בתחילת דרכי כך נהגתי, אבל היא פחות מקובלת, ובקוד היא נעשית מסורבלת עוד יותר, כי ניגשים לשדה המזהה כך: Donor.DonorID במקום כך: Donor.ID.
לכן אני מעדיף לוותר על העזרה של אקסס כאן, וליצור ידנית את הצירוף, תמורת הרווח של קוד ושאילתות יותר קריאים.
בואו נתקן את הצירוף:
נבחר את החץ ונמחק אותו על ידי הקשה על מקש Delete, ובמקום, נגרור את שדה ID מטבלת התורמים לשדה ID בשאילתת השם המלא, כך:
כעת נוסיף גם את השדה FullName לחגיגה:
נעבור לתצוגת גליון נתונים כדי לראות שהכל תקין. על הדרך, בואו נוסיף עוד הודעות אישיות לתרומות של כהן אברהם:
נשמור את השאילתה בשם: qryReceipt_Details (=פרטי קבלה)
כעת ניתן סוף סוף לעבור לשלב יצירת הדוח.
שלב ב: יצירת דוח עבור הקבלה
בחרו מתפריט היצירה > עיצוב דוח:
אקסס תייצר עבורנו דוח ריק. שימו לב שהדוח מחולק לשלושה אזורים:
ישנם עוד חלקים נוספים שאפשר לערוך בדוח, כפי שנראה אי"ה בהמשך.
כדי שהטופס יציג לנו את נתוני הקבלות, צריך לאגד אותו לשאילתה שיצרנו. לשם כך נבחר בפקד הדוח, על ידי לחיצה על הפינה השמאלית העליונה (בדומה לפקד טופס, זהו הפקד שנבחר אוטומטית בתצוגת עיצוב):
כעת נלחץ על מקש F4 כדי להציג את חלונית המאפיינים, ניגש לכרטיסית הנתונים, ובמאפיין מקור רשומה נבחר את שאילתת פרטי הקבלות qryReceipt_Details:
נבחר מהתפריט למעלה את האפשרות: הוסף שדות קיימים כדי להציג את השדות שנמצאים בטבלה:
נבחר את כל השדות ונגרור אותם לתוך חלק הפירוט של הטופס:
נעצב את הדוח כיד הדמיון הטובה עלינו:
כשסיימנו, נבחר מתפריט העיצוב את התצוגה: הצג לפני הדפסה:
כדי לראות את התוצאה:
שימו לב כי בתצוגה זו מוצגת בכל עמוד קבלה אחת בלבד. כדי לעבור לעמוד הבא, נשתמש בסרגל הניווט למטה:
נשמור את הדוח בשם: rptReciept_Details.
זהו לבינתיים, מקווה שנהנתם!
בפרק הבא אי"ה נלמד על טפסים רציפים.
אני משאיר כמה שיעורי בית, בעיקר בעיצוב (מהקל למאתגר):
בהצלחה!
@בערל אמר באקסס למתחילים: תגובות:
למדת הוראה?
עלית עלי... אני עוסק בהוראה כבר הרבה שנים.
אני קורא כל מילה - ומבצע
זה מאד חשוב לבצע בשטח, רק ככה לומדים באמת!
@Sofer מצטרף לכל האמור לעיל, ומוסיף שלענ"ד הדרישה שלך: "עדיף בבית או באופן עצמאי", מגבילה אותך מאוד. למרות שלמידה עצמית מאוד נפוצה ומקובלת בתחום התכנות, אבל בגלל שבטכנאות יש צד טכני של עבודה בידיים ממש, אין לזה תחליף וירטואלי.
גם אני התחלתי ללמוד טכנאות לבד מפה ומשם, וכמובן שהמחשב האישי שלי שימש בעל כרחו בתור שפן ניסיונות, אבל הלמידה העיקרית שלי באופן אישי היתה ע"י שעבדתי כמה חודשים במעבדת מחשבים, בתור שוליית הטכנאי. אמנם לא היה בזה שכר גבוה, אבל היה לזה ערך משמעותי מבחינת ניסיון.
אגב, לא חושב שזה אמור להרתיע את המעסיק שמא יקום להם מתחרה, אם תתנהג בהגינות ובהכרת הטוב. ידי הטכנאים די עמוסות בלאו הכי. היום אני שולח חלק מהעבודות שבאות אלי אל טכנאי אחר באיזור כשאני עמוס, ושנינו מרוצים.
שלום לכולם,
כידוע, מיקרוסופט מזניחה כבר שנים את עורך ה-VBA ולא הכניסה בממשק שלו שום שדרוגים (אולי היא מצפה מאיתנו להזניח אותו גם?)
למרות העובדה שגם היום ישנם הרבה שמשתמשים בו כדי להוסיף פונקציונאליות קוד ליישומי אופיס - העורך עדיין תקוע בעיצוב מלפני 10 שנים+! באפשרויות של הגדרות הצבעים ישנם רק 16 צבעים לבחירה, ואין אפשרות להוסיף צבעים אחרים (אוף!)
ובתור אחד שעובד מאסיבית באקסס (רח"ל ) הדבר מפריע לי מאד...
מצאתי פרוייקט בגיטהב שמאפשר להפוך את המראה המזעזע של עורך ה-VBA באופיס למראה יותר מודרני, בדומה לערכת הנושא הכהה של VS, על ידי עריכת פלטת הצבעים המקורית שנמצאת בקובץ VBA7.1.DLL. אחרי ששיחקתי עם התוכנה קצת, יצרתי ערכת נושא שמתאימה ל-VS2019 פחות או יותר, להלן דוגמא:
וזה אכן שיפור גדול, אבל הלכתי עוד צעד קדימה והחלפתי את הפונט לפונט Consolas גודל 13 כמו ב-VS, אבל אז כל העברית הפכה לג'יבריש:
לאחר התקנת הפונט הערוך ConsolasH.ttf שמכיר בעברית כשפה מקובלת - הגעתי אל המנוחה והנחלה:
למי שרוצה לנסות, מצ"ב קובץ ערכת נושא שיצרתי: VS2019 Dark.xml
שימו לב שצריך גם לשנות קצת את הבחירות בעורך ה-VBE, מי שרוצה פתרון קל, מצ"ב קובץ Reg (על אחריותכם) שמעדכן את הבחירה של הצבעים וגם את הפונט: VBE 7.0 Color Settings.reg
הייתי רוצה לסיים בסוף טוב, אבל...
מסתבר שמדי פעם מיקרוסופט חושבים עלינו ושולחים עדכונים לאופיס, ועורך ה-VBE חוזר לסורו (בערך...) ונהיה אפילו יותר גרוע (אזהרה: לא מומלץ לחולי אפילפסיה)
כמו שרואים, הפונט נשאר וגם הגדרות הצבעים, אבל פלטת הצבעים (שנמצאת ב-DLL כאמור לעיל) התאפסה ואני צריך לחזור על הגדרות הצבעים מחדש...
עשיתי זאת כמה פעמים עד שנמאס לי, ומצאתי פתרון אחר: יש לי עותק של קובץ ה-DLL הערוך, וכשזה קורה אני פשוט משכתב את הקובץ הקיים עם הקובץ השמור, והעורך חוזר למצב הראוי. אבל זה גם לא מושלם, אולי מיקרוסופט יחליטו לעדכן את ה-DLL באופן משמעותי, ושכתוב שלו עם הקובץ הקודם יצור בעיות חדשות....
@אליהו-בן השאלה שלך סיקרנה אותי לחפור קצת בנידון.
כנראה שהאובייקט של MSXML2.XMLHTTP
מפעיל מנגנון מטמון של הבקשות והתגובות, מה שמסביר את התופעה לעיל בדיוק, כי כל מופע של אקסס משוייך לאותו סשן על ידי המערכת.
יש כמה הצעות לפיתרון, מהקל לכבד:
Set xhrRequest = CreateObject("MSXML2.XMLHTTP.6.0")
xhrRequest.setRequestHeader "pragma", "no-cache"
xhrRequest.setRequestHeader "Cache-Control", "no-cache, no-store"
Do Until order.EOF
...
WinHttp.WinHttpRequest.5.1
, שלא משתמש במטמון. שמות המתודות הנדרשות בו זהים לשמות שבאובייקט MSXML2.XMLHTTP.6.0
, דהיינו:Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
Do Until order.EOF
'Url = "XXXXXXXXX?
httpRequest.Open "GET", url, False
httpRequest.Send
res = httpRequest.responseText
' תריץ את הפקודה הזו פעם אחת בתחילת ההפעלה של התוכנה שלך
Randomize
...
' ואז בקוד של השליחה
' יצירת מספר מ-1 עד 100000
Dim dummyNumber As Long
dummyNumber = Int((99999) * Rnd) + 1
' הוספת הפרמטר לבקשה
xhrRequest.Open "GET", url, False & "&dummy=" & dummyNumber
Public Declare PtrSafe Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer
Public Sub ClearInternetCache()
InternetSetOptionStr 0, 42, 0, 0
End Sub
ובקוד של השליחה תקרא למתודה שיצרת לעיל, לפני השליחה:
ClearInternetCache
Set xhrRequest = CreateObject("MSXML2.XMLHTTP.6.0")
...
אני מציע שתנסה את הדרכים לעיל לפי הסדר, כי הראשונות עדיפות על האחרונות, ותעדכן אם הבעיה נפתרה ובאיזו דרך. בהצלחה!
ליתר דיוק עד 24 ביולי 11:59PM EST
35 קורסים
לכניסה: https://www.vuemastery.com/free-weekend
@dovid אמר במחפש מידע על המבנה של קבצי mp3:
אז בנוסף לכל אתה גם משופשף פוליטית...
חס וחלילה, אני פשוט לא יודע איך להגיב בלי שזה ישמע משופשף פוליטית..
@אביחיל כאחד שעובר ומתמודד עם התהליך של הלמידה באופן מתמיד, כבר כמה שנים טובות, (וכנראה עוד הרבה בעתיד...) תרשה לי להוסיף את התובנות שלי:
אני לא הבנתי בדיוק את כוונתך בחברותא.
אם כוונתך לחברותא שתלמד ביחד איתך, זה נהדר לחלק של התירגול, זה מדרבן ומעודד, ומקל מאוד. אבל -
אני לא הייתי מוותר על מדריך טוב, גם בתשלום.
הערך של מדריך \ מורה טוב - הוא עצום, כי יש בו את הדבר הכי חשוב: ניסיון.
הוא יוכל לתת לך את הידע המקצועי ביותר,
וידע לעשות סדר בעניינים,
לקצר את תהליך הלימוד,
לכוון ולהדגיש את העיקר, ולציין מה הטפל,
לתמצת את הענינים בלשון ברורה ומובנת,
להראות היכן המקומות שבהם אתה עלול ליפול,
בקיצור, להוביל אותך בדרך המלך.
יש מדריכים באינטרנט ברמה מצויינת, ובמחיר שווה לכל נפש (אני למדתי JS+Node.js + כל מיני middlewares בקורס שעלה בסה"כ 70 שקל)
ושלא נדבר על החומר שהוא חינמי לגמרי.
אוטודידקטיה זה דבר נפלא, ויש בו סיפוק גדול, אבל ממה נפשך - התבלין הזה נצרך בתחום התכנות בכל מקרה, גם עם מורה טוב.
בהמשך לפוסטים האלו: חידה מתמטית לשמחת החג ולחדד את מוחות הילדים (והמבוגרים) , ו-"חידה מתמטית פשוטה" או "למה אין לי אינטואיציה מתמטית בריאה?", ועקב הדיון המעניין שהתעורר בעקבותיהם לגבי אינטואיציה ושימת לב לפרטים, אני רוצה לשתף כאן עוד חידה ותיקה:
שלושה חברים ישבו במסעדה. בסיום הסעודה הגיש להם המלצר חשבון על סך 300 שקלים.
כל אחד מהחברים הוציא שטר של 100 שקלים ושילם למלצר.
לאחר שתי דקות חזר המלצר והתנצל:
"אבקש את סליחתכם, נפלה טעות בחשבון, ובאמת הסכום לתשלום הוא רק 250 שקלים", והגיש להם את העודף: 50 שקלים.
כל אחד מהחברים לקח מטבע של 10 שקלים, ואת העשרים הנותרים מסרו למלצר בתור טיפ.
כמה דקות לאחר שיצאו החברים מהמסעדה, פתח אחד מהם ואמר:
"אני לא מבין, לכולנו יחד היה סכום של 300 ש"ח. כל אחד מאיתנו שילם 100 שקלים וקיבל בחזרה 10 שקלים, כלומר כל אחד שילם 90 שקלים. עוד 20 ש"ח שילמנו טיפ למלצר. סה"כ שילמנו כולנו 90X3+20=290 ש"ח. אם כן, להיכן נעלמו עוד 10 שקלים ???".
היכן הטעות בחישוב ולאן נעלם הכסף?
@yossiz אמר:
האם זה התאים לאינטואיציה שלך?
לא.
אם לא, האם תוכל להסביר למה לא?
בדבר המורכב משני חומרים בלבד, כשמשתנה התמהיל ואחוז החומר הראשון (המים) קטן, ברור כי אחוז החומר השני גדל כדי משלים את האחוז ל-100. לכן אם אחוז המים השתנה ב-1 ל-98%, וכן גם אחוז התפו"א גדל ב-1 ל-2%.
עד כאן הכל טוב ויפה. אבל כמו שכתבת בדיוק: האינטואיציה אומרת ששינוי מספרי קטן גורר שינוי קטן בעקבותיו בלי לקחת בחשבון שכמות החומר הכוללת - דהיינו ה-100% - השתנתה דרמטית.
האם תדע לטפל באינטואיציה שלך כך שבפעם הבא יהיה לך אינטואיציה נכונה?
זה עניין של אימון.
אני חושב שאם אדם מתרגל לחשוב שיש דברים מטעים, הוא יהיה יותר זהיר.
אנשים העוסקים בפרסום יודעים בדיוק שכך המוח שלנו עובד, ומוליכים שולל את ההמונים במשך דורות, בדרגה של אומנות...
מסתמא אני לא תמיד אדע להזהר. אבל אני מעדיף לחיות כך ולא לפחד כל הזמן אולי אני טועה.
@פשוט-אבל-תותח אתה צריך לבנות את הבקשה קצת אחרת, ולהפריד את העניינים.
אני לא מנוסה בתחום, אבל הקוד הבא עשוי לעבוד:
function uploadTextFileToYemot(){
var data = {
'token': '0733000000:1234',
'what': 'ivr2:/1/IdListMessage.ini',
'contents': SpreadsheetApp.getActiveSheet().getRange('L1').getValue()
};
var options = {
'method' : 'post',
'payload' : data
};
var response = UrlFetchApp.fetch('https://private.call2all.co.il/ym/api/UploadTextFile', options);
//תוכל גם להציג את התגובה אם תרצה, על ידי השורה הבאה, או לנתח אותה כרצונך
Logger.log(response.getContentText());
}
הערות:
כל התשובות נכונות
@one1010 הבעיה במוצר הסיני היא שהאיכות שלהם גרועה והם נשחקים מהר.
היה לי ארון הזזה עם גלגלים כאלו. כדי לחסוך בעלות, היצרן הרכיב גלגלים סיניים שנשחקו די מהר תוך שנה\שנתיים, והדלת התחילה להחליק מהמסילה.
@חשמל אם אתה לא רוצה לקנות סיני זול ולהחליף אותו כל שנתיים, כנראה תצטרך לקנות את הסוג היקר תוצרת איטליה. בזמנו ביררתי וזוג עלה 180 ש"ח. כעת מצאתי ב-140 ש"ח לזוג כאן.
@shraga כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:
אולי מישהו יתנדב לסדר לך משהו מושלם.
@dovid כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:
את החלק האחרון אני לא יודע בדיוק איך מבצעים.
@Whenever כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:
אני חושב להפוך את סקריפט שימיר CSV לאקסל. זה יהיה לי שימושי.
אחרי ש @mekev עשה עבודה יפה, אני מתנדב בשמחה להוסיף את השיפורים שלי:
סקריפט batch משופר להמרה דו כיוונית (Excel<->Csv):
@echo off
if /i [%2]==[csv] goto TryConvert
if /i [%2]==[xlsx] goto TryConvert
echo Unsupported output format specified: %2
exit /b
:TryConvert
echo Converting file %1 to %2 format, please wait...
cscript /nologo "%~dp0ExcelCsvConvertorScript.vbs" "%~dpnx1" "%~dpn1.%2" %2
echo Done!
סקריפט VB משופר להמרה דו כיוונית:
if WScript.Arguments.Count <> 3 Then
Wscript.Echo "Error: invalid number of arguments specified." & vbNewline
WScript.Echo "Usage: ExcelCsvConvertor <InputFileName> <OutputFileName> <OutputFormat>" & vbNewline
WScript.Echo "Example: ExcelCsvConvertor input.xlsx output.csv csv"
Wscript.Quit
End If
InputFileName = Wscript.Arguments.Item(0)
OutputFileName = WScript.Arguments.Item(1)
OutputFormat = lcase(WScript.Arguments.Item(2))
Select Case OutputFormat
Case "csv"
XlFileFormatValue = 62
Case "xlsx"
XlFileFormatValue = 51
Case Else
Wscript.Echo "Unsupported output format specified: " & OutputFormat
Wscript.Quit
End select
With CreateObject("Excel.Application")
With .Workbooks.Open(InputFileName)
.SaveAs OutputFileName, XlFileFormatValue
.Close False
End With
.Quit
End With
קובץ להתקנה והסרה קלה מתפריט ההקשר (לחצן ימני):
@echo off
set convertor_path=%~dp0ExcelCsvConvertor.cmd
cls
echo ==========================================================================
echo ExcelCsvConvertor: Context menu setup
echo ==========================================================================
echo.
echo [1] Install : Adds "Convert to CSV/Excel" options to context menu
echo [2] Uninstall : Removes "Convert to CSV/Excel" options from context menu
echo [Q] Quit
echo.
choice /C 12Q /T 1000 /D Q /N /M "Please select an option: "
IF [%errorlevel%]==[1] GOTO Install
IF [%errorlevel%]==[2] GOTO Uninstall
exit /b
:Install
echo Installing...
REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV /f /d "Convert to CSV..."
REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV\command /f /d "\"%convertor_path%\" \"%%1\" csv"
REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel /f /d "Convert to Excel..."
REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel\command /f /d "\"%convertor_path%\" \"%%1\" xlsx"
goto Done
:Uninstall
echo Uninstalling...
REG DELETE HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV /f
REG DELETE HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel /f
goto Done
:Done
echo Done!
pause
הערות:
והנה כל החבילה להורדה: (הערה: עיין בהמשך האשכול לגרסה משופרת 0.2)
ExcelCsvConvertor.cmd
ExcelCsvConvertorScript.vbs
Setup (run as Administrator).cmd
@laswater תודה על השיתוף ועל ההשקעה. יש לך התלהבות של מתחילים, ואני מאחל לך שהיא תמשיך להניע אותך ללמוד, לחקור ולהתנסות.
עכשיו תורי להציע אתגר בשבילך: איפה נקודות התורפה של המערכת שבנית? האם ניתן לעקוף את המנגנון הזה? איך?
טוב חבר'ה, בזכות האתגר הזה התחדש לי חידוש נהדר באקסל:
אפשר להגדיר משתנים בתוך נוסחא, על ידי LET
, ולקצר עוד יותר את הנוסחא, כך שיהיה מקום לרפד באפסים.
הנוסחא דלהלן תעבוד על ידי אימות נתונים גם עם תאי מספר רגילים:
=LET(N,REPT(0,9-LEN(A1))&A1,LET(P,"0246813579",MOD(MID(N,1,1)+MID(P,MID(N,2,1)+1,1)+MID(N,3,1)+MID(P,MID(N,4,1)+1,1)+MID(N,5,1)+MID(P,MID(N,6,1)+1,1)+MID(N,7,1)+MID(P,MID(N,8,1)+1,1)+MID(N,9,1),10)=0))
מצורף קובץ משופר: בדיקת תקינות תעודת זהות.xlsx
@אוריי תדביק את הקוד הבא במודול:
Public Sub SplitActiveDocumentBySection()
Dim outputDoc As Document
Dim sectionCount As Integer
Dim currentSection As Section
Dim baseFileName As String
sectionCount = ActiveDocument.Sections.Count
If MsgBox("Would you like to split this document into " & sectionCount & " sections?", vbYesNo) <> vbYes Then Exit Sub
baseFileName = CreateObject("Scripting.FileSystemObject").GetBaseName(ActiveDocument.Name)
For Each currentSection In ActiveDocument.Sections
Application.StatusBar = "Saving section " & currentSection.Index & " of " & sectionCount & "..."
currentSection.Range.Copy
Set outputDoc = Documents.Add(Visible:=False)
outputDoc.Range.Paste
outputDoc.SaveAs ActiveDocument.Path & "\" & baseFileName & "_Section_" & Right$("000" & currentSection.Index, 4) & ".docx"
outputDoc.Close
Next currentSection
Application.StatusBar = "All Done!"
Set outputDoc = Nothing
End Sub