Копирование данных с одной книги в другую - VBA

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Помогите пожалуйста с задачей, а именно: ко мне приходит файл с данными книга Б, там находится n количество таблиц, мне нужно взять только определенный столбец из определенных таблиц. Т.е. контрольные образцы и те, что с ними сравнивают к примеру, в прикрепленном файле надо скопировать столбец начиная со строки Мг/л и до конца, сначала из таблицы которая выделена зеленым, потом из красной, потом следующая зеленая табл, красная и так до конца. Копировать нужно в книгу А, по формату представленную в ней, т.е. столбик за стобиком В идеале мне нужно получить сводную таблицу как приложенная книга А, т.е. пройтись по всей книге Б, и скопировать столбцы из каждой подсвеченной таблицы всей книги (листов может быть с десяток). P.S. если реализовать выборку по цвету невозможно, предложите как их отделить друг от друга (м.б. так Лаб №4133(контр), Лаб №4106(подконтр)), т.е. книгу Б можно подредактировать для удобства реализации данной задачи и потом использовать как шаблон. Задача, как мне кажется, очень сложная в плане многочисленных условий, но я буду очень рад любой помощи и советам. Заранее благодарен.

Решение задачи: «Копирование данных с одной книги в другую»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Sub Obnovit()
  4.     Dim wbp As Workbook: Set wbp = ActiveWorkbook
  5.     Dim shp As Worksheet: Set shp = wbp.Worksheets("Лист1")
  6.     Dim lcp, m(), sln: Set sln = CreateObject("Scripting.Dictionary")
  7.     Dim wbi As Workbook, fil, mi()
  8.     Dim shi As Worksheet, rx As Range, rx2 As Range, addres
  9.     Dim rn As Range, fnd: fnd = "Лаб"
  10.     Dim r!, t, zv, lsp, i, lcj
  11.    
  12.     'очистка листа1 от значений, заливки и памок
  13.    With shp
  14.          lcp = .Cells(.Rows.Count, 3).End(xlUp).Row
  15.          m = .Range("C1").Resize(lcp).Value
  16.          Set rx = .Range("D4").Resize(55, shp.UsedRange.Columns.Count)
  17.          rx.ClearContents
  18.          rx.Interior.ColorIndex = 0
  19.          rx.Borders.LineStyle = 0
  20.     End With
  21.    
  22.     Application.ScreenUpdating = False ' что б не моргало и быстрей работало
  23.    
  24.     For r = 8 To lcp ' заливаем в словарь номера строк ионов на случай если в таблицах будет перепутано
  25.        t = m(r, 1)
  26.         If InStr(1, t, "ион") = 0 Then
  27.             sln(t) = r
  28.         End If
  29.     Next r
  30.    
  31.     'ищем рядом файл но не активную книгу
  32.    fil = Dir(wbp.Path & "\*.xlsx")
  33.     Do While fil = wbp.Name
  34.        fil = Dir
  35.     If Len(fil) = 0 Then Exit Sub
  36.     Loop
  37.    
  38.     'собираем путь и открываем книгу
  39.    fil = wbp.Path & "" & fil
  40.     Set wbi = Workbooks.Open(fil)
  41.    
  42.    
  43.     For Each shi In wbi.Worksheets ' перебираем листы в книге
  44.        With shi
  45.             Set rn = .Columns("A:D") ' где искать
  46.            Set rx = rn.Cells.Find(fnd, After:=.Cells(1, 1)) ' ищем начиная сверху
  47.            If Not rx Is Nothing Then ' если нашли
  48.                addres = rx.Address ' запоминаем адрес что бы на зациклилось
  49.                Do ' начинаем цикл по всем таблицам в первом столбце таблиц колонки A-D
  50.                r = rx.Row ' строка с найденным значением
  51.                    lcj = Cells(6, shp.Columns.Count).End(xlToLeft).Column + 1 ' последняя занятая ячейка в найденной строке
  52.                    For c = 1 To lcj ' по всем ячейкам строки
  53.                        If InStr(1, .Cells(r, c), "лаб", vbTextCompare) > 0 Then ' если в ячейке есть "лаб"
  54.                            Set rx2 = .Cells(r, c) ' назначаем переменноой (не обязательно, но записи дальше будут короче)
  55.                            If rx2.Interior.ColorIndex <> 0 And rx2.Interior.ColorIndex <> xlNone Then ' если залита любым цветом
  56.                                mi = rx2.Resize(63, 2).Value ' считываем в массив
  57.                                zv = rx2.Interior.ColorIndex ' и запоминаем цвет
  58.                                lsp = shp.Cells(6, shp.Columns.Count).End(xlToLeft).Column + 1 ' находим первую пустую ячейку в 6 строке на листе приёма данных
  59.                                shp.Cells(4, lsp) = Split(mi(1, 1), "№")(1) ' выделяем номер лаб и записываем в ячейку( можно было бы писать в массив и потом вываливать на лист. Было бы быстрее
  60.                                shp.Cells(6, lsp) = "Мг/л"
  61.                                 For i = 8 To UBound(mi) ' по считанному массиву значений
  62.                                    t = sln(mi(i, 1)) ' из словаря находим номер строки иона
  63.                                    If Len(t) > 0 Then ' если есть номер строки. Может не оказаться в случае опечатки
  64.                                        shp.Cells(t, lsp) = mi(i, 2) ' записываем значение
  65.                                    End If
  66.                                 Next i
  67.                              shp.Cells(6, lsp).Resize(52).Interior.ColorIndex = zv ' заливаем цветом лабы блок ячеек
  68.                            End If
  69.                         End If
  70.                     Next c ' следующая ячейка в строке
  71.                   Set rx = rn.Cells.FindNext(rx) ' ищем следующую таблицу на листе в колонках A-D
  72.                Loop While addres <> rx.Address ' повторяем цикл если адрес найденной ячейки не равен первому
  73.            End If
  74.         End With
  75.     Next
  76.     wbi.Close False
  77.     shp.Range("D34").Resize(, lsp - 3).FormulaR1C1 = "=SUM(R[-26]C:R[-1]C)" ' вбиваем формулы
  78.    shp.Range("D46").Resize(, lsp - 3).FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)" ' вбиваем формулы
  79.    shp.Range("D6").Resize(52, lsp - 3).Borders.LineStyle = 1 ' делаем рамку
  80.    Application.ScreenUpdating = True
  81. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы