שאלה נוספת באקסל...

צבתות

New member
שאלה נוספת באקסל...

איך אני משתמש בפונקציה Range ב-VB כך שאוכל להכניס משתנים? אפשר לראות בקובץ שצרפתי בהודעותי הקודמות, שישנה פקודת מאקרו ששמה "הוסף_רשומה", והיא למעשה לוקחת את השורה האחרונה בטבלה ומוסיפה אותה בסוף. אני רוצה לעשות גם שאותה פקודת מאקרו תנקה את התוכן מהשורה החדשה שנוצרה, על מנת שתהיה פנויה להכנסת נתונים חדשים. כשהקלטתי פקודה כזו, ראיתי שאקסל עושה זאת עם range, אבל הוא מציין אילו תאים range (B5:p5) וניסיתי לשים שם משתנים ולא הצלחתי. יש לי משתנה שנקרא empty_row, וזה למעשה מספר השורה שאותה יש לנקות, החל מטור B עד P. איך עושים זאת?
 

AO

New member
cells שוב

Range(Cells(5, 2), Cells(5, 16)).Select תחליף את הסיפרה 5 במשתנה שלך. אלון
 

צבתות

New member
אלון, שאלה נוספת..

יצרתי מאקרו שתפקידו לצאת מהספריה הקיימת, ליצור ספריה חדשה ששמה הוא משתנה מסוג מחרוזת, ולשמור את הקובץ בספריה שנוצרה. אני משתמש בפקודה chdir. הבעיה היא שלצאת מהספריה הקיימת אני מצליח, אבל chdir לא מוכן לקבל את המחרוזת כדי ליצור ספריה. אני מצרף קובץ. פקודת המאקרו המדוברת נקראת "הוסף_שנה". טוב, לא הצלחתי לצרף כי הקובץ גדול מידי. אני כותב פה את הקוד ששמתי, נקווה שיצא טוב: Sub פתח_שנה() Dim year As String Dim last_year As String last_year = Cells(4, 2) year = Cells(22, 9) ´ הקטע הבא פותח ספריה חדשה בשם השנה ושומר את הקובץ כינואר -01: ChDir "../" ChDir year ActiveWorkbook.SaveAs Filename:= _ "ינואר - 01.xls", FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False ´השורות הבאות מנקות את תוכן התאים עבור הקובץ החדש ActiveWindow.ScrollWorkbookTabs Position:=xlLast Sheets(Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", _ "16", "17", "18", "19", "20", "21", "22", "23", "24", "25")).Select Sheets("1").Activate Sheets(Array("26", "27", "28", "29", "30", "31")).Select Replace:=False Union(Range( _ "M7,H8:I8,J8,K8:L8,M8,H9:I9,J9,N9:O9,P9,H10:I10,J10,N10:O10,P10,H11:I11,J11,N11:O11,P11,E12:F12,G12,K12:L12,M12,Q12:R12,S12,E13:F13,G13,K13:L13,M13,Q13:R13,S13,E14:F14,G14,B15:D15" _ ), Range( _ "E15:F15,G15,B16:D16,E16:F16,G16,E17:F17,G17,H17:I17,J17,K17:L17,M17,N17:O17,P17,Q17:R17,S17,E18:S18,C4:D4,F4:G4,I4:J4,L4:M4,O4:p4,R4:S4,B5:C5,E5:F5,H5:I5,D5,G5,J5,L5:M5,N5:O5,P5,Q5:R5" _ ), Range( _ "S5,B6:C6,D6,E6:F6,G6,H6:I6,J6,K6:L6,M6,Q6:R6,S6,B7:C7,D7,H7:I7,J7,K7:L7")). _ Select Range("E18").Activate ActiveWindow.ScrollRow = 12 Union(Range( _ "M7,H8:I8,J8,K8:L8,M8,H9:I9,J9,N9:O9,P9,H10:I10,J10,N10:O10,P10,H11:I11,J11,N11:O11,P11,E12:F12,G12,K12:L12,M12,Q12:R12,S12,E13:F13,G13,K13:L13,M13,Q13:R13,S13,E14:F14,G14,B15:D15" _ ), Range( _ "E15:F15,G15,B16:D16,E16:F16,G16,E17:F17,G17,H17:I17,J17,K17:L17,M17,N17:O17,P17,Q17:R17,S17,E18:S18,B19:S19,B20:S20,C4:D4,F4:G4,I4:J4,L4:M4,O4:p4,R4:S4,B5:C5,E5:F5,H5:I5,D5,G5,J5,L5:M5,N5:O5" _ ), Range( _ "P5,Q5:R5,S5,B6:C6,D6,E6:F6,G6,H6:I6,J6,K6:L6,M6,Q6:R6,S6,B7:C7,D7,H7:I7,J7,K7:L7" _ )).Select Range("B20").Activate ActiveWindow.ScrollRow = 1 Selection.ClearContents ´ גורם לבחירה בגליון הראשי והכנסת החודש כמחרוזת: Sheets("ראשי").Select Cells(4, 3).Select ActiveCell.FormulaR1C1 = "01" End Sub
 

צבתות

New member
range(cells לא עבד לי...

עשיתי ככה: Range(Cells(empty_row, 2), Cells(empty_row, 3), Cells(empty_row, 4)).Select Selection.ClearContents VB מציג לי שגיאה ב-range, מה הבעיה?
 

AO

New member
CELLS אחד מיותר

בתוך RANGE צריך להיות פעמיים CELLS אחד מתיחס לתא הראשון בטווחהשני מתיחס לתא האחרון בטווח (בינהם פסיק) לך יש באמצע CELLS אחד מיותר. אלון
 

צבתות

New member
וואלה...

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

AO

New member
השאלות קצת ארוכות

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

צבתות

New member
מממ...

אני מקווה שתוכל לענות לי. השאלה עם ה-chdir אולי ניראית ארוכה בגלל כל מה שצירפתי שם, אבל למעשה הייתי יכול לצרף רק שורה אחת שלא עובדת. או שניים בעצם: Dim year As String ChDir year זהו. חשבתי שזה יעבוד כי כשהקלטתי מאקרו קיבלתי משהו כזה: ChDir "C:\dir" אבל זה לא עובד. ובאשר לפתרון שלך, יש משהו שאפשר לעשות. הבעיה היחידה היא, ששמות האנשים היא רשימה שמשתנה. אחרת, הייתי יוצר טבלה ליד טבלת המשמרות שמשווה כל תא עם השם. ובעיה נוספת היא חצאי משמרות. כשמישהו עושה משמרת פשוט רושמים את שמו. כששני אנשים עושים כל אחד חצי משמרת, אז זה נרשם ככה: "שם1/שם2". אם יש פקודה באקסל שיכולה לברר אם מופיע "/" בתא, ולהפריד בין שתי השמות זה פשוט. אם לא, אני מניח שאין מנוס ממאקרו ארוך ותובעני (מבחינת זמן ריצה. הטבלאות גדולות...).
 

AO

New member
אז ככה

בקשר להחלפת ספריה תנסה להוסיף ChDrive "c:\" בקשר להפרדת שמות תנסה נוסחה כמו בקובץ המצורף אלון
 

AO

New member
ועוד משהו בקשר להחלפת ספריה

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

צבתות

New member
מממ....

ניסיתי עם chdrive, זה לא עבד. וכשניסיתי את הנטיב המלא, גם לא הלך. גם בלי משתנה. פשוט כתבתי: chdir "C:\dir" והוא הביא לי שגיאה... מוזר. מה עשיתי לא נכון?
 

צבתות

New member
ניסיתי גם ../images/Emo13.gif

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

תעשה בדיקה כזאת: תעתיק את שם הספריה כפי שאתה רושם במאקרו (ללא המרכאות). לך לכפתור START בחר RUN (התחל>הפעלה) תדביק את שם הספריה ותאשר הפעולה אמורה לפתוח חלון סייר עם הספריה המבוקשת. תספר מה יצא איציק
 
אלון, לא ברור איך הנוסחה עוזרת

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

צבתות

New member
דווקא עוזרת, תראה->

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

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

צבתות

New member
תודה...

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

AO

New member
1,2,3 נסיון

האם הפקודה הזאת (שרשמתי כאן למטה) עובדת אצלך? ChDir "C:\My Documents" כך זה צריך להיות כתוב רק שבמקום MY DOCUMENTS צ"ל הנתיב הנכון. אלון
 
למעלה