Advertisement
ExcelStore

Модуль iModule

Jan 14th, 2019
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2.  
  3.  
  4.  
  5. Sub TestData()
  6.     Dim rNew, rSource, rUpdate, rColor
  7.     Dim iWB As Workbook, rTemp, iRow As Long, i As Long, j As Long, k As Long, n As Long, x As Long
  8.     Dim iTime As Date, iUser As String, iPath As String, iFileName As String
  9.    
  10.     Application.ScreenUpdating = 0
  11.     Call ConnectOpen
  12.    
  13.     'формируем константы для записи в лог
  14.    iTime = Now: iUser = Environ("username")
  15.     iPath = Sheets("макрос").Range("ПутькФайлу").Value: iFileName = Right(iPath, Len(iPath) - InStrRev(iPath, "\"))
  16.  
  17.     'формируем массив из файла "Обновленные данные.xlsx"
  18.    Set iWB = Workbooks.Open(iPath, UpdateLinks:=False, ReadOnly:=True)
  19.     With iWB.Sheets("данные")
  20.         If .FilterMode = True Then .ShowAllData: .AutoFilter.Sort.SortFields.Clear
  21.         iRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
  22.         rNew = .Range(.Cells(2, 1), .Cells(iRow, 12)).Value
  23.     End With
  24.     iWB.Close False: Set iWB = Nothing
  25.    
  26.     'формируем массив из файла "Основной файл.xlsm"
  27.    With ThisWorkbook.Sheets("сводная")
  28.         If .FilterMode = True Then .ShowAllData: .AutoFilter.Sort.SortFields.Clear
  29.         iRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
  30.         rSource = .Range(.Cells(2, 1), .Cells(iRow, 12)).Value
  31.         .Range(.Cells(2, 1), .Cells(iRow, 12)).Interior.Pattern = xlNone
  32.     End With
  33.    
  34.     'формируем массив для обновленных значений, изначально равен исходному
  35.    rUpdate = rSource: rUpdate = TransposeArray(rUpdate)
  36.    
  37.     'формируем массив для цветовых значений, изначально пустой
  38.    ReDim rColor(1 To 1): rColor(1) = ""
  39.    
  40.     'проверяем наличие новых поставщиков
  41.    For i = 1 To UBound(rNew, 1)
  42.         If VBA.Trim(rNew(i, 7)) = "" Then GoTo STEP_1
  43.         x = SearchData(rNew(i, 7))
  44.  
  45.         If x = 0 Then
  46.             'если номер договора не найден в сводном отчете, то:
  47.            '1) в массив rUpdate добавляем новую строку, 2) в массиве rColor фиксируем изменение цвета
  48.            n = n + 1: If n > 1 Then ReDim Preserve rColor(1 To n)
  49.            
  50.             k = UBound(rUpdate, 2) + 1: ReDim Preserve rUpdate(1 To 12, 1 To k)
  51.             For j = 1 To 12: rUpdate(j, k) = rNew(i, j): Next j
  52.             rColor(n) = "5296274;A" & k + 1 & ":L" & k + 1
  53.            
  54.             'пишем лог в базу
  55.            Call InsertBase(iTime, iUser, iPath, iFileName, rNew(i, 7), rNew(i, 8), "СЧЕТ_РСБУ", "", rNew(i, 9))
  56.             Call InsertBase(iTime, iUser, iPath, iFileName, rNew(i, 7), rNew(i, 8), "СЧЕТ_МСФО", "", rNew(i, 10))
  57.             Call InsertBase(iTime, iUser, iPath, iFileName, rNew(i, 7), rNew(i, 8), "ДАТА_ДОКУМЕНТА", "", rNew(i, 11))
  58.             Call InsertBase(iTime, iUser, iPath, iFileName, rNew(i, 7), rNew(i, 8), "СУММА_RUR", "", rNew(i, 12))
  59.         Else
  60.             'если номер договора уже присутствует в сводном отчете, то проверяем изменились ли наши контрольные ячейки
  61.            For j = 9 To 12
  62.                 If rSource(x - 1, j) <> rNew(i, j) Then
  63.                     'пишем лог в базу
  64.                    Call InsertBase(iTime, iUser, iPath, iFileName, rNew(i, 7), rNew(i, 8), CheckName(j), rUpdate(j, x - 1), rNew(i, j))
  65.                    
  66.                     'осуществляем подставноку значений
  67.                    rUpdate(j, x - 1) = rNew(i, j)
  68.                     n = n + 1: If n > 1 Then ReDim Preserve rColor(1 To n)
  69.                     rColor(n) = "65535;" & Split(Cells(1, j).Address, "$")(1) & x
  70.                 End If
  71.             Next j
  72.         End If
  73.        
  74. STEP_1:
  75.     Next i
  76.    
  77.     'вставляем массив rUpdate на лист, если есть измененные данные
  78.    If rColor(1) <> "" Then
  79.         rUpdate = TransposeArray(rUpdate)
  80.         With ThisWorkbook.Sheets("сводная")
  81.             'вставляем данные на лист
  82.            .Range(.Cells(2, 1), .Cells(UBound(rUpdate, 1) + 1, 12)).Value = rUpdate
  83.            
  84.             'форматируем новые строки по аналогии с первой строкой данных
  85.            .Range("A2:L2").Copy
  86.             .Range(.Cells(2, 1), .Cells(UBound(rUpdate, 1) + 1, 12)).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  87.             Application.CutCopyMode = False: .Activate: .Cells(1, 1).Activate
  88.         End With
  89.        
  90.         'задаем цвета измененным ячейкам
  91.        For i = 1 To UBound(rColor, 1)
  92.             rTemp = Split(rColor(i), ";")
  93.             ThisWorkbook.Sheets("сводная").Range(rTemp(1)).Interior.Color = rTemp(0)
  94.         Next i
  95.     End If
  96.    
  97.    
  98.     'добавить историю изменений, чтобы смотреть при клике по ячейке
  99.    
  100.     CN.Close: Set CN = Nothing
  101.     Application.ScreenUpdating = 1
  102.    
  103.     MsgBox "Работа макроса завершена", vbInformation
  104. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement