שימוש ב- VBA FileSystemObject (FSO) ב- Excel - סקירה קלה ודוגמאות

כאשר אנו משתמשים ב- VBA ב- Excel, רובו הוא אוטומציה של המשימות שלנו.

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

אבל VBA הוא הרבה יותר חזק וניתן להשתמש בו גם לעבודה עם דברים מחוץ לאקסל.

במדריך זה אראה לך כיצד להשתמש ב- VBA FileSystemObject (FSO) לעבודה עם קבצים ותיקיות במערכת או בכונני הרשת שלך.

מהו VBA FileSystemObject (FSO)?

FileSystemObject (FSO) מאפשר לך לגשת למערכת הקבצים של המחשב שלך. באמצעותו תוכל לגשת ולשנות את הקבצים/תיקיות/ספריות במערכת המחשב שלך.

לדוגמה, להלן כמה מהדברים שאתה יכול לעשות באמצעות FileSystemObject ב- Excel VBA:

  • בדוק אם קיים קובץ או תיקיה.
  • צור או שנה את שם התיקיות/קבצים.
  • קבל רשימה של כל שמות הקבצים (או שמות תיקיות המשנה) בתיקיה.
  • העתק קבצים מתיקייה אחת לתיקייה אחרת.

אני מקווה שהבנת את הרעיון.

אכסה את כל הדוגמאות הנ"ל (ועוד ועוד) בהמשך הדרכה זו.

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

הערה: ניתן להשתמש ב- FSO רק ב- Excel 2000 וגירסאות מאוחרות יותר.

לאילו כל האובייקטים תוכל לגשת באמצעות FileSystemObject?

כפי שציינתי למעלה, תוכל לגשת ולשנות קבצים ותיקיות באמצעות FileSystemObject ב- VBA.

להלן טבלה המציגה את האובייקטים החשובים ביותר אליהם תוכל לגשת ולשנות באמצעות FSO:

לְהִתְנַגֵד תיאור
נהיגה Drive Object מאפשר לך לקבל מידע על הכונן כגון האם הוא קיים או לא, שם הנתיב, סוג הכונן (נשלף או קבוע), גודלו וכו '.
תיקייה אובייקט תיקיה מאפשר לך ליצור או לשנות תיקיות במערכת שלך. לדוגמה, אתה יכול ליצור, למחוק, לשנות את השם, להעתיק תיקיות באמצעות אובייקט זה.
קוֹבֶץ File Object מאפשר לך לעבוד עם קבצים במערכת שלך. לדוגמה, תוכל ליצור, לפתוח, להעתיק, להעביר ולמחוק קבצים באמצעות אובייקט זה.
טקסט סטרים אובייקט TextStream מאפשר לך ליצור או לקרוא קבצי טקסט.

לכל אחד מהאובייקטים לעיל יש שיטות שבהן תוכל להשתמש כדי לעבוד עם אלה.

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

אל תדאג אם זה נראה מכריע או קשה להבנה. תקבל הבנה הרבה יותר טובה כאשר תעבור על הדוגמאות שסיקרתי במדריך זה.

רק לצורך ההתייחסות, כיסיתי את כל שיטות FileSystemObject (לכל אובייקט) בסוף הדרכה זו.

הפעלת FileSystemObject ב- Excel VBA

FileSystemObject אינו זמין כברירת מחדל ב- VBA של Excel.

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

כעת ישנן שתי דרכים בהן תוכל להתחיל להשתמש ב- FileSystemObject ב- Excel VBA:

  1. הגדרת ההתייחסות לספריית זמן ריצה של Microsoft Scripting (Scrrun.dll)
  2. יצירת אובייקט שיתייחס לספרייה מהקוד עצמו

למרות ששתי השיטות הללו עובדות (ואני אראה לך כיצד לעשות זאת בהמשך), אני ממליץ להשתמש בשיטה הראשונה.

הערה: כאשר אתה מפעיל את FileSystemObject, תוכל לגשת לכל האובייקטים בו. זה כולל את FileSystemObject, Drive, Files, Folders וכו '. אני אתמקד בעיקר ב- FileSystemObject במדריך זה.

