Страницы: 1
RSS
Обработчик файлов: определить диапазон вставки и вставить формулу VBA
 
Доброго времени суток

долго очень собирал обработчик файлов (к сожалению могу только пытаться использовать найденные макросы и править их для собственных нужд). Так и сейчас. В примере файл "Обработка файлов Excel", который перебирает все файлы в папке "Остаток" и вставляет туда модуль с пользовательской функцией для определения уровня строки в обрабатываемых файлах (для примера вложил файл "Файл для обработки" (а так их много, но они однотипные). Проблема в следующем: нужно чтобы пользовательская функция вставлялась в столбец А с ячейки А4 до последней не пустой строки которая определяется по столбцу В (то есть если функцию вставить в А4 , то формула должна быть  в ней =УРОВЕНЬСТРОКИ(В4) и так до последней строки в столбце B.)

Помогите пожалуйста.
Код
'//Процедура обрабатывает одинаковым способом все файлы Excel в каталоге
Sub TestProc()
    Dim FSO As FileSystemObject
    Dim sourceFolder As Folder
    Dim fileItem As File
    
    Dim objVBProj As Object, objVBComp As Object, objCodeMod As Object
    Dim sModuleName As String, sFullName As String
    Dim sProcLines As String
    Dim lLineNum As Long
    
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set sourceFolder = FSO.GetFolder("C:\Users\Admin\Desktop\Остатки")
    
    For Each fileItem In sourceFolder.Files
        Dim currentBook As Workbook
        Dim source As Worksheet
        
        Set currentBook = Workbooks.Open(fileItem.Path, False, False)
        
        'добавляем новый стандартный модуль в активную книгу
    Set objVBComp = ActiveWorkbook.VBProject.VBComponents.Add(1)
    'получаем ссылку на коды модуля
    Set objCodeMod = objVBComp.CodeModule
    'узнаем количество строк в модуле
    '(т.к. VBA в зависимости от настроек может добавлять строки деклараций)
    lLineNum = objCodeMod.CountOfLines + 1
    'текст всставляемой процедуры
    sProcLines = "Function УРОВЕНЬСТРОКИ(ЯЧЕЙКА As Range) As Long" & vbCrLf & _
        "УРОВЕНЬСТРОКИ = ЯЧЕЙКА.Rows(1).OutlineLevel" & vbCrLf & _
        "End Function"
    'вставляем текст процедуры в тело нового модуля
    objCodeMod.InsertLines lLineNum, sProcLines
        
        
        Set source = currentBook.Sheets(1)
        Range("A4").FormulaR1C1 = "=УРОВЕНЬСТРОКИ()"

        
        'Columns("A:A").Select
   'Selection.Copy
  '  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
        Application.DisplayAlerts = False
        currentBook.Close True
        Application.DisplayAlerts = True
        
        Set source = Nothing
        Set currentBook = Nothing
    Next
    
End Sub
 
1. В чём цель сего действа с модулем?
2. В xlsx макросы не живут!
3. В строке 38 функция вставляется буквально куда попало! Именно буквально.
4. Можно использовать автозаполнение: .AutoFill Destination:=Range("A4:A16"), а это число 16 определить например поиском слова "Итого".
 
1. процедуру определения уровня группировки можно написать без необходимости использовать параметр
Код
Function OutLevel()
  Dim rg As Range
  Set rg = Application.Caller
  OutLevel = rg.Parent.Rows(rg.Row).OutlineLevel
End Function
2. но и от вашей функции и от этой никакого толку, если после ее применения изменить уровень группировки строк, для которых она было применена (они не пересчитывают уровень АВТОМАТИЧЕСКИ при его изменении)
добавление в текст функции строки Application.Volatile - не решает вопрос полностью, но хоть заставляет ее пересчитаться по F9 или если пересчет вызван какими-то внещними причинами
так что целесообразность затеи весьма сомнительна
удачи!
Изменено: Ігор Гончаренко - 14.12.2019 16:03:13
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Hugo, спасибо за участие. Покопался еще в интернете и сделал как надо. Спасибо.
Страницы: 1
Наверх