Страницы: Пред. 1 2
RSS
Копирование данных по ФИО в другую книгу
 
Простите что встреваю но у меня так же вопрос:
А как изменится макрос если просиходит копирование диапозона ячеек строки в другую книгу (без ее создания) при совпадении условия, но с проверкой, что по этому условию ешще нет данных в книге. (чтобы избежать повторных копирований).
 
alex_j, Создайте новую тему, и озвучьте вопрос, честно я не совсем все понял.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, я Вам писал в личку.
Код
Sub ФИКС_СОХРАНИТЬ()
Dim dic As Object, ikey, msg$
Dim book As Workbook, book1 As Workbook
Dim sht As Worksheet, i&, j&, x&, y&, arr(), arr1(), arr2()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
Set book = ThisWorkbook
Set dic = CreateObject("scripting.dictionary")
Set sht = book.Sheets(5)
With sht
    arr1 = .Range("a1:i1")
    arr = .Range(.Cells(2, 1), Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count))
End With
j = UBound(arr, 2)
For i = LBound(arr) To UBound(arr)
    If arr(i, j) = "Курск" Then
        dic.Item(CStr(arr(i, j))) = dic.Item(CStr(arr(i, j))) + 1
    Else: dic.Item(CStr(arr(i, 6))) = dic.Item(CStr(arr(i, 6))) + 1
    End If
    MkDir book.Path & "\" & arr(i, j)
Next i
On Error GoTo 0
For Each ikey In dic.keys
    y = 0
    ReDim arr2(1 To dic.Item(ikey), 1 To j - 1)
    If ikey = "Курск" Then
        For i = 1 To UBound(arr)
            If arr(i, j) = ikey Then
                msg = arr(i, j): y = y + 1
                For x = 1 To UBound(arr2, 2)
                    arr2(y, x) = arr(i, x)
                Next x
            End If
        Next i
    Else
        For i = 1 To UBound(arr)
            If arr(i, 6) = ikey And arr(i, j) <> "Курск" Then
                msg = arr(i, j): y = y + 1
                For x = 1 To UBound(arr2, 2)
                    arr2(y, x) = arr(i, x)
                Next x
            End If
        Next i
    End If
Set book1 = Workbooks.add
With book1
    .SaveAs Filename:=book.Path & "\" & msg & "\" & ikey & ".xlsx"
    With .Sheets(1)
        .Range("a1").Resize(, UBound(arr1, 2)) = arr1
        .Range("a2").Resize(UBound(arr2), UBound(arr2, 2)) = arr2
        .Cells.EntireColumn.AutoFit
    End With
    .Close True
End With
Next ikey
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
На выходе после Вашего кода получается множество файлов (я чуть изменил код так как добавились столбцы)Возможно ли в выходном файле чтобы находилась последняя заполненная строка и через строку от нее добавлялось как в примере с формулами как в находящихся рядом ячейках (там только суммы по столбцам и разница)
Изменено: muwkagammy - 26.07.2017 13:38:54
 
В файле вырезка колонки расположены иначе , чем в начальном файле. Пример нужен с начальным расположением столбцов.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, я добавил несколько столбцов в начальном файле и переделал чуть код - то что я выложил Выше уже подходит под сохранение в нужном мне формате. Но я понял, что Вы просите. Файл прилагаю.
 
нужен переделанный код, у меня на выходе совершенно по другому столбцы расставлены, т.е. как в начальном оригинале!
И не понятно откуда цифры должны браться?
"Все гениальное просто, а все простое гениально!!!"
 
Код который я выложил уже является переделанным (там буквально небольшие изменения внесены)
Цифры:
Итого - первый столбец количество - сумма по столбцу ОПС для данного файла, второй столбец сумма по столбцу сумма
Аванс - заполняется вручную потом
Итого к выплате - только разница между Итого и нижестоящей ячейкой из строки аванс.
Приложил файл с коментариями.
 
Процедуру можно использовать отдельно, или вставить в "тело" вашей процедуры, я обычно делаю ссылку через
Код
Call


Код
Sub test()
Dim lastrow&
lastrow = Cells(Rows.Count, "h").End(xlUp).Row
Range("g" & lastrow + 2).Resize(3) = _
    Application.Transpose(Array("Итого:", "Аванс:", "Итого к выплате"))
Range("h" & lastrow + 2).Resize(, 2).FormulaR1C1 = "=sum(r[-" & lastrow & "]c:r[-2]c)"
Range("i" & lastrow + 4).FormulaR1C1 = "=r[-2]c-r[-1]c"
End Sub

Если делать по ссылке, то во избежание недоразумений переменную  созданной книги (если не ошибаюсь book1) передайте в эту процедуру, а здесь воспользуйтесь конструкцией
Код
With book1.Sheets(1).....End With
Изменено: Nordheim - 26.07.2017 22:31:02
"Все гениальное просто, а все простое гениально!!!"
 
Осталось только понять куда нужно вставить вызов процедуры ... не подскажете?) мне же нужно чтобы он это прописывал не в файле исходнике а в сохраняемых файлах...
Изменено: muwkagammy - 27.07.2017 10:03:28
 
Код
With .Sheets(1)
        .Range("a1").Resize(, UBound(arr1, 2)) = arr1
        .Range("a2").Resize(UBound(arr2), UBound(arr2, 2)) = arr2
        .Cells.EntireColumn.AutoFit
Сюда втавляем
    End With


этот код и декларируем переменную
Код
 lastrow
Код
lastrow = .Cells(.Rows.Count, "h").End(xlUp).Row
.Range("g" & lastrow + 2).Resize(3) = _
    Application.Transpose(Array("Итого:", "Аванс:", "Итого к выплате"))
.Range("h" & lastrow + 2).Resize(, 2).FormulaR1C1 = "=sum(r[-" & lastrow & "]c:r[-2]c)"
.Range("i" & lastrow + 4).FormulaR1C1 = "=r[-2]c-r[-1]c"
"Все гениальное просто, а все простое гениально!!!"
 
СУПЕР! Спасибо Nordheim!
Можете подсказать какие нибудь пособия для обучения vba а то самому тоже хочется начать разбираться)
 
Уокенбах Дж. - Excel 2010. Профессиональное программирование на VBA - 2012. Почти все по нему изучал! Кроме переменных и циклов! Переменные и циклы понял только у Лукин С.Н. - Visual Basic. Но на тот момент я не искал по форумам, а только учебную литературу. Посмотрите на сайте у Дмитрия (The_Prist), можно поучиться
Сайт. Ну а практикуюсь в основном здесь, но много и других форумов (у того же Дмитрия аналогичный есть или тут).
Так что Удачи и успехов в освоении VBA!
Изменено: Nordheim - 27.07.2017 10:33:48
"Все гениальное просто, а все простое гениально!!!"
Страницы: Пред. 1 2
Наверх