:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

Loop Sub Folder

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
User avatar
parakorn
Gold
Gold
Posts: 1223
Joined: Thu Mar 14, 2013 9:41 am
Location: Central Chaengwattana[Tops]
Excel Ver: 365
Contact:

Loop Sub Folder

#1

Post by parakorn »

เรียนอาจารย์ และ เพื่อนๆในบอร์ดครับ

เนื่องจากผมต้องการ Loop เข้าไปใน Folder เรื่อยๆ จนกว่าจะเจอไฟล์ Excel ที่มีชื่อขึ้นต้นว่า "FINAL COST" แล้วทำการ Debug ทุกไฟล์ ซึ่งแต่ละ Folder ก็มี Folder ซ้อนเข้าไปเรื่อยๆ แต่ล่ะ Folder ก็มีจำนวนที่ซ้อนเข้าไปไม่เท่ากัน อยากทราบว่าต้องการแก้ไขโค้ดอย่างไรให้สามารถทำงานได้ครับ

Code: Select all

Public Sub NonRecursiveMethod()
    Dim fso, oFolder, oSubfolder, oFile, queue As Collection

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set queue = New Collection
    queue.Add fso.GetFolder("D:\Detail\wetransfer_2022-1-zip_2022-10-25_1306\")
    Do While queue.Count > 0
        Set oFolder = queue(1)
        queue.Remove 1 'dequeue
            For Each oSubfolder In oFolder.SubFolders
                queue.Add oSubfolder 'enqueue
            Next oSubfolder
        For Each oFile In oFolder.Files
          oFile = Dir("*FINAL COST*")
                Do While Len(oFile) > 0
                Debug.Print
                Loop
        Next oFile
    Loop
End Sub
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Loop Sub Folder

#2

Post by snasui »

:D กรุณาแนบไฟล์ตัวอย่างประกอบเพื่อสะดวกต่อการตอบของเพื่อนสมาชิกครับ
User avatar
parakorn
Gold
Gold
Posts: 1223
Joined: Thu Mar 14, 2013 9:41 am
Location: Central Chaengwattana[Tops]
Excel Ver: 365
Contact:

Re: Loop Sub Folder

#3

Post by parakorn »

เรียนอาจารย์ครับ
ในโฟล์เดอร์สุดท้าย บางโฟล์เดอร์มี 2 โฟล์ที่ต้องการ แต่ตอนนี้มัน Return แค่ไฟล์เดียวครับ
ขอบคุณมากครับ

Code: Select all

Sub sample2()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "D:\Detail\wetransfer_2022-1-zip_2022-10-25_1306\"

    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder2 FileSystem.GetFolder(HostFolder)
End Sub

Sub DoFolder2(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        If found Then Exit For
        DoFolder2 SubFolder
    Next
    Dim File
    Dim n As Long
    For Each File In Folder.Files
        If found Then Exit For
            'for each InFile in Folder.File
                If Left(File.Name, 10) = "FINAL COST" Then
                    found = True
                        n = Range("A" & Rows.Count).End(xlUp).Row
                        Sheets("Sheet1").Range("B" & n + 1) = Folder.Name
                        Sheets("Sheet1").Range("A" & n + 1) = File.Name
                End If
            'Next
    Next
End Sub
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Loop Sub Folder

#4

Post by snasui »

:D ปลดตัวดักการออกจาก Loop ทิ้งไป ตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

'Other code
Sub DoFolder2(Folder)
    Dim SubFolder, File
    Dim n As Long
    
    For Each SubFolder In Folder.SubFolders
        DoFolder2 SubFolder
    Next

    For Each File In Folder.Files
        If Left(File.Name, 10) = "FINAL COST" Then
            n = Range("A" & Rows.Count).End(xlUp).Row
            Sheets("Sheet1").Range("B" & n + 1) = Folder.Name
            Sheets("Sheet1").Range("A" & n + 1) = File.Name
        End If
    Next
End Sub
User avatar
parakorn
Gold
Gold
Posts: 1223
Joined: Thu Mar 14, 2013 9:41 am
Location: Central Chaengwattana[Tops]
Excel Ver: 365
Contact:

Re: Loop Sub Folder

#5

Post by parakorn »

ได้ล่ะครับอาจารย์ รบกวนสอบถามต่อเลยนะครับ หากต้องการ Loop เข้าไปในแต่ล่ะชีท ของแต่ล่ะไฟล์ โดยไม่ต้องการเปิดไฟล์(ไฟล์มีจำนวนเยอะมากๆ) แล้ว Return Result ออกมาต้องปรับโค้ดประมาณไหนครับ
- ในแต่ล่ะไฟล์ ต้องการ Loop เฉพาะ Sheets ที่มีชื่อ 10ตัวแรก = "COST SHEET"
- ต้องการ Return ข้อมูลตั้งแต่ A10 ไปจนถึง Column และ Row สุดท้ายของไฟล์ (Use Range) นำมาต่อๆกันโดยที่ไม่ต้อง Transpose ครับ(เอา Head มาด้วยเพราะต้องการ Reconsign Head ด้วยครับ)

ตัวอย่างข้อมูลตามไฟลแนบครับ

Code: Select all

Sub sample2()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "D:\Detail\wetransfer_2022-1-zip_2022-10-25_1306\"

    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder2 FileSystem.GetFolder(HostFolder)
End Sub

Sub DoFolder2(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder2 SubFolder
    Next
    Dim File
    Dim n As Long
    Dim n2 As Long
    Dim sh As Worksheet
    Dim tws As Workbook
    For Each File In Folder.Files
                If Left(File.Name, 10) = "FINAL COST" Then
                    found = True
                            n = Sheets("List").Range("A" & Rows.Count).End(xlUp).Row
                            n2 = Sheets("Detail1").Range("C" & Rows.Count).End(xlUp).Row
                            Sheets("List").Range("B" & n + 1) = Folder.Name
                            Sheets("List").Range("A" & n + 1) = File.Name
                            'myfile = Dir(File)
'                            ws = File.Workbook
                                For Each sh In tws
                                    If Left(sh.Name, 10) = "FINAL COST" Then
                                    Sheets("Detail1").Range("C" & n2 + 1) = Range("A12:AW12").Value
                                    End If
                                Next
'                                    With Workbooks(File)
'                                        If Left(sh.Name, 10) = "FINAL COST" Then
'                                        Sheets("Detail1").Range("C" & n2 + 1) = Range("A12:AW12").Value
'                                         End If
'                                    End With
                End If
    Next
End Sub
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Loop Sub Folder

#6

Post by snasui »

:D ตัวอย่างการปรับ Code โดยใน Program ได้เพิ่ม Sheet1 เอาไว้รับข้อมูลและ Add Reference ชื่อ Microsoft ActiveX Data Objects 6.1 Library เข้ามาด้วย

Code นี้จะนำข้อมูลจากไฟล์และชีตต้นทางที่เข้าเงื่อนไขทุกบรรทัดมาแสดง หากต้องการจะตัดให้เหลือเท่าที่ต้องการสามารถเขียน Code สำหรับจัดการขึ้นมาต่างหากครับ

Code: Select all

Sub sample2()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "D:\Detail\wetransfer_2022-1-zip_2022-10-25_1306\"
    
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder2 FileSystem.GetFolder(HostFolder)
End Sub

Sub DoFolder2(Folder)
    Dim SubFolder
    Dim File
    Dim n As Long
    Dim n2 As Long
    Dim sh As Worksheet
    Dim tws As Workbook
    For Each SubFolder In Folder.SubFolders
        DoFolder2 SubFolder
    Next
    For Each File In Folder.Files
        If Left(File.Name, 10) = "FINAL COST" Then
            n = Sheets("List").Range("A" & Rows.Count).End(xlUp).Row
            n2 = Sheets("Detail1").Range("C" & Rows.Count).End(xlUp).Row
            Sheets("List").Range("B" & n + 1) = Folder.Name
            Sheets("List").Range("A" & n + 1) = File.Name
            Call GetSheetname(theFullName:=File)
        End If
    Next
End Sub

Sub ImportFile(sFile As String, sh As String)
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    On Error Resume Next
    shtName = "[" & VBA.Replace(sh, "'", "") & "]"
    sql = "select * from " & shtName
    sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & sFile & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    rs.Open sql, sCnstr
    With Worksheets("Sheet1")
        .Range("A" & Rows.Count).End(xlUp).Offset(1, 0) _
            .CopyFromRecordset rs
    End With
    Set sCnstr = Nothing
    Set rs = Nothing
End Sub

Function GetSheetname(ByVal theFullName As String) As String
    Dim cn As ADODB.Connection
    Dim rsT As ADODB.Recordset
    Dim intTblCnt As Integer
    Dim strTbl As String
    Dim t As Integer
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & theFullName & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=NO"";"

    Set rsT = cn.OpenSchema(adSchemaTables)
    intTblCnt = rsT.RecordCount

    Do While Not rsT.EOF
        strTbl = rsT.Fields("TABLE_NAME").Value
        If Right(strTbl, 2) = "$'" And VBA.Left(strTbl, 11) = "'COST SHEET" Then
           Call ImportFile(sFile:=theFullName, sh:=strTbl)
        End If
        rsT.MoveNext
    Loop
    rsT.Close
    cn.Close
End Function
User avatar
parakorn
Gold
Gold
Posts: 1223
Joined: Thu Mar 14, 2013 9:41 am
Location: Central Chaengwattana[Tops]
Excel Ver: 365
Contact:

Re: Loop Sub Folder

#7

Post by parakorn »

snasui wrote: Mon Oct 31, 2022 7:59 pm :D ตัวอย่างการปรับ Code โดยใน Program ได้เพิ่ม Sheet1 เอาไว้รับข้อมูลและ Add Reference ชื่อ Microsoft ActiveX Data Objects 6.1 Library เข้ามาด้วย

Code นี้จะนำข้อมูลจากไฟล์และชีตต้นทางที่เข้าเงื่อนไขทุกบรรทัดมาแสดง หากต้องการจะตัดให้เหลือเท่าที่ต้องการสามารถเขียน Code สำหรับจัดการขึ้นมาต่างหากครับ

Code: Select all

Sub sample2()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "D:\Detail\wetransfer_2022-1-zip_2022-10-25_1306\"
    
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder2 FileSystem.GetFolder(HostFolder)
End Sub

Sub DoFolder2(Folder)
    Dim SubFolder
    Dim File
    Dim n As Long
    Dim n2 As Long
    Dim sh As Worksheet
    Dim tws As Workbook
    For Each SubFolder In Folder.SubFolders
        DoFolder2 SubFolder
    Next
    For Each File In Folder.Files
        If Left(File.Name, 10) = "FINAL COST" Then
            n = Sheets("List").Range("A" & Rows.Count).End(xlUp).Row
            n2 = Sheets("Detail1").Range("C" & Rows.Count).End(xlUp).Row
            Sheets("List").Range("B" & n + 1) = Folder.Name
            Sheets("List").Range("A" & n + 1) = File.Name
            Call GetSheetname(theFullName:=File)
        End If
    Next
End Sub

Sub ImportFile(sFile As String, sh As String)
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    On Error Resume Next
    shtName = "[" & VBA.Replace(sh, "'", "") & "]"
    sql = "select * from " & shtName
    sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & sFile & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    rs.Open sql, sCnstr
    With Worksheets("Sheet1")
        .Range("A" & Rows.Count).End(xlUp).Offset(1, 0) _
            .CopyFromRecordset rs
    End With
    Set sCnstr = Nothing
    Set rs = Nothing
End Sub

Function GetSheetname(ByVal theFullName As String) As String
    Dim cn As ADODB.Connection
    Dim rsT As ADODB.Recordset
    Dim intTblCnt As Integer
    Dim strTbl As String
    Dim t As Integer
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & theFullName & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=NO"";"

    Set rsT = cn.OpenSchema(adSchemaTables)
    intTblCnt = rsT.RecordCount

    Do While Not rsT.EOF
        strTbl = rsT.Fields("TABLE_NAME").Value
        If Right(strTbl, 2) = "$'" And VBA.Left(strTbl, 11) = "'COST SHEET" Then
           Call ImportFile(sFile:=theFullName, sh:=strTbl)
        End If
        rsT.MoveNext
    Loop
    rsT.Close
    cn.Close
End Function
สุดยอดเลยครับอาจารย์ ขอกราบขอบพระคุณมากครับ :cp: :cp:
Post Reply