הגדרת ההפניה לספריית זמן הריצה של Microsoft Scripting

כאשר אתה יוצר הפניה לספריית Runtime Scripting, אתה מאפשר ל- Excel VBA גישה לכל המאפיינים והשיטות של קבצים ותיקיות. ברגע שזה נעשה, אתה יכול להתייחס לאובייקט הקבצים/תיקיות/כוננים מתוך ה- VBA של Excel (בדיוק כמו שאתה יכול להפנות את התאים, גליונות העבודה או חוברות העבודה).

להלן השלבים ליצירת הפניה לספריית Runtime Runtime של Microsoft:

  1. בעורך VB, לחץ על כלים.
  2. לחץ על הפניות.
  3. בתיבת הדו -שיח הפניות שנפתחת, גלול בין ההפניות הזמינות ובדוק את האפשרות 'Microsoft Scripting Runtime'.
  4. לחץ על אישור.

השלבים לעיל יאפשרו לך כעת להתייחס לאובייקטים של FSO מתוך Excel VBA.

יצירת מופע של FileSystemObject בקוד

לאחר שתגדיר את ההפניה לספריית Scripting FileSystemObject, עליך ליצור מופע של אובייקט FSO בקוד שלך.

לאחר יצירת זה, אתה יכול להשתמש בו ב- VBA.

להלן הקוד שיגדיר את משתנה האובייקטים MyFSO כאובייקט FileSystemObject:

Sub CreatingFSO () Dim MyFSO כ- FileSystemObject הגדר MyFSO = Sub Sub End End חדש של FileSystemObject

בקוד זה, הכרזתי קודם כל על המשתנה MyFSO כאובייקט מסוג FileSystemObject. זה אפשרי רק מכיוון שיצרתי הפניה לספריית זמן הריצה של Microsoft Scripting. אם ההפניה לא נוצרת, הדבר יביא לך שגיאה (שכן Excel לא יזהה מה פירוש FileSystemObject).

בשורה השנייה קורים שני דברים:

  1. מילת המפתח NEW יוצרת מופע של FileSystemObject. זה אומר שעכשיו אני יכול להשתמש בכל השיטות של FileSystemObject לעבודה עם קבצים ותיקיות. אם לא תיצור מופע זה, לא תוכל לגשת לשיטות FSO.
  2. מילת המפתח SET מגדירה את האובייקט MyFSO למופע החדש הזה של FileSystemObject. זה מאפשר לי להשתמש באובייקט זה כדי לגשת לקבצים ולתיקיות. לדוגמה, אם אני צריך ליצור תיקיה, אני יכול להשתמש בשיטת MyFSO.CreateFolder.

אם תרצה, תוכל גם לשלב את שתי ההצהרות לעיל לאחת כפי שמוצג להלן:

Sub CreatingFSO () Dim MyFSO כ- New FileSystemObject End Sub

יתרון גדול בשימוש בשיטה זו (כלומר הגדרת ההתייחסות לספריית Runtime Runtime של Microsoft) הוא שכאשר תשתמש באובייקטים של FSO בקוד שלך, תוכל להשתמש בתכונה IntelliSense המציגה את השיטות והמאפיינים המשויכים ל- אובייקט (כפי שמוצג להלן).

זה לא אפשרי כאשר אתה יוצר את ההפניה מתוך הקוד (המכוסה הבא).

יצירת אובייקט מהקוד

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

כאשר אתה כותב את הקוד, תוכל ליצור אובייקט מתוך הקוד ולהפנות ל- Scripting.FileSystemObject.

הקוד שלהלן יוצר אובייקט FSO ולאחר מכן הופך אותו לסוג FileSystemObject.

Sub FSODemo () Dim FSO כמערכת אובייקטים FSO = CreateObject ("Scripting.FileSystemObject") End Sub

למרות שזה עשוי להיראות נוח יותר, חיסרון גדול בשימוש בשיטה זו הוא שזה לא יציג IntelliSense כאשר אתה עובד עם אובייקטים ב- FSO. בשבילי, זה שלילי עצום ואני תמיד ממליץ להשתמש בשיטה הקודמת לאפשר FSO (כלומר על ידי הגדרת ההתייחסות ל'זמן סקריפטים של Microsoft ')

דוגמאות ל- VBA FileSystemObject

עכשיו בואו נצלול ונראה כמה דוגמאות מעשיות לשימוש ב- FileSystemObject ב- Excel.

דוגמה 1: בדוק אם קיים קובץ או תיקיה

הקוד הבא יבדוק אם התיקייה עם השם 'בדיקה' קיימת או לא (במיקום שצוין).

אם התיקייה קיימת, תנאי IF הוא נכון והיא מציגה הודעה - 'התיקייה קיימת' בתיבת הודעות. ואם היא לא קיימת, היא מציגה הודעה - התיקייה לא קיימת '.

Sub CheckFolderExist () Dim MyFSO כ- FileSystemObject Set MyFSO = New FileSystemObject אם MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") ואז MsgBox "התיקייה קיימת" אחר MsgBox "התיקייה לא קיימת" סוף אם סוף תַת

באופן דומה, תוכל גם לבדוק אם קיים קובץ או לא.

הקוד שלהלן בודק אם יש קובץ עם השם Test.xlsx בתיקייה שצוינה או לא.

Sub CheckFileExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: Users sumit \ Desktop \ Test \ Test.xlsx") ואז MsgBox "הקובץ קיים" אחר MsgBox "הקובץ אינו קיים "סיום אם סיום תת

דוגמה 2: צור תיקייה חדשה במיקום שצוין

הקוד שלהלן ייצור תיקיה בשם 'Test' בכונן C של המערכת שלי (יהיה עליך לציין את הנתיב במערכת שלך שבו ברצונך ליצור את התיקיה).

Sub CreateFolder () Dim MyFSO כ- FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") סיום תת

למרות שהקוד הזה עובד בסדר, הוא יראה שגיאה במקרה שהתיקייה כבר קיימת.

הקוד שלהלן בודק אם התיקייה כבר קיימת ויוצר תיקיה אם לא. במקרה שהתיקייה כבר קיימת, היא מציגה הודעה. כדי לבדוק אם קיימת התיקייה, השתמשתי ב- שיטת FolderExists של FSO.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: Users sumit \ Desktop \ Test") ואז MsgBox "התיקייה כבר קיימת" אחרת MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") סוף אם סוף תת

דוגמה 3: קבל רשימה של כל הקבצים בתיקייה

הקוד שלהלן יציג את שמות כל הקבצים בתיקייה שצוינה.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") עבור כל MyFile ב- MyFolder.Files Debug.Print MyFile.Name הבא MyFile End Sub Sub

הקוד הזה הוא קצת יותר מורכב מאלה שכבר ראינו.

כפי שציינתי למעלה במדריך זה, כאשר אתה מתייחס ל'ספריית זמן ריצה של Microsoft Scripting ', תוכל להשתמש ב- FileSystemObject כמו גם בכל האובייקטים האחרים (כגון קבצים ותיקיות).

בקוד לעיל, אני משתמש בשלושה אובייקטים - FileSystemObject, File ו- Folder. זה מאפשר לי לעבור על כל קובץ בתיקייה שצוין. לאחר מכן אני משתמש במאפיין name כדי לקבל את רשימת כל שמות הקבצים.

שים לב שאני משתמש ב- Debug.Print כדי לקבל את שמות כל הקבצים. שמות אלה יופיעו בחלון המיידי בעורך VB.

דוגמה 4: קבל את רשימת כל תיקיות המשנה בתיקייה

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

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: Users sumit \ Desktop \ Test") עבור כל MySubF ב- MyFolder.SubFolders Debug.Print MySubFolder.Name הבא MySubFolder End Sub Sub

דוגמה 5: העתק קובץ ממקום למקום

הקוד שלהלן יעתיק את הקובץ מתיקיית 'מקור' ויעתיק אותו לתיקיית 'יעד'.

Sub CopyFile () Dim MyFSO As FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Source: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "Sub Sub

בקוד לעיל השתמשתי בשני משתנים - SourceFile ו- DestinationFolder.

קובץ המקור מחזיק את כתובת הקובץ שאליו ברצונך להעתיק והמשתנה DestinationFolder מחזיק את הכתובת לתיקייה שאליה ברצונך להעתיק את הקובץ.

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

