Страницы: 1
RSS
Форматирование файла Excel, Постоянно форматируем файл руками, есть ли возможность для автоматизации
 
Привет всем!
Есть такой вопрос - у нас из 1С выгружается файл страшного вида. Если не именно такой формат, то очень похожий (см. вложение 1й лист). И постоянно руками все это дело обрабатывается до состояния как на 2м листе (см. вложение). Соответственно, вопрос - есть ли вообще техническая возможность автоматизировать подобное? Я не прошу написать код, что-то сделать для меня. Мне нужно понимать - это возможно автоматизировать? Если да, то какими средствами? Может быть, PQ, VBA, еще что-то. Я вот просто не могу пока придумать как это сделать. Если подскажете, будет супер
Изменено: Felix55 - 15.07.2024 14:35:26
 
Техническая возможность автоматизировать подобное есть. Это возможно автоматизировать. Можно автоматизировать, например, VBA или PQ.
 
Спасибо) ну да, какой вопрос, такой ответ, согласен ))) если есть возможность, поделитесь примерами или разборами в интернете? Я просто даже не могу загуглить правильно ))
 
Выложите пример получше, мы вам код напишем.

Получше - в смысле понятнее, чем в том файле, что вы выложили. В файле непонятно, откуда взялось "ГСП-23-001".
Лучше свяжите формулами второй лист с первым.
Изменено: МатросНаЗебре - 15.07.2024 14:23:53
 
Цитата
Felix55 написал:
из 1С выгружается файл страшного вида
сформируйте отчет в 1С такой как надо или покажите своим айтишникам "что в итоге" хотите получить.. ;)
любой отчет в 1С неокончательное решение и поддается редактированию.. даже на уровне пользователя..
Изменено: BodkhiSatva - 15.07.2024 14:32:20
 
Цитата
написал:
покажите своим айтишникам
Мне проще и быстрее выучить VBA, PQ и самому допереть как это сделать, чем ждать, пока наши айтишники что-то сделают))
 
Цитата
написал:
Выложите пример получше
Постарался попонятнее сделать
 
Код
Option Explicit

Sub myReport()
    Dim arr As Variant
    arr = GetFromSheet(Sheets(1))
    PrintArr arr
End Sub

Private Function GetFromSheet(sh As Worksheet) As Variant
    With sh
        Dim arr As Variant
        arr = .Range(.Cells(1, 1), .Cells(.UsedRange.Row + sh.UsedRange.Rows.Count - 1, .UsedRange.Column + sh.UsedRange.Columns.Count - 1)).Value
        
        Dim brr As Variant
        ReDim brr(1 To UBound(arr, 1), 1 To 16)
        
        Dim sName As String
        Dim yb As Long
        Dim ys As Long
        For ys = sh.UsedRange.Row To sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
            Select Case sh.Cells(ys, 1).IndentLevel
            Case 1
                sName = arr(ys, 1)
            Case 4
                yb = yb + 1
                brr(yb, 2) = arr(ys, 1)
                brr(yb, 3) = sName
                brr(yb, 11) = arr(ys, 5)
                brr(yb, 12) = arr(ys, 6)
                brr(yb, 16) = arr(ys, 10)
            End Select
        Next
    End With
    GetFromSheet = brr
End Function

Private Sub PrintArr(arr As Variant)
    With Workbooks.Add(1)
        With .Worksheets(1)
            With .Cells(3, 1).Resize(UBound(arr, 1), UBound(arr, 2))
                .Value = arr
            End With
        End With
    End With
End Sub
 
Цитата
Felix55 написал:
Постарался попонятнее сделать
Опираться можно на
Код
Function iLevel(r As Range)
    iLevel = r.IndentLevel
End Function

 
Как так быстро??  8-0  Спасибо!!!!! Это значит, что это всего лишь я тормоз  :D
Отработал корректно для части, буду разбирать для дальнейшего использования)
 
Hugo, Вы имеете ввиду, что при разбитии на такие вот уровни и от этого как-то плясать? А уровни проставились через эту функцию?
 
