Как добавить вложенный цикл For / Next для разделения файлов? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть простой скрипт, который использует циклы for / next для вырезания файлов по значениям в одном столбце MgrLvl4 = Data(i, 6), выполняя If Data(i, 1) <> MgrLvl4 Then . Он отлично все режет, но у меня есть еще один вопрос. Если у меня есть другой элемент, в котором MgrLvl4 может быть разделен на две категории, как бы я реализовал другой цикл for / next для получения разделенных файлов?

пример: Mgrlvl4 находится в столбце F и содержит Mgr 1. В столбце G есть два значения, разделяющих популяцию Mgr 1. Для простоты, мы просто скажем, что в столбце G половина популярности Mgr 1 представлена ​​как Market 1, а другая половина - как Market 2.

Я хочу поставить что-то вроде: If Data(I,6) AND Data(I,7) <> Mgrlvl4 AND Market Then, чтобы убедиться, что вы увидите if F2<>F3 & G2<>G3 перед запуском следующего файла.

остаток кода:

    Option Explicit

    Sub Main()
    Dim Wb As Workbook
    Dim Data, MgrLvl4, Login, Market
    Dim i As Long, j As Long, k As Long, a As Long
    Dim Dest As Range

    Set Wb = Workbooks("Report_Template.xlsx")

    Set Dest = Wb.Sheets("Population").Range("A2")

    With ThisWorkbook.Sheets("Sheet1")
        Data = .Range("G2", .Range("A" & Rows.Count).End(xlUp))
    End With
    Wb.Activate
    Application.ScreenUpdating = False

    For i = 1 To UBound(Data)

        If Data(i, 6) <> MgrLvl4 Then

            If i > 1 Then

                Dest.Select

                Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
                              ValidFileName(Market & " - " & Login & " - " & MgrLvl4 & " - Report.xlsx")
            End If

            With Sheets("Exempt Population")
                .Rows(2 & ":" & .Rows.Count).ClearContents
            End With

            MgrLvl4 = Data(i, 6)
            Login = Data(i, 3)
            Market = Data(i, 7)

            j = 0
        End If

        a = 0
        For k = 1 To UBound(Data, 2)
            Dest.Offset(j, a) = Data(i, k)
            a = a + 1
        Next

        j = j + 1
    Next

    SaveCopy Wb, Market, Login, MgrLvl4                     '<< save the MgrLvl4 report


End Sub

Sub SaveCopy(Wb As Workbook, Market, Login, MgrLvl4)
    Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
                  ValidFileName(Market & " - " & Login & " - " & MgrLvl4 & " - Report.xlsx")
End Sub

Private Function ValidFileName(ByVal FName As String, _
                               Optional ByVal ReplaceChar As String = "") As String
    'Return a filename without invalid chars
    'Avoid CON, PRN, AUX, NUL, COM1 to COM9, LPT1 to LPT9 as filename
    Const InvalidChars = "\/:*?""<>|"
    Dim i As Integer, p As Long
    Dim Digit As String
    For i = 1 To Len(InvalidChars)
        Digit = Mid$(InvalidChars, i, 1)
        p = InStr(FName, Digit)
        Do While p > 0
            Mid$(FName, p, 1) = vbNullChar
            p = InStr(FName, Digit)
        Loop
    Next
    For i = 1 To 31
        Digit = Chr$(i)
        p = InStr(FName, Digit)
        Do While p > 0
            Mid$(FName, p, 1) = vbNullChar
            p = InStr(FName, Digit)
        Loop
    Next
    ValidFileName = Replace(FName, vbNullChar, ReplaceChar)
End Function

пример таблицы исходных данных: worksheet example of source data:

splitting files by manager separated by market worksheets

1 Ответ

0 голосов
/ 11 мая 2019

Я не уверен, что точно понимаю ваш вопрос, но If Data(I,6) AND Data(I,7) <> Mgrlvl4 AND Market Then недействителен.

Может быть, вы имеете в виду If Data(I, 6) <> Mgrlvl4 And Data(I, 7) <> Market.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...