דוגמה 6: העתק את כל הקבצים מתיקייה אחת לאחרת

הקוד שלהלן יעתיק את כל הקבצים מתיקיית המקור לתיקיית היעד.

Sub CopyAllFiles () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) for MyFile In MyFolder.Files MyFSO.CopyFile Source: = MyFSO.GetFile (MyFile), _ Destination: = DestinationFolder &" \ "& MyFile.Name, Overwritefiles: = False Sub My End קובץ הבא

הקוד לעיל יעתיק את כל הקבצים מתיקיית המקור לתיקיית היעד.

שים לב שבשיטת MyFSO.CopyFile ציינתי את המאפיין 'קובצי Overwritefiles' כ- False (זה נכון כברירת מחדל). זה מוודא שאם כבר יש לך את הקובץ בתיקייה, הוא לא הועתק (ותראה שגיאה). אם תסיר את 'קובצי Overwritefiles' או תגדיר זאת ל- True, למקרה שיש קבצים בתיקיית היעד עם אותו שם, אלה יוחלפו.

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

אם ברצונך להעתיק את הקבצים של סיומת מסוימת בלבד, תוכל לעשות זאת באמצעות משפט IF Then כדי לבדוק אם התוסף הוא xlsx או לא.

Sub CopyExcelFilesOnly () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "הגדר MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) עבור כל MyFile ב- MyFolder.Files אם MyFSO.GetExtensionName (MyFile) =" xlsx "ואז מקור MyFSO.CopyFile: = MyFSO.Gile (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = End False If Next MyBile End Sub Sub

שיטות FileSystemObject (FSO)

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

שיטות FSO עבור אובייקט תיאור
DriveExists נהיגה בודק אם הכונן קיים או לא
GetDrive נהיגה מחזירה מופע של אובייקט הכונן על סמך הנתיב שצוין
GetDriveName נהיגה הפעלה חוזרת של שם הכונן
BuildPath תיקיית קבצים צור נתיב מנתיב קיים ושם
CopyFile תיקיית קבצים מעתיק קובץ
GetAbsolutePathName תיקיית קבצים החזר את הייצוג הקנוני של הנתיב
GetBaseName תיקיית קבצים החזר את שם הבסיס מנתיב. לדוגמה, "D: \ TestFolder \ TestFile.xlsm" יחזיר את TextFile.xlsm
GetTempName תיקיית קבצים צור שם שניתן להשתמש בו לשם קובץ זמני
CopyFolder תיקייה מעתיק תיקיה ממיקום אחד לשני
CreateFolder תיקייה יוצר תיקיה חדשה
DeleteFolder תיקייה מוחק את התיקיה שצוין
FolderExists תיקייה בודק אם התיקייה קיימת או לא
GetFolder תיקייה מחזירה מופע של אובייקט התיקיה על סמך הנתיב שצוין
GetParentFolderName תיקייה הפעלה מחדש של שם תיקיית האב בהתבסס על הנתיב שצוין
GetSpecialFolder תיקייה קבל את המיקום של תיקיות מערכת שונות.
MoveFolder תיקייה מעביר תיקיה ממיקום אחד לשני
מחק קובץ קוֹבֶץ מוחק קובץ
הקובץ קיים קוֹבֶץ בודק אם קיים קובץ או לא
GetExtensionName קוֹבֶץ מחזירה את סיומת הקובץ
GetFile קוֹבֶץ מחזירה את המופע של אובייקט קובץ המבוסס על הנתיב שצוין
GetFileName קוֹבֶץ מחזירה את שם הקובץ
GetFileVersion קוֹבֶץ מחזירה את גירסת הקובץ
MoveFile קוֹבֶץ מעביר קובץ
CreateTextFile קוֹבֶץ יוצר קובץ טקסט
GetStandardStream קוֹבֶץ אחזר את הקלט, הפלט או זרם השגיאות הסטנדרטי
OpenTextFile קוֹבֶץ פתח קובץ כ- TextStream

תוכל לעזור בפיתוח האתר, שיתוף הדף עם החברים שלך

wave wave wave wave wave