Загрузка данных
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Dim FSO As Object
Dim FileFound As Boolean
Dim CurrentFileName As String
Dim CurrentFilePath As String
Dim CurrentFileLocation As String
Dim GlobalCurrentCount As Long
Dim GlobalTotalCount As Long
Sub SmartBatchPrint()
Dim MainFolderPath As String
Dim Cell As Range
Dim TargetNumber As String
Dim Suffix As String
Dim AllowPrint As Boolean
' Äèíàìè÷åñêèé ìàññèâ äëÿ ïóòåé
Dim SearchPaths() As String
Dim PathIndex As Long
Dim WB As Workbook
Dim WS As Worksheet
Dim TimeLeft As Double
' Ïåðåìåííûå äëÿ ïîèñêà ëèñòîâ ïî ñîäåðæèìîìó
Dim Keywords(1 To 5) As String
Dim KeywordFound(1 To 5) As Boolean
Dim i As Long
Dim SheetsPrintedCount As Long
Dim FoundCell As Range
' =========================================================================
' ÁËÎÊ ÍÀÑÒÐÎÉÊÈ ÊËÞ×ÅÂÛÕ ÑËΠ(Èùóòñÿ âíóòðè òåêñòà ÿ÷ååê)
' =========================================================================
Keywords(1) = "ÏÐÎÒÎÊÎË ÈÑÏÛÒÀÍÈÉ"
Keywords(2) = "ÎÊÎÍ×ÀÍÈÅ ÐÀÑ×ÅÒÍÎ-ÑÏÐÀÂÎ×ÍÛÕ"
Keywords(3) = "Ïðèëîæåíèå ¹1"
Keywords(4) = "ÀÊÒ ÈÑÏÛÒÀÍÈÉ"
Keywords(5) = "ÏÅÐÂÈ×ÍÛÅ ÇÀÏÈÑÈ"
' =========================================================================
' 1. Áàçîâûé ïóòü ê ãëàâíîé ïàïêå
MainFolderPath = "C:\Users\vorob\OneDrive\Desktop\Ïå÷àòü\"
' Äèíàìè÷åñêèé ìàññèâ äëÿ ïóòåé
ReDim SearchPaths(1 To 1) ' Óêàæè çäåñü îáùåå êîëè÷åñòâî ïàïîê
SearchPaths(1) = "X:\2025 ãîä\14. Øóì\"
' SearchPaths(1) = MainFolderPath & "ÈÏ ßêèìîâ\Ïðîòîêîëû\"
' SearchPaths(2) = MainFolderPath & "ÓÌÂÄ\Ïðîòîêîëû\Ïå÷àòü\"
' SearchPaths(3) = MainFolderPath & "ßãîäíîå\Ïðîòîêîë\Ïå÷àòü\"
' SearchPaths(4) = MainFolderPath & "Âÿòàâòîäîð\"
' SearchPaths(5) = "X:\2025 ãîä\01. Àòìîñôåðà\"
Suffix = "ØÓÌ."
AllowPrint = True
' Ïîäñ÷åò îáùåãî êîëè÷åñòâà ðàáîòû
GlobalTotalCount = 0
For Each Cell In Selection
If Cell.Value <> "" And Cell.Interior.ColorIndex = xlNone Then
GlobalTotalCount = GlobalTotalCount + 1
End If
Next Cell
If GlobalTotalCount = 0 Then Exit Sub
Set FSO = CreateObject("Scripting.FileSystemObject")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
GlobalCurrentCount = 0
For Each Cell In Selection
DoEvents
Application.EnableCancelKey = xlErrorHandler
On Error GoTo StrictEmergencyStop
If Cell.Value <> "" Then
If Cell.Interior.ColorIndex <> xlNone Then GoTo SkipCell
GlobalCurrentCount = GlobalCurrentCount + 1
TargetNumber = Trim(CStr(Cell.Value)) & Suffix
' Ñáðîñ ïåðåìåííûõ ïåðåä ïîèñêîì íîâîãî ôàéëà
FileFound = False
CurrentFileName = ""
CurrentFilePath = ""
CurrentFileLocation = ""
Application.StatusBar = "Ñòàðò ïîèñêà: " & TargetNumber & "... (" & GlobalCurrentCount & "/" & GlobalTotalCount & ")"
DoEvents
' ÀÂÒÎÌÀÒÈ×ÅÑÊÈÉ ÎÁÕÎÄ ÂÑÅÕ ÏÀÏÎÊ ÈÇ ÑÏÈÑÊÀ
For PathIndex = LBound(SearchPaths) To UBound(SearchPaths)
If Not FileFound Then
If FSO.FolderExists(SearchPaths(PathIndex)) Then
Call FastSubFolderSearch(SearchPaths(PathIndex), TargetNumber, MainFolderPath)
End If
Else
Exit For
End If
Next PathIndex
' Îòðèñîâêà ðåçóëüòàòîâ ïîèñêà
Application.ScreenUpdating = True
DoEvents
If FileFound Then
' Ïî óìîë÷àíèþ êðàñèì â ñòàíäàðòíûé çåëåíûé
Cell.Interior.Color = RGB(198, 239, 206)
For TimeLeft = 3# To 0# Step -0.05
Application.StatusBar = "Íàéäåíî: " & CurrentFileName & " -> Ñêàíèðîâàíèå ñîäåðæèìîãî ëèñòîâ... (" & Format(TimeLeft, "0.00") & " ñåê)"
DoEvents
Sleep 50
Next TimeLeft
' Ïðîâåðêà ðàçðåøåíèÿ íà ïå÷àòü
If AllowPrint Then
Application.ScreenUpdating = False
Set WB = Workbooks.Open(Filename:=CurrentFilePath, UpdateLinks:=0, ReadOnly:=True)
' Ñáðîñ ôëàãîâ íàéäåííûõ êëþ÷åâûõ ñëîâ äëÿ íîâîãî ôàéëà
SheetsPrintedCount = 0
For i = 1 To 5
KeywordFound(i) = False
Next i
' Ïåðåáîð êëþ÷åâûõ ñëîâ ïî ïîðÿäêó ïðèîðèòåòà (îò 1 äî 5)
For i = 1 To 5
For Each WS In WB.Worksheets
' Èùåì êëþ÷åâîå ñëîâî ÂÍÓÒÐÈ ÿ÷ååê ëèñòà (ïî ÷àñòè÷íîìó ñîâïàäåíèþ, áåç ó÷åòà ðåãèñòðà)
Set FoundCell = Nothing
Set FoundCell = WS.Cells.Find(What:=Keywords(i), LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
' Åñëè ôðàçà íàéäåíà â ñîäåðæèìîì ëèñòà
If Not FoundCell Is Nothing Then
On Error Resume Next
WS.PrintOut
On Error GoTo 0
KeywordFound(i) = True
SheetsPrintedCount = SheetsPrintedCount + 1
Exit For ' Íàøëè ëèñò, ñîäåðæàùèé ýòî ñëîâî, ïåðåõîäèì ê ñëåäóþùåìó êëþ÷åâîìó ñëîâó
End If
Next WS
Next i
WB.Close SaveChanges:=False
' Åñëè íàøëè è ðàñïå÷àòàëè ìåíüøå 5 ëèñòîâ (êàêîé-òî òåêñò íå áûë íàéäåí)
If SheetsPrintedCount < 5 Then
Cell.Interior.Color = RGB(158, 213, 97) ' Ñâåòëî-çåëåíûé äëÿ íåïîëíîãî êîìïëåêòà
End If
Else
Application.StatusBar = "Íàéäåíî: " & CurrentFileName & " -> Ïå÷àòü ïðîïóùåíà (ïàðàìåòð AllowPrint = False)"
Cell.Interior.Color = RGB(226, 211, 120)
Sleep 2000
End If
Else
' Åñëè ôàéë ÍÅ íàéäåí
Application.StatusBar = "Ôàéë äëÿ " & TargetNumber & " ÍÅ ÍÀÉÄÅÍ! Ïåðåõîäèì ê ñëåäóþùåìó..."
Cell.Interior.Color = RGB(255, 199, 206) ' Êðàñíûé
DoEvents
Sleep 2000
Application.ScreenUpdating = False
End If
End If
SkipCell:
Next Cell
Application.StatusBar = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub
StrictEmergencyStop:
Application.StatusBar = False
DoEvents
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Ïðîöåññ îñòàíîâëåí ïîëüçîâàòåëåì!", vbCritical, "Îñòàíîâêà"
End Sub
' Ôóíêöèÿ ïîèñêà
Sub FastSubFolderSearch(ByVal FolderPath As String, ByVal FileNumber As String, ByVal MainPath As String)
Dim Folder As Object
Dim SubFolder As Object
Dim File As Object
Dim FirstNumInName As String
If FileFound Then Exit Sub
Application.StatusBar = "Èùó " & FileNumber & " â: " & Right(FolderPath, 30) & "... (" & GlobalCurrentCount & "/" & GlobalTotalCount & ")"
DoEvents
Set Folder = FSO.GetFolder(FolderPath)
For Each File In Folder.Files
If InStr(1, File.Name, ".xlsx", vbTextCompare) > 0 Or InStr(1, File.Name, ".xls", vbTextCompare) > 0 Then
FirstNumInName = Split(File.Name, " ")(0)
If StrComp(FirstNumInName, FileNumber, vbTextCompare) = 0 Then
FileFound = True
CurrentFileName = File.Name
CurrentFilePath = File.Path
CurrentFileLocation = "\" & Replace(File.ParentFolder.Path & "\", MainPath, "", 1, -1, vbTextCompare)
Exit Sub
End If
End If
Next File
For Each SubFolder In Folder.SubFolders
If FileFound Then Exit Sub
Call FastSubFolderSearch(SubFolder.Path & "\", FileNumber, MainPath)
Next SubFolder
End Sub