א' שואלת:
האם יש פקודה שתבצע את הפעולות הבאות -
תעבור על רשימת ערכים בקובץ אקסל אחד ועבור כל ערך תייצר גיליון חדש בקובץ אקסל שני ע"ב גיליון תבנית ובנוסף תעדכן את הערך בראש הגיליון החדש?
תשובה:
אין פקודה אחת לביצוע הפעולות אבל ניתן ליישם זאת על ידי שיגרה (Sub procedure) ב-VBA.
מצ"ב דוגמה:
ניצור 2 קבצי אקסל - קובץ מקור עם רשימת ערכים וקובץ פלט עם גיליון תבנית.

לקובץ האקסל הראשון נקרא בשם source ונשמור אותו בפורמט xlsm המאפשר הגדרת והפעלת קוד VBA.
בעמודה A נגדיר את רשימת הערכים.

לקובץ האקסל השני נקרא בשם target ונשמור אותו בפורמט xlsx.
נגדיר בקובץ גיליון בשם Template שבו בתא A1 יופיע הערך Item ותא B1 (שבו נעדכן את ערך ה-Item הרלוונטי) יהיה צבוע וישאר ריק.

בקובץ source.xlsm נפתח את עורך VBA על ידי לחיצה על Alt+F11 ונגדיר מודול חדש עם השיגרה Generate_Sheet.
השגרה מגדירה שתי חוברות עבודה.
חוברת אחת היא קובץ האקסל הפעיל source.xlsm.
חוברת השנייה היא קובץ היעד target.xlsm שנפתח ע"י השיגרה (ההנחה היא שהקובץ סגור בהפעלת השיגרה).
לאחר מכן השיגרה עוברת על הערכים בעמודה A בקובץ source.xlsm החל מהערך האחרון עד לראשון (בשורה 2).
עבור כל ערך מבוצע שכפול של גיליון Template בקובץ target.xlsm ולאחר מכן שם הגיליון מעודכן לשם הערך הנוכחי והערך הנוכחי מעודכן בתא B1.
בסיום מבוצעת שמירה וסגירה של הקובץ target.xlsx ומוצגת הודעה שהפעולה הושלמה.
Public Sub Generate_Sheets()
Dim targetWB As Workbook, sourceWB As Workbook
Dim lngCurRow As Long, strCurItemCode As String
Set sourceWB = ActiveWorkbook
Set targetWB = Workbooks.Open("C:\target.xlsx")
With sourceWB
With .ActiveSheet
For lngCurRow = .UsedRange.Rows.Count To 2 Step -1
strCurItemCode = .Cells(lngCurRow, 1)
With targetWB
.Activate
Sheets("Template").Copy after:=Sheets("Template")
With .ActiveSheet
.Name = strCurItemCode
.Cells(1, 2) = strCurItemCode
End With
End With
sourceWB.Activate
Next lngCurRow
End With
End With
targetWB.Close True
MsgBox "Sheets creation completed successfully", vbInformation + vbOKOnly, ""
Dim targetWB As Workbook, sourceWB As Workbook
Dim lngCurRow As Long, strCurItemCode As String
Set sourceWB = ActiveWorkbook
Set targetWB = Workbooks.Open("C:\target.xlsx")
With sourceWB
With .ActiveSheet
For lngCurRow = .UsedRange.Rows.Count To 2 Step -1
strCurItemCode = .Cells(lngCurRow, 1)
With targetWB
.Activate
Sheets("Template").Copy after:=Sheets("Template")
With .ActiveSheet
.Name = strCurItemCode
.Cells(1, 2) = strCurItemCode
End With
End With
sourceWB.Activate
Next lngCurRow
End With
End With
targetWB.Close True
MsgBox "Sheets creation completed successfully", vbInformation + vbOKOnly, ""
End Sub


מצ"ב התוצאה בקובץ הפלט לאחר הפעלת השגרה. לכל Item ברשימה בקובץ source נוצר גיליון חדש (שכפול של גיליון Template) וערך ה-item עודכן בתא B1.

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

בברכה,
צוות אניפיט