У меня есть простой скрипт, который использует циклы 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
пример таблицы исходных данных:
![splitting files by manager separated by market worksheets](https://i.stack.imgur.com/BcAwW.jpg)