Создавайте подпапки на основе значения ячейки и копируйте изображения в одну папку - PullRequest
0 голосов
/ 06 марта 2020

Я работаю над большим проектом, и возможность изменения кода на этом этапе прекратилась. Так что помощь нужна, пожалуйста.

Основные папки имеют подпапки и файлы MSR, которые связаны друг с другом с помощью именования. Мы должны ввести путь к этой основной папке в D4 в нашем файле Excel. MSR имеет всю информацию, связанную с каждым изображением. Папки с изображениями содержат все изображения внутри, и нам нужно отсортировать все в подпапки. У нас уже есть макрос, который извлекает список, в котором изображения соотносятся с правильной позицией. (см. третье изображение) Теперь мы хотим создать подпапки в главной папке, которая в данном случае соответствует «* test», и в этой новой папке должны быть созданы подпапки на основе количества уникальных мест. В этом случае это приведет к 18 подпапке. Комбинации столбцов D и E являются уникальными местами (первые 2 примера = 13200-9496 и 13213-9506). Все файлы изображений, которые соответствуют этому месту, должны быть помещены в новую подпапку.

Надеюсь, это несколько понятно?

Обзор основной папки

enter image description here

Обзор вложенной папки

enter image description here

Выходные данные

enter image description here

Код:

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False


    Dim WBMacro As Workbook
    Set WBMacro = ActiveWorkbook
    Dim FoName As Range
    Set FoName = WBMacro.Sheets("Instructions").Range("B4")


        FolderName = FoName
        If Right(FolderName, 1) <> Application.PathSeparator Then FolderName = FolderName & Application.PathSeparator
        FName = Dir(FolderName & "*.msr")

        'loop through the files
        Do While Len(FName)

              Dim WBMSR As Workbook
              Set WBMSR = Workbooks.Open(FolderName & FName)

            With WBMSR

    Columns("A:A").Select

        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True


     'Create new tab to copy data of interest in
     Dim WsMSR As Worksheet
     Set WsMSR = WBMSR.ActiveSheet
     WsMSR.Name = "MSRData"

     .Worksheets.Add

     Dim wsPictData As Worksheet
     Set wsPictData = WBMSR.Sheets("Sheet1")
     wsPictData.Name = "PictureInfo"

     'Define where to copy data to

     Dim RngPictName As Range
     Dim RngX As Range
     Dim RngY As Range

     Set RngPictName = wsPictData.Range("A2")
     Set RngXY = wsPictData.Range("B2")
     Set RngChipCoX = wsPictData.Range("D2")
     Set RngChipCoY = wsPictData.Range("E2")

     RngPictName.Offset(-1, 0) = "PictName"
     RngXY.Offset(-1, 0) = "DieX,DieY"
     RngChipCoX.Offset(-1, 0) = "ChipCoX"
     RngChipCoY.Offset(-1, 0) = "ChipCoY"


     'Find PictureName

     Dim RngPictStart As Range
     Dim RngPictStop As Range
     Dim RngPict As Range


    Dim strImage As String
    strImage = "&mp_image_name"

    Dim strChipNr As String
    strChipNr = "Chip_number"

    Dim strChipCo As String
    strChipCo = "Chip_coordinate"

    With WsMSR.Range("B:B")

     Set image = .Find(strImage, lookat:=xlPart, LookIn:=xlValues)

       If Not image Is Nothing Then
            FirstAddress = image.Address

            Do

                Set pict = image.Offset(0, 2)
                pict.Copy

                    If RngPictName = "" Then
                    RngPictName.PasteSpecial
                    Else
                    RngPictName.Offset(-1, 0).End(xlDown).Offset(1, 0).PasteSpecial
                    End If


                For i = 1 To 15

                    'Do

                        If image.Offset(i, 1).Value = strChipNr Then
                        Set XY = image.Offset(i, 2)
                        XY.Copy

                            If RngXY = "" Then
                            RngXY.PasteSpecial
                            Else
                            RngXY.Offset(-1, 0).End(xlDown).Offset(1, 0).PasteSpecial
                            End If
                        End If

                        If image.Offset(i, 1).Value = strChipCo Then
                        Set ChipX = image.Offset(i, 2)
                        ChipX.Copy

                            If RngChipCoX = "" Then
                            RngChipCoX.PasteSpecial
                            Else
                            RngChipCoX.Offset(-1, 0).End(xlDown).Offset(1, 0).PasteSpecial
                            End If


                        Set ChipY = image.Offset(i, 4)
                        ChipY.Copy

                            If RngChipCoY = "" Then
                            RngChipCoY.PasteSpecial
                            Else
                            RngChipCoY.Offset(-1, 0).End(xlDown).Offset(1, 0).PasteSpecial
                            End If
                        End If

                Next


                Set image = .FindNext(image)
                                    If image Is Nothing Then
                                        GoTo DoneFinding1
                                    End If


             Loop While image.Address <> FirstAddress


         End If

    End With

DoneFinding1:

    End With


    ' change wsPictData Column B with (x,Y) to 2 columns (B = X, C = Y)

    With wsPictData

    Columns("B:B").Select

        Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True



    End With


    WsMSR.Delete
    Dim WBMSRFileName As String
    WBMSRFileName = Left(WBMSR.Name, Len(WBMSR.Name) - 4)
    Dim relativePath As String
    relativePath = WBMSR.Path



    WBMSR.SaveAs Filename:=relativePath & "\" & "Pictures_" & WBMSRFileName & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    WBMSR.Close (False)

      ' go to the next file in the folder

    FName = Dir


    Loop


    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    MsgBox ("all Files in folder" & relativePath & " are analyzed")

Это схема для уточнения дерева папок. Тест изображения - это основная папка (в этом примере имя всегда отличается). Серая область внизу - это то, что нужно сделать макросу. Внутри основной папки создайте для каждого «теста» новую папку с «фильтрованным» приложением, а в каждой папке - новые папки с расположением, в котором хранятся все изображения, снятые в этом месте.

дерево папок

Пример файла MSR

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Это сканирует MAIN_FOLDER для файлов Excel, начинающихся с Pictures_, открывает их и сканирует строки, составляя имена папок назначения из столбцов A, D и E. Я помещаю окна сообщений на каждом этапе, поэтому, если вы пройдете один шаг, вы сможете изучить как это работает. Он создаст подпапки, если вы подтвердите действие, но фактический метод копирования в конце будет закомментирован. Подробнее см. FileSystemObject .

Sub imagemove()

    Const MAIN_FOLDER = "c:\temp\msr\"

    Dim FileName As String, wb As Workbook, ws As Worksheet
    Dim count As Long, iLastRow As Long, iRow As Long
    Dim sPictureFolder As String, sCopyFolder As String
    Dim sCopySubFolder As String, msg As String
    Dim sPictureName As String, sChipCoX As String, sChipCoY As String
    Dim sSrc As String, sDest As String

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    FileName = Dir(MAIN_FOLDER & "Pictures_*.xlsx")
    Do While Len(FileName) > 0

        ' determine picture folder from filename
        sPictureFolder = MAIN_FOLDER & Mid(FileName, 10, Len(FileName) - 14)
        sCopyFolder = sPictureFolder & "-Filtered"
        Debug.Print sPictureFolder, sCopyFolder

        ' check if folder exists
        If FSO.FolderExists(sCopyFolder) = False Then
            msg = sCopyFolder & " does not exist, do you want to create it"
            If vbYes = MsgBox(msg, vbYesNo, "Confirm") Then
                FSO.CreateFolder sCopyFolder
            Else
                Exit Sub
            End If
        End If

        ' scan down msr file
        Set wb = Workbooks.Open(MAIN_FOLDER & FileName, False, True)
        Set ws = wb.Sheets("PictureInfo")
        iLastRow = ws.Cells(Rows.count, 1).End(xlUp).Row
       'Debug.Print FileName, iLastRow

        For iRow = 2 To iLastRow
            sPictureName = ws.Cells(iRow, 1) ' A
            sChipCoX = ws.Cells(iRow, 4) ' D
            sChipCoY = ws.Cells(iRow, 5) ' E

            ' ignore jpeg images
            If Right(sPictureName, 4) = "jpeg" Then GoTo skip

            sCopySubFolder = sCopyFolder & "\" & sChipCoX & "-" & sChipCoY

            ' check if sub folder exists
            If FSO.FolderExists(sCopySubFolder) = False Then
                msg = sCopySubFolder & " does not exist, do you want to create it"
                If vbYes = MsgBox(msg, vbYesNo, "Confirm") Then
                    FSO.CreateFolder sCopySubFolder
                Else
                    Exit Sub
                End If
            End If

            ' move locations
            sSrc = sPictureFolder & "\" & sPictureName
            sDest = sCopySubFolder & "\" & sPictureName

            ' check file exists
            If FSO.FileExists(sSrc) = True Then
                MsgBox "Copy from " & sSrc & " to " & sDest
               'FSO.CopyFile sSrc, sDest
            Else
                MsgBox sSrc & " does not exist", vbCritical, "File does not exist"
                'test FSO.CreateTextFile sDest
            End If

            Debug.Print "Copy", sSrc, "to", sDest
skip:
        Next

        count = count + 1
        FileName = Dir
    Loop

    MsgBox count & " Pictures_* files scanned in " & MAIN_FOLDER, vbInformation

End Sub
0 голосов
/ 09 марта 2020

Хорошо, я должен ответить на свой вопрос ... Я удалил все файлы jpeg из файла Pictures, чтобы эти изображения не копировались, поэтому я создал еще один l oop. Сначала я поместил его в ваш l oop, но потом он создал бы дополнительную пустую папку. Но теперь я боюсь, что сильно замедлил макрос? Лучше сделать это внутри вашей l oop, а затем удалить папку "-" в конце?

Set wb = Workbooks.Open(MAIN_FOLDER & "\" & FileName, False, True)
       Set ws = wb.Sheets("PictureInfo")
       iLastRow = ws.Cells(Rows.count, 1).End(xlUp).Row
       'Debug.Print FileName, iLastRow

            For iRow = 2 To sLastrow
                If Right(ws.Cells(iRow, 1).Text, 4) = "jpeg" Then ws.Cells(iRow, 1).EntireRow.Delete

            Next

       For iRow = 2 To iLastRow


            sPictureName = ws.Cells(iRow, 1) ' A
            sChipCoX = ws.Cells(iRow, 4) ' D
            sChipCoY = ws.Cells(iRow, 5) ' E
    ```
...