Код
Option Explicit
'v2
Sub myReport()
    CloseEmptyWb
    Dim arr As Variant
    arr = GetFromSheet(ActiveSheet)
    If Not IsEmpty(arr) Then PrintArr arr
End Sub

Private Function GetFromSheet(sh As Worksheet) As Variant
    With sh
        Dim arr As Variant
        arr = .Range(.Cells(1, 1), .Cells(.UsedRange.Row + sh.UsedRange.Rows.Count - 1, .UsedRange.Column + sh.UsedRange.Columns.Count - 1)).Value
        
        Dim brr As Variant
        ReDim brr(1 To UBound(arr, 1), 1 To 17)
                
        Dim crr As Variant
        ReDim crr(1 To 10)
                
        Dim xb As Long
        Dim yb As Long
        Dim ys As Long
        For ys = sh.UsedRange.Row To sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
            Select Case sh.Cells(ys, 1).IndentLevel
            Case 0
                crr(7) = arr(ys, 1)
            Case 1
                crr(3) = arr(ys, 1)
            Case 2
                crr(1) = arr(ys, 1)
                crr(4) = arr(ys, 4)
                crr(5) = arr(ys, 3)
                crr(6) = arr(ys, 2)
            Case 3
                crr(8) = arr(ys, 1)
                crr(9) = arr(ys, 2)
                crr(10) = arr(ys, 3)
            Case 4
                yb = yb + 1
                
                For xb = 1 To UBound(crr)
                    brr(yb, xb) = crr(xb)
                Next
                
                brr(yb, 2) = arr(ys, 1)
                brr(yb, 11) = arr(ys, 5)
                
                For xb = 12 To 17
                    brr(yb, xb) = arr(ys, xb - 6)
                Next
            End Select
        Next
    End With
    If yb > 0 Then
        ResizeArray brr, yb
        GetFromSheet = brr
    End If
End Function

Private Sub ResizeArray(arr As Variant, nn As Long)
    If nn <= 0 Then Exit Sub
    If nn = UBound(arr, 2) Then Exit Sub
    Dim brr As Variant
    ReDim brr(1 To nn, 1 To UBound(arr, 2))
    
    Dim yb As Long
    Dim xb As Long
    For yb = 1 To UBound(brr, 1)
        For xb = 1 To UBound(brr, 2)
            brr(yb, xb) = arr(yb, xb)
        Next
    Next
    arr = brr
End Sub

Private Sub PrintArr(arr As Variant)
    With Workbooks.Add(1)
        With .Worksheets(1)
            With .Cells(2, 1).Resize(UBound(arr, 1), UBound(arr, 2))
                .Columns(2).NumberFormat = "@"
                .Value = arr
                
                .Columns(1).ColumnWidth = 29
                .Columns(2).ColumnWidth = 10
                .Columns(3).ColumnWidth = 19
                .Columns(4).ColumnWidth = 19
                .Columns(5).ColumnWidth = 19
                .Columns(6).ColumnWidth = 19
                .Columns(7).ColumnWidth = 20
                .Columns(8).ColumnWidth = 34
                .Columns(9).ColumnWidth = 46
                .Columns(10).ColumnWidth = 19
                .Columns(11).ColumnWidth = 8
                .Columns(12).ColumnWidth = 18
                .Columns(13).ColumnWidth = 18
                .Columns(14).ColumnWidth = 18
                .Columns(15).ColumnWidth = 18
                .Columns(16).ColumnWidth = 18
                .Columns(17).ColumnWidth = 18

            End With
        End With
    End With
End Sub

Private Sub CloseEmptyWb()
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        If wb.Path = "" Then wb.Close False
    Next
End Sub
 
Цитата
Felix55 написал:
А уровни проставились через эту функцию?
- уровни проставила 1С, и на это можно опираться. Функция просто их считывает, проще визуально оценить когда алгоритм продумываешь, ну и как далее использовать.
Вот в коде Матроса:
Код
Select Case sh.Cells(ys, 1).IndentLevel

а я ленивый ))
 
МатросНаЗебре, спасибо большое, все работает! Теперь буду разбираться как это работает, чтобы потом под новые форматы использовать)
Страницы: 1
Читают тему
Наверх