Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 12.63 KB | None | 0 0
  1. Option Explicit 'оптимизирует и защищает, но усложняет жизнь
  2.  
  3.  
  4. 'ALERT!!! код нужно дописать в местах, где указан ALERT + желательно там, где указан Warning (но необязательно)
  5.  
  6.  
  7. Function Razmer(ByVal filename As String, What As String, ByVal size As Integer) As Integer 'size мы можем захотеть переопределить
  8. 'Функция для определения номера столбца What документа filename (ищет по строкам от 1 до size)
  9. Dim i As Long
  10. For i = 1 To size
  11.     If InStr(Workbooks(IIf(Len(filename) <> 0, filename, 1)).Worksheets(1).Cells(1, i), What) <> 0 Then
  12.         Razmer = i
  13.         Exit For
  14.     End If
  15. Next i
  16. End Function
  17.  
  18. Function Fileopener() As String
  19. 'Функция для открытия диалога выбора файла. Возвращает имя выбранного файла
  20. 'Нужно дописать ELSEIF .Show = 0, но конкретную логику реализовать в зависимости от рабочих задач, но пока не совсем понимаю как это встраивается в логику и как работает данная часть
  21. Dim fd As Office.FileDialog 'переменная для вызова диалога файла
  22. Dim filename As String
  23. Set fd = Application.FileDialog(msoFileDialogFilePicker)
  24. With fd
  25.  
  26.     .AllowMultiSelect = False
  27.     .Title = "Please select file"
  28.     .Filters.Clear
  29.     .Filters.Add "Excel", "*.xls?"
  30.  
  31.     If .Show = True Then
  32.         filename = Dir(.SelectedItems(1))
  33.     End If
  34. End With
  35.  
  36. Application.DisplayAlerts = False
  37. Fileopener = filename
  38. End Function
  39.  
  40. Sub Main()
  41. 'блок объявления переменных
  42. Dim ind As Integer 'количество столбцов исходного документа
  43. Dim nrow As Long 'количество строк исходного документа
  44. Dim pind As Integer 'номер столбца PIN исходного документа
  45. Dim npind As Integer 'номер столбца PIN документа для дописывания
  46. Dim nind As Integer 'количество столбцов документа для дописывания
  47. Dim mnrow As Long 'количество строк документа для дописывания
  48. Dim mnemind As Integer 'количество столбцов документа мнемоники
  49. Dim mnemrow As Long 'количество строк документа мнемоники
  50. Dim carcbr As Integer 'номер столбца carcbr документа мнемоники
  51. Dim icarcbr As Integer 'номер столбца carcbr документа для дописывания
  52. Dim cabad As Integer 'номер столбца мнемоники для связи с документом для дописывания
  53. Dim i As Long 'просто счётчик с помощью которого иттерируемся (для строк)
  54. Dim j As Integer 'ещё один вспомогательный счётчик для иттерации (для столбцов)
  55. Dim st As Integer 'количество столбцов (для переопределения)
  56. Dim mosind, regionind As Integer 'количество столбцов файлов москвы и регионов
  57. Dim mosrow, regionrow As Long 'количество строк файлов москвы и регионов
  58. Dim filename, mnemonic, mos, region As String 'соответствующие названия файлов
  59. Dim fcell As Range 'вспомогательная переменная для поиска совпадений файла мнемоники
  60.  
  61. 'блок начальной инициализации
  62. With Application
  63.     .ScreenUpdating = False: .EnableEvents = False: .Calculation = False 'отключил самое очевидное, что не нужно для быстродействия
  64. End With
  65.  
  66. 'блок сбора информации с исходного файла
  67. ThisWorkbook.Activate
  68. ind = Worksheets(1).Rows(1).End(xlToRight).Column + 1
  69. nrow = Worksheets(1).Columns(1).End(xlDown).row + 1
  70. pind = Razmer("", "PIN", ind)
  71. st = ind
  72. ind = Razmer("", "Статус оповещения", ind)
  73.  
  74. 'блок открытия файла для дозаписи для удобства Оли создал месседж бокс
  75. MsgBox "Выберите файл для дописывания"
  76. filename = Fileopener()
  77. Workbooks.Open (filename)
  78.  
  79. If Err <> 0 Then
  80.     MsgBox "Что-то пошло не так..."
  81.     Exit Sub
  82. End If
  83.  
  84. 'блок сбора информации о файле для дозаписи
  85. nind = Workbooks(filename).Worksheets(1).Rows(1).End(xlToRight).Column + 1
  86. mnrow = Workbooks(filename).Worksheets(1).Columns(1).End(xlDown).row + 1
  87. npind = Razmer(filename, "PIN", nind)
  88. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  89. 'icarcbr = Razmer(filename, "Мнемоника оповещения", nind) 'ALERT:Здесь не уверен - нужно уточнить у Кирилла
  90. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  91. nind = Razmer(filename, "Статус оповещения", nind)
  92.  
  93. 'блок дозаписи
  94. For i = 2 To nrow ' цикл по количеству строк исходного файла
  95.     If InStr(Workbooks(1).Worksheets(1).Cells(i, ind), "Non-participating FFI") <> 0 Then 'Если в очередной строке первоначального файла содержится нужная строка
  96.         If WorksheetFunction.CountIf( _
  97.         Workbooks(filename).Worksheets(1).Columns(npind), _
  98.         Workbooks(1).Worksheets(1).Cells(i, pind)) = 0 Then
  99.         ' если в соответствующем столбце файла для дозаписи нет ни 1 PIN'a очередной строки исходного файла
  100.        
  101.         For j = 1 To st
  102.             Set fcell = Workbooks(filename).Worksheets(1).Cells(1, 1).EntireRow.Find( _
  103.             Workbooks(1).Worksheets(1).Cells(1, j))
  104.             If Not fcell Is Nothing Then
  105.                 Workbooks(filename).Worksheets(1).Cells(mnrow, fcell.Column) = _
  106.                 Workbooks(1).Worksheets(1).Cells(i, j)
  107.             End If
  108.         Next j
  109.             'Workbooks(1).Worksheets(1).Cells(i, 1).EntireRow.Copy Workbooks(filename).Worksheets(1).Cells(mnrow, 1).EntireRow
  110.             'строка выше устарела
  111.            
  112.         ' вставляем из буфера всю строку в конец файла для дозаписи.
  113.         'WARNING: может закрасться ошибка, когда первый столбец частично не заполнен.
  114.         'перед запуском всей программы лучше заполнить ВСЕ пустые ячейки
  115.         'методами excel это сделать можно сразу несколькими способами.
  116.         'Так что, в качестве TO DO: доработать безопасность
  117.         Workbooks(1).Worksheets(1).Cells(i, 1).EntireRow.Interior.Color = vbCyan 'красим в бирюзовый новые данные
  118.         Workbooks(filename).Worksheets(1).Cells(mnrow, 1).EntireRow.Interior.Color = vbCyan 'красим в бирюзовый новые данные
  119.         mnrow = mnrow + 1
  120.         End If
  121.     End If
  122. Next i
  123.  
  124. 'блок открытия файла мнемоники
  125. 'MsgBox "Выберите файл мнемоники"
  126. 'mnemonic = Fileopener()
  127. 'Workbooks.Open (mnemonic)
  128. 'If Err <> 0 Then
  129.     'MsgBox "Что-то пошло не так..."
  130.     'Exit Sub
  131. 'End If
  132.  
  133. 'блок сбора информации о файле мнемоники
  134. 'mnemind = Workbooks(mnemonic).Worksheets(1).Rows(1).End(xlToRight).Column + 1
  135. 'mnemrow = Workbooks(mnemonic).Worksheets(1).Columns(1).End(xlDown).row + 1
  136. 'cabad = Razmer(mnemonic, "CABAD1", mnemind)
  137. 'carcbr = Razmer(mnemonic, "CARCBR", mnemind)
  138.  
  139. 'блок открытия файла для москвы
  140. MsgBox "Выберите файл москвы"
  141. mos = Fileopener()
  142. Workbooks.Open (mos)
  143. If Err <> 0 Then
  144.     MsgBox "Что-то пошло не так..."
  145.     Exit Sub
  146. End If
  147.  
  148. 'блок сбора информации о файле для москвы
  149. mosind = Workbooks(mos).Worksheets(1).Rows(1).End(xlToRight).Column + 1
  150. mosrow = Workbooks(mos).Worksheets(1).Columns(1).End(xlDown).row + 1
  151.  
  152.  
  153. 'блок открытия файла для регионов
  154. MsgBox "Выберите файл регионов"
  155. region = Fileopener()
  156. Workbooks.Open (region)
  157. If Err <> 0 Then
  158.     MsgBox "Что-то пошло не так..."
  159.     Exit Sub
  160. End If
  161.  
  162. 'блок сбора информации о файле для регионов
  163. regionind = Workbooks(region).Worksheets(1).Rows(1).End(xlToRight).Column + 1
  164. regionrow = Workbooks(region).Worksheets(1).Columns(1).End(xlDown).row + 1
  165.  
  166. 'блок сепарации файла дозаписи на файл москвы и регионов (не создаются, а тоже дозаписываются)
  167. 'WARNING: самый медленный блок. Можно подумать о методах для оптимизации.
  168. 'из неэфективных по памяти - кеширование, ассоциации для ячеек (пропускать те, которые уже были обработаны,
  169. 'алгоритмы неравномерного поиска, работа с более быстрыми контейнерами)
  170. 'из сомнительных выигрышей по времени - подбор более эффективного алгоритма поиска (сомнительный т.к для
  171. 'большинства наиболее эффективных потребуется делать ещё и сортировку, что может оказаться не лучшим решением)
  172. 'для большей уверености нужны оценки на живой выборке - а оно может и не надо никому...
  173. For i = 2 To mnrow 'по всем строкам документа для дописывания
  174.    
  175.     'Set fcell = Workbooks(mnemonic).Worksheets(1).Cells(2, carcbr).EntireColumn.Find( _
  176.     'Workbooks(filename).Worksheets(1).Cells(i, icarcbr))
  177.     'с помощью стандартного метода find ищем совпадения.
  178.     'WARNING: логика что делать если совпадений нет - не продумана. может привести к вылету
  179.     'If InStr(Workbooks(mnemonic).Worksheets(1).Cells(fcell.row, cabad), "MOCO") <> 0 Then 'по москве
  180.    
  181.     If InStr(1, Workbooks(filename).Worksheets(1).Cells(i, 12), "F_M", vbTextCompare) Then
  182.         For j = 1 To mosind
  183.             Set fcell = Workbooks(mos).Worksheets(1).Cells(1, 1).EntireRow.Find( _
  184.             Workbooks(filename).Worksheets(1).Cells(1, j))
  185.             If Not fcell Is Nothing Then
  186.                 Workbooks(mos).Worksheets(1).Cells(mnrow, fcell.Column) = _
  187.                 Workbooks(filename).Worksheets(1).Cells(i, j)
  188.             End If
  189.         Next j
  190.         'Workbooks(filename).Worksheets(1).Cells(i, 1).EntireRow.Copy Workbooks(mos).Worksheets(1).Cells(mosrow, 1).EntireRow
  191.         'строка выше устарела
  192.         Workbooks(mos).Worksheets(1).Cells(mosrow, 1).EntireRow.Interior.Color = vbCyan 'помечаем
  193.         mosrow = mosrow + 1
  194.        
  195.        
  196.     Else ' по регионам
  197.         For j = 1 To regionind
  198.             Set fcell = Workbooks(region).Worksheets(1).Cells(1, 1).EntireRow.Find( _
  199.             Workbooks(filename).Worksheets(1).Cells(1, j))
  200.             If Not fcell Is Nothing Then
  201.                 Workbooks(region).Worksheets(1).Cells(mnrow, fcell.Column) = _
  202.                 Workbooks(filename).Worksheets(1).Cells(i, j)
  203.             End If
  204.         Next j
  205.         'Workbooks(filename).Worksheets(1).Cells(i, 1).EntireRow.Copy Workbooks(region).Worksheets(1).Cells(regionrow, 1).EntireRow
  206.         'строка выше устарела
  207.         Workbooks(region).Worksheets(1).Cells(regionrow, 1).EntireRow.Interior.Color = vbCyan
  208.         regionrow = regionrow + 1
  209.     End If
  210. Next i
  211.  
  212. 'финализирующий блок. Сохраняем, закрываем
  213. Workbooks(mos).Save
  214. Workbooks(mos).Close
  215. Workbooks(region).Save
  216. Workbooks(region).Close
  217. Workbooks(filename).Save
  218. Workbooks(filename).Close
  219. With Application
  220.     .ScreenUpdating = True: .EnableEvents = True: .Calculation = True
  221. End With
  222.  
  223. MsgBox "Сделано"
  224.  
  225. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement