Страницы: 1
RSS
Создание файла из 1С на основе шаблона
 
Всем привет!
Друзья, подскажите.
Из 1С заполняю файл excel по шаблону. С некоторых пор при выгрузке валится ошибка VBA Несоответствие типов (ошибка 13).
Из кода 1С я только знаю, что вызываю запуск макроса, который называется FillData.
Макрос я открыл, но не могу теперь понять как мне понять, в какой строке ошибка валится, т.к. файл дальше не создается и я не знаю, на каком именно этапе ошибка. Можно ли как-то запускать отладку в VBA в еще не созданном файле?
Код
Public Sub FillData()
    Set ЛистСПараметрами = Sheets("Параметры")
    Set ОсновнойЛист = Sheets("Основной")
    Set ЛистИсполнит = Sheets("Исполнит")
    Set ЛистПремия = Sheets("Премия")
    Set ЛистПечать1_15 = Sheets("Печать 1-15")
    Set ЛистПечать15_31 = Sheets("Печать 16-31")
    Set ЛистПечать = Sheets("Печать")
    
    ОсновнойЛист.EnableCalculation = False
    ЛистИсполнит.EnableCalculation = False
    ЛистПремия.EnableCalculation = False
    ЛистПечать1_15.EnableCalculation = False
    ЛистПечать15_31.EnableCalculation = False
    ЛистПечать.EnableCalculation = False
    
    ексНомерСтроки = "A17"
    ексФИОСотрудника = "B17"
    ексДолжностьСотрудника = "B19"
    ексТабельныйНомерСотрудника = "C17"
    ексВсегоЧасовНорма = "AQ17"
    ексПереработки = "BD17"

    ексНормаСНачалаГода = "BC17"
    ексФактСНачалаГода = "BA17"
    ексПервыйДеньМесяца = "BW17"
    ексПоследнийДеньМесяца = "BX17"
    ексКолонкаПервыйДеньМесяца = "BW"
    ексКолонкаПоследнийДеньМесяца = "BX"
    
    ексИспФИОСотрудника = "A17"
    ексИспДолжностьСотрудника = "A18"
    ексИспПодразделение = "A14"
    ексИспВсегоЧасовНорма = "AG17"

    ексПремияНомерСтроки = "A17"
    ексПремияФИОСотрудника = "B17"
    ексПремияДолжностьСотрудника = "D17"
    ексПремияТабельныйНомерСотрудника = "C17"
    ексПремияОкладСотрудника = "K17"

    ИмяФайлаДанных = ОсновнойЛист.Cells(1, 2)
    ОсновнойЛист.Cells(1, 2) = ""
    Open ИмяФайлаДанных For Input As #1
    Dim КоличествоСтрок, НомерСтроки As Integer
    Dim КоличествоСтрок1_15, КоличествоСтрок15_31 As Integer ' Количество строк в табелях первой и второй половин месяца
     
    Input #1, КоличествоСтрок
    
    КоличествоСтрок1_15 = 0
    КоличествоСтрок15_31 = 0
    
    БлокировкаПервойПоловиныМесяца = ЛистСПараметрами.Cells(33, 3).Value = "Да"
    
    For i = 0 To КоличествоСтрок - 1
        ЛистСПараметрами.Rows("1:4").Copy
        ОсновнойЛист.Rows("17:17").Insert (xlShiftDown)
        
        If БлокировкаПервойПоловиныМесяца Then
            ОсновнойЛист.Range(ОсновнойЛист.Cells(17, 4), ОсновнойЛист.Cells(20, 18)).Locked = True
        End If
        
        Input #1, НомерСтроки
        Input #1, Сотрудник
        Input #1, Должность
        Input #1, ТабельныйНомер
        
        Input #1, НормаСНачалаГода
        Input #1, ФактСНачалаГода
        Input #1, ПервыйДеньРаботы
        Input #1, ПоследнийДеньРаботы
        Input #1, МесячнаяНорма
        Input #1, Оклад
        
        ОсновнойЛист.Range(ексНомерСтроки).Value = НомерСтроки
        ОсновнойЛист.Range(ексФИОСотрудника).Value = Сотрудник
        ОсновнойЛист.Range(ексДолжностьСотрудника).Value = Должность
        ОсновнойЛист.Range(ексТабельныйНомерСотрудника).Value = ТабельныйНомер
        
        ОсновнойЛист.Range(ексНормаСНачалаГода).Value = НормаСНачалаГода
        ОсновнойЛист.Range(ексФактСНачалаГода).Value = ФактСНачалаГода
        ОсновнойЛист.Range(ексПервыйДеньМесяца).Value = ПервыйДеньРаботы
        ОсновнойЛист.Range(ексПоследнийДеньМесяца).Value = ПоследнийДеньРаботы
        
        ЛистИсполнит.Rows("17:18").Copy
        If i > 0 Then
            ЛистИсполнит.Rows("17:18").Insert (1)
        End If
        ЛистИсполнит.Range(ексИспФИОСотрудника).Value = Сотрудник
        ЛистИсполнит.Range(ексИспДолжностьСотрудника).Value = Должность
        ЛистИсполнит.Range(ексИспВсегоЧасовНорма).Value = МесячнаяНорма
        
        ЛистПремия.Rows("17:17").Copy
        If i > 0 Then
             ЛистПремия.Rows("17:17").Insert (1)
        End If
        
        ЛистПремия.Range(ексПремияНомерСтроки).Value = НомерСтроки
        ЛистПремия.Range(ексПремияФИОСотрудника).Value = Сотрудник
        ЛистПремия.Range(ексПремияДолжностьСотрудника).Value = Должность
        ЛистПремия.Range(ексПремияТабельныйНомерСотрудника).Value = ТабельныйНомер
        
        ЛистПремия.Range(ексПремияОкладСотрудника).Value = Оклад
        ЛистПремия.Cells(17, 13).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(17, 38).Address, "$", "")
        
        Input #1, ДнейВМесяце
        
        For День = 1 To 15
            Input #1, ВидВремени
            If ВидВремени <> "нет" Then
                ОсновнойЛист.Cells(17, День + 3).Value = ВидВремени
                Input #1, РабочиеЧасы
                If РабочиеЧасы <> "НетРабочихЧасов" Then
                    ЗначениеРабочихЧасов = CDec(Mid(РабочиеЧасы, 13))
                    ОсновнойЛист.Cells(18, День + 3).Value = ЗначениеРабочихЧасов
                    ЛистИсполнит.Cells(17, День + 1).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(18, День + 3).Address, "$", "")
                    ЛистПремия.Cells(17, 13).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(17, 38).Address, "$", "")
                Else
                    ОсновнойЛист.Cells(18, День + 3).Value = ""
                    ЛистИсполнит.Cells(17, День + 1).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(18, Ид + 3).Address, "$", "")
                    ЛистПремия.Cells(17, 13).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(17, 38).Address, "$", "")
                End If
                
                Input #1, НочныеЧасы
                If НочныеЧасы <> "НетНочныхЧасов" Then
                    ЗначениеНочныхЧасов = CDec(Mid(НочныеЧасы, 12))
                    ОсновнойЛист.Cells(19, День + 3).Value = "Н"
                    ОсновнойЛист.Cells(20, День + 3).Value = ЗначениеНочныхЧасов
                Else
                    ОсновнойЛист.Cells(19, День + 3).Value = "=""?"""
                End If
            End If
        Next

        For День = 16 To ДнейВМесяце
            Input #1, ВидВремени
            If ВидВремени <> "нет" Then
                ОсновнойЛист.Cells(17, День + 4).Value = ВидВремени
                Input #1, РабочиеЧасы
                If РабочиеЧасы <> "НетРабочихЧасов" Then
                    ЗначениеРабочихЧасов = CDec(Mid(РабочиеЧасы, 13))
                    
                    ОсновнойЛист.Cells(18, День + 4).Value = ЗначениеРабочихЧасов
                    ЛистИсполнит.Cells(17, День + 1).Value = ЗначениеРабочихЧасов
                    ЛистИсполнит.Cells(17, День + 1).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(18, День + 4).Address, "$", "")
                Else
                    ОсновнойЛист.Cells(18, День + 4).Value = ""
                    ЛистИсполнит.Cells(17, День + 1).Formula = "=Основной!" + Replace(ОсновнойЛист.Cells(18, День + 4).Address, "$", "")
                End If
                
                Input #1, НочныеЧасы
                If НочныеЧасы <> "НетНочныхЧасов" Then
                    ЗначениеНочныхЧасов = CDec(Mid(НочныеЧасы, 12))
                    ОсновнойЛист.Cells(19, День + 4).Value = "Н"
                    ОсновнойЛист.Cells(20, День + 4).Value = ЗначениеНочныхЧасов
                Else
                    ОсновнойЛист.Cells(19, День + 4).Value = "=""?"""
                End If
            End If
        Next
        
        'Расчет количества строк в табелях за 1ю и 2ю половины месяца
        If ПервыйДеньРаботы <= 15 Then
            КоличествоСтрок1_15 = КоличествоСтрок1_15 + 1
        End If
        If ПоследнийДеньРаботы >= 16 Or ПоследнийДеньРаботы = 0 Then
            КоличествоСтрок15_31 = КоличествоСтрок15_31 + 1
        End If
        
    Next
    
    '  Листы печати
    For i = 1 To КоличествоСтрок - 1
        ЛистПечать.Rows("20:27").Copy
        ЛистПечать.Rows("20:27").Insert
    Next
    
    For i = 1 To КоличествоСтрок1_15 - 1
        ЛистПечать1_15.Rows("20:27").Copy
        ЛистПечать1_15.Rows("20:27").Insert
    Next
         
    For i = 1 To КоличествоСтрок15_31 - 1
        ЛистПечать15_31.Rows("20:27").Copy
        ЛистПечать15_31.Rows("20:27").Insert
    Next
    
    Call ВывестиТабельНаПечать(ЛистПечать, КоличествоСтрок, "", 0, ОсновнойЛист, ДнейВМесяце)
    Call ВывестиТабельНаПечать(ЛистПечать1_15, КоличествоСтрок, ексКолонкаПервыйДеньМесяца, 1, ОсновнойЛист, ДнейВМесяце)
    Call ВывестиТабельНаПечать(ЛистПечать15_31, КоличествоСтрок, ексКолонкаПоследнийДеньМесяца, 2, ОсновнойЛист, ДнейВМесяце)
        
    Close #1
    
    ОсновнойЛист.EnableCalculation = True
    ЛистИсполнит.EnableCalculation = True
    ЛистПремия.EnableCalculation = True
    ЛистПечать1_15.EnableCalculation = True
    ЛистПечать15_31.EnableCalculation = True
    ЛистПечать.EnableCalculation = True
    
    'На всякий случай еще раз пересчет
    ОсновнойЛист.Range("AQ:BE").Dirty
    ОсновнойЛист.Calculate
    
End Sub
 
В начале процедуры вставьте Option Explicit
и запустите макрос в пошаговом режиме
 
Видна рука программиста 1С :)
Каждая переменная - это откушенна часть оперативной памяти. А у Вас этих переменных...

Цитата
Kuzmich написал: В начале процедуры вставьте Option Explicit
Поправка: в начале модуля, перед всеми процедурами и глобальными переменными.

Совет-дополнение к совету Kuzmich'а: между вставкой Option Explicit и пошаговой отладкой попробуйте  скомпилировать код (закладка Debug-Compile VBAProject). Редактор укажет на ошибку. После устранения - опять компиляция.... пока все ошибки компиляции не будут устранены.
 
vikttur, =))

Вообщем разобрался. Да, там код действительно очень странный. Но пока не понял как его разобрать.
 
Дополнил сообщение (о компиляции)
 
Подскажите пожалуйста, в процедуре есть конструкция:
Код
Open ИмяФайлаДанных For Input As #1
и далее такая:
Код
Input #1, ДнейВМесяце
...
Input #1, РабочиеЧасы

не могу понять что значит #1
Как эта переменная меняется и считывается? По конструкции input #1, РабочиеЧасы в файле ищем строку РабочиеЧасы и считываем эту переменную?

И второй вопрос, когда строка в файле имеет вид "Иванов Иван Иванович (вн. совм., ув.) внутр. совм.", т.е. когда в строке есть символ запятая, то она считывается до запятой. Как сделать чтобы строка считывалась полностью игнорируя символ запятой?
Изменено: РусланЧ - 04.06.2020 12:08:36
Страницы: 1
Наверх