@chagold לפי הספר - אתה צודק לגמרי. כך אמור להיות מבנה טבלת החזרות.
אכן זו הייתה ההתלבטות שלי, ובחרתי באופציה הזו כי היא יותר קלה לתיחזוק (עדכון תאריך חזרה), הואיל ומדובר כאן באקסל.
בהחלט אפשר ליישם בצורה הנ"ל ולאפשר בעז"ה יותר חזרות. הלוואי ויהיה לזה צורך...
OdedDvir
-
-
@פלורידה הואיל ומדובר כאן בטבלאות, התצורה הקלאסית היא לדמות מסד נתונים רלציונאלי, וליצור טבלה לכל ישות במסד.
דהיינו טבלה אחת למסכתות, טבלה אחת לפרקים, וטבלה אחת לתאריכי החזרות.
כל טבלה תכיל את הנתונים הרלוונטים ליישות שלה.
דוגמא:
טבלה א: מסכתות:מזהה שם המסכת 1 ברכות 2 שבת 3 עירובין וכו'
טבלה ב: פרקים:
מזהה שם הפרק מזהה מסכת 1 מאימתי 1 2 היה קורא בתורה 1 3 מי שמתו 1 וכו'
טבלה ג: תאריכי החזרות:
מזהה פרק חזרה א חזרה ב חזרה ג חזרה ד 3 1/1/2021 3/1/2021 טבלאות א,ב נשארות נעולות ללא שינויים.
טבלה ג מתעדכנת לפי הצורך. -
@פלורידה אתה נכנס כעת לדיון לגבי המבנה המומלץ למסד נתונים עבור התוכנה שלך. לענ"ד זה כבר נושא שמתאים לפוסט חדש...
אני חושב שכך תוכל לשמוע עוד דעות מהחברים כאן. -
@פלורידה בדיוק!
-
@פלורידה אמר בכיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל?:
כלומר, אני מניח שלא ניתן לקשר תא באקסל בכיוון דו צדדי, לדוג', שבתא a1 יהיה מה שבתא a2, ואם אני משנה כל אחד מהתאים הללו, השני משתנה.
דווקא אפשר. אם התא a1 מכיל נוסחה לשלוף את הערך ב a2, אפשר לקבוע שבלחיצה כפולה על a1 יתעדכן הערך בתא a2. אתה עשית דבר קרוב בקובץ הקיים שלך, אלא ששינית את ערך a1.
-
@פלורידה הפתרון של @מנחם הוא הדרך הנכונה ללכת בה.
אמנם היא הדרך הארוכה הקצרה, אבל לטווח ארוך היא משתלמת.אבל בתור פתרון בזק, במקרה שלך, הייתי פותר את הבעיה כך:
בגיבוי - פשוט משכפל את כל החוברת לקובץ נוסף, על כל גליונותיה, נתוניה ועיצוביה, ונעילות תָאֵיהָ.
ובשחזור - הייתי משתמש בפונקציה שכבר הופיעה בפוסט לעיל.
כך הייתי מתחמק מהבעיה של התאים הנעולים, כיון שגם בגיבוי הם יהיו נעולים.להלן הפונקציה החדשה להעתקת החוברת כולה לקובץ גיבוי:
Public Sub BackupTo(targetWorkbook As String) Application.DisplayAlerts = False ThisWorkbook.SaveAs targetWorkbook, xlOpenXMLWorkbookMacroEnabled Application.DisplayAlerts = True End Sub
שים לב שהקוד משכתב את קובץ הגיבוי הקיים, ללא תיבת דו-שיח. אם אתה רוצה להציג דיאלוג למשתמש, תמחק את שורות 2 ו-4.
-
@פלורידה אמר באקסל | בחירת טווח עמודות בכל הטבלאות:
הקוד לשחזור, מפעיל רק את ה MsgBox's אך למעשה לא מעתיק.
ברור.
כי בשחזור הוא בוחר מהגיבוי את כל התאים שלא נעולים, כלומר כל הגליון, ואז מנסה להעתיק את כולם, כלומר גם לתוך התאים שנעולים.נו נו, הקוד לא מושלם.
כיון שאני מחזיק מעצמי מתכנת דגול, תרשה לי לעשות מה שמתכנת דגול עושה, ולהטיל את האשמה עליך, ולהעיר כי זה בגלל שהדרך הזו לגבות ולשחזר היא לא אידיאלית בלשון המעטה.אפשר להוסיף בדיקה שבשחזור יעתיק רק את התאים שגם ביעד הם לא נעולים, אבל אז זה ידרוש שינוי נוסף בקוד.
לא אכפת לי האתגר, אבל נראה לי שכבר חרגנו מהנושא המקורי של הפוסט.
פתח נושא המשך בסגנון: "כיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל."
בע"ה אני אשתדל למצוא לך פתרון שם. -
@פלורידה
תיקנתי טעות קטנה בקוד של הפונקציהCopyAllUnlockedTableCells
...
שים לב שהקוד שצירפתי עובד לאט מאד...
ההפרדה בין האזורים והעתקתם אחד אחד היא איטית מאוד, משהו כמו דקה עבור כל חוברת העבודה. אני לא הצלחתי לשפר את המהירות.
בכל מקרה, הוספתי הודעה לפני ואחרי ההעתקה, והפכתי את הסמן לספינר כדי לתת למשתמש אינדיקציה מתי התהליך הסתיים.
יהיה נחמד להוסיף מד-התקדמות Progress Bar כדי לתת חוויה יותר נעימה למשתמש. -
@פלורידה הקובץ הנ"ל משובש מבחינת הטווחים. הם לא רציפים.
ובלאו הכי יש גישה יותר פשוטה, והיא לבחור את כל התאים שאינם נעולים.
הנה פונקציה שמחזירה את טווח התאים שאינם נעולים (בטבלאות בלבד):Public Function GetAllUnlockedTableCellsInWorksheet(ws As Worksheet) As Range Dim tbl As ListObject Dim cl As Range Dim selectedArea As Range For Each tbl In ws.ListObjects For Each cl In tbl.Range.Cells If Not cl.Locked Then If selectedArea Is Nothing Then Set selectedArea = cl Else Set selectedArea = Union(selectedArea, cl) End If End If Next cl Next tbl Set GetAllUnlockedTableCellsInWorksheet = selectedArea End Function
והנה פונקציה להעתקה של תאים אלו מגליון לגליון, כולל יצירה של גליון היעד אם אינו קיים:
Public Sub CopyAllUnlockedTableCells(sourceWorkbook As Workbook, targetWorkbook As Workbook) Dim sourceSheet As Worksheet Dim targetSheet As Worksheet Dim sourceRange As Range Dim singleArea As Range Dim singleAreaAddress As String MsgBox "מתכונן להעתקת הגליונות, אנא המתן בסבלנות" Application.Cursor = xlWait For Each sourceSheet In sourceWorkbook.Sheets Set sourceRange = GetAllUnlockedTableCellsInWorksheet(sourceSheet) If Not sourceRange Is Nothing Then On Error Resume Next Set targetSheet = targetWorkbook.Worksheets(sourceSheet.Name) On Error GoTo 0 If targetSheet Is Nothing Then targetWorkbook.Sheets.Add.Name = sourceSheet.Name Set targetSheet = targetWorkbook.Worksheets(sourceSheet.Name) End If Debug.Print "Copying sheet: " & sourceSheet.Name For Each singleArea In sourceRange.Areas singleAreaAddress = singleArea.Address targetSheet.Range(singleAreaAddress).Value = singleArea.Value Next singleArea End If Set targetSheet = Nothing Next sourceSheet Application.Cursor = xlDefault MsgBox "העתקת הגליונות הושלמה" End Sub
כעת לגיבוי ושחזור נשנה גם את הפונקציות, כך שיבחרו את התאים שאינם נעולים:
Public Sub BackupTo(targetWorkbook As String) CopyAllUnlockedTableCells ThisWorkbook, Workbooks.Open(targetWorkbook) End Sub Public Sub RestoreFrom(sourceWorkbook As String) CopyAllUnlockedTableCells Workbooks.Open(sourceWorkbook), ThisWorkbook End Sub
וכדי לגבות או לשחזר לקובץ בשם
גיבוי.xlsx
שבתיקיה הנוכחית:BackupTo ActiveWorkbook.Path & "\גיבוי.xlsx" RestoreFrom ActiveWorkbook.Path & "\גיבוי.xlsx"
-
@פלורידה אפשר לתת שם טווח בכמה גליונות על ידי ציון שם הגליון ולאחריו סימן הקריאה
!
, ולהפריד בין הטווחים על ידי פסיקים,
כלומר כך:[ברכות]!A:B,[עירובין]!C:D
אבל אם ניחשתי נכון מה אתה זומם, אז בעצם אתה מבקש לחבר את הפוסט הזה עם הפוסט הזה, וליצור גיבוי רק של הטווח הפעיל בגליון.
אתה צריך גישה אחרת, כי הדבקה מיוחדת לא עובדת על טווחים מרובים, אפילו באותו הגליון, וכ"ש בגליונות מרובים.
אני סבור שהדרך היחידה לממש את זה היא להעתיק תא-תא בנפרד.אבל כעת אין לי זמן לזה. בעז"ה במוצ"ש בלי נדר.
-
@פלורידה מני מניח שהתכוונת לחוברת ריקה. בחוברת ריקה זה גם לא יעבוד, כי צריך שכל הגליונות יהיו קיימים, אלא שיהיו ריקים (הקוד לא יוצר גליונות חדשים).
-
@ארכיטקט יש לך טעות בקוד, תיזהר שלא יישרף לך:
await Task.Delay(1000 * 60 * 60 * 24); // <<בישול של שמונה עשרה שעות
איך טעות כזו נכנסה לפרודוקשן?
-
@יהודי-טוב אמר בתמלול - קיצור מקשים לעצירת שמע:
אני לא אוהב להתקין תוכנות לא ידועות
יש המון תוכנות כאלו.
הנה עוד אחת מומלצת: https://www.randyrants.com/
ואם בא לך אחת של מייקרוסופט:
https://www.microsoft.com/en-us/download/details.aspx?id=102134 -
@פלורידה עכשיו אני כן מנחש מה אתה זומם...
תוכל לקבל את הטווח על ידי selectedArea.Address -
@פלורידה הקוד שצירפתי לעיל הוא טיפש למדי.
הוא מנסה להעתיק את תוכן כל התאים בטווח, מבלי להתחשב בכך שאולי חלק מתאי היעד נעולים. אני מניח שחלק מהגליון נעול לשינויים, ולכן השחזור לא מצליח.
שחזור חכם ישחזר רק את תוכן התאים הרלוונטיים. -
@פלורידה כן, הגיבוי והשחזור הם לתוך\מתוך הקובץ
גיבוי.xlsx
שנמצא באותה תיקייה של החוברת. -
@פלורידה הבנתי.
פשוט נשנה את הקוד קצת:Private Sub CopyAllSheets(source As Workbook, target As Workbook, selectedRange As String) Dim sh As Worksheet For Each sh In source.Sheets sh.Range(selectedRange).Copy target.Worksheets(sh.Name).Range(selectedRange).PasteSpecial Paste:=xlPasteValues Next sh End Sub Public Sub BackupTo(targetWorkbook As String, selectedRange As String) CopyAllSheets ThisWorkbook, Workbooks.Open(targetWorkbook), selectedRange End Sub Public Sub RestoreFrom(sourceWorkbook As String, selectedRange As String) CopyAllSheets Workbooks.Open(sourceWorkbook), ThisWorkbook, selectedRange End Sub
כעת כדי לגבות תריץ:
BackupTo ActiveWorkbook.Path & "\גיבוי.xlsx", "A:BB"
וכדי לשחזר תריץ:
RestoreFrom ActiveWorkbook.Path & "\גיבוי.xlsx", "A:BB"
-
@שוהם307 אם אתה לא צריך שום חומר קיים במחשב, פשוט תסיר את כל המחיצות בכונן הקשיח. זה יסיר גם את מערכת ההפעלה הקיימת.
-
@פלורידה אמר באקסל | ייבוא ערכים מחוברת עבודה:
א. ניתן לעשות את זה בנתיב שאינו קבוע?
לדוג'.לקובץ 'גיבוי' שבאותו נתיב שבו נמצא הקובץ המקורי?
ב. האם אפשר לעשות גם ייבוא באותו אופן.
(אני מנחש שאתה כבר מבין בדיוק מה אני זומם...)על הכל התשובה היא כן, חוץ מהמשפט האחרון. אולי תשתף מה בדיוק אתה זומם?
-
הקוד הבא אמור לבחור את כל התאים בטבלאות שבגליון הפתוח, לפי עיצוב נבחר:
Public Sub MarkAllTableCellsByFormat(formatPattern As String) Dim tbl As ListObject Dim cl As Range Dim selectedArea As Range For Each tbl In ActiveSheet.ListObjects For Each cl In tbl.Range.Cells If InStr(cl.NumberFormat, formatPattern) Then If selectedArea Is Nothing Then Set selectedArea = cl Else Set selectedArea = Union(selectedArea, cl) End If End If Next cl Next tbl If Not selectedArea Is Nothing Then selectedArea.Select End Sub
בקריאה לפונקציה יש לספק את מחרוזת העיצוב, למשל עבור עיצוב תאריך
"m/d/yyyy"
MarkAllTableCellsByFormat "m/d/yyyy"
התייעצות | בניית מסד נתונים לתכנת "הדרן עלך" | אקסל
התייעצות | בניית מסד נתונים לתכנת "הדרן עלך" | אקסל
כיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל?
כיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל?
כיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל?
כיצד לגבות ולשחזר טווחים מסויימים מחוברת אקסל?
אקסל | בחירת טווח עמודות בכל הטבלאות
אקסל | בחירת טווח עמודות בכל הטבלאות
אקסל | בחירת טווח עמודות בכל הטבלאות
אקסל | בחירת טווח עמודות בכל הטבלאות
אקסל | ייבוא ערכים מחוברת עבודה
אמיתי... מצאתי את זה בקוד שלי.
תמלול - קיצור מקשים לעצירת שמע
אקסל | בחירת טווח עמודות בכל הטבלאות
אקסל | ייבוא ערכים מחוברת עבודה
אקסל | ייבוא ערכים מחוברת עבודה
אקסל | ייבוא ערכים מחוברת עבודה
התקנת ווינדוס על מחשב DELL
אקסל | ייבוא ערכים מחוברת עבודה
אקסל | בחירת טווח עמודות בכל הטבלאות