Конвертер из Excel в xml в VBA

alex;
Дата: 08.02.2016 20:50:45
Упарился я его переделывать
мож
кому пригодиться

Option Compare Database
Option Explicit

Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long


Private Sub btnProcess_Click()
On Error GoTo Error_
Dim fl1 As Integer, ErrCount As Integer
Me.Dirty = False
    If Nz(Me!path_xml, "") = "" Then
        MsgBox "Сначала надо выбрать путь куда сохранять"
        Exit Sub
    End If
    If Nz(Me!КодСтраховойОрганизации, 0) = 0 Then
        MsgBox "Сначала надо выбрать страховую компанию"
        Exit Sub
    End If
    If Nz(Me!КодВидаСтрахования, 0) = 0 Then
        MsgBox "Сначала надо выбрать вид страхования"
        Exit Sub
    End If
    
    mdTools.SaveBaseXml Me!path_xml
    
'Начинаем
Dim wa As Object 'Object 'Excel.Application
Dim wd As Object 'Object 'Excel.Workbook
Dim ws As Object 'Object 'Excel.Worksheet
Dim c1 As Object 'Object 'Excel.Cell

Dim ts1 As Object
Dim fs As New fso
Dim first_row As Long, last_row As Long, tmp_int As Integer, tmp_dbl As Double, tmp_str As String
Dim ii As Integer, jj As Integer, kk As Integer, curdog As String, cursub As String, curreg As String, prevdog As String, prevsub As String, prevreg As String
Dim curdog8 As String, cursub8 As String, curreg8 As String, prevdog8 As String, prevsub8 As String, prevreg8 As String
Dim payments_all As Double, payments_gov As Double
Dim ListName As String, ListNumber As Integer, tmpCellName As String
    Set wa = CreateObject("Excel.Application")
    Set wd = wa.WorkBooks.Open(Me!path_xls)
'Выбор листа
    If wd.Sheets.Count > 1 Then
        Set wd_ = wd
        DoCmd.OpenForm "frmList1", , , , , acDialog, Me.Name
        If IsLoaded("frmList1") Then
            If Nz(Forms("frmList1")!lst1, 0) = 0 Then
                DoCmd.Close acForm, "frmList1"
                Set wd_ = Nothing
                GoTo Exit_
            Else
                ListName = Forms("frmList1")!lst1.Column(1)
                wd.Sheets(ListName).Select
                DoCmd.Close acForm, "frmList1"
                Set wd_ = Nothing
            End If
        End If
    Else
        ListName = wd.Sheets(1).Name
    End If
    ListNumber = wd.Sheets(ListName).Index
'Определение размеров
    wa.Cells(1, 1).Select
    wa.Range(wa.Selection, wa.ActiveCell.SpecialCells(xlLastCell)).Select
    last_row = wa.ActiveCell.SpecialCells(xlLastCell).row
    
    wa.Columns("A:A").Select
    wa.Selection.Find(What:="1", After:=wa.ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    
    first_row = wa.ActiveCell.row

    wa.Rows(first_row & ":" & first_row).Select
    wa.Selection.Delete Shift:=xlUp

'Go
    DoCmd.SetWarnings False
    DoCmd.RunSQL "delete * from TempДоговорыДтСлучаи"
    DoCmd.RunSQL "alter table TempДоговорыДтСлучаи alter column Код counter(1,1)"
    DoCmd.RunSQL "delete * from TempДоговорыДт"
    DoCmd.RunSQL "alter table TempДоговорыДт alter column Код counter(1,1)"

Dim rst As DAO.Recordset, rst2 As DAO.Recordset, КодДоговора As String, f As Field
Dim rstEv As DAO.Recordset

Dim flEdit As Boolean
DoCmd.OpenForm "frmProcess", acNormal
Forms!frmProcess.Caption = "Запись во временную талицу"
Forms!frmProcess.Repaint
Forms!frmProcess!ProgressBar.Max = last_row - first_row

    Set ts1 = fs.fso.OpenTextFile(Me!path_xml, 8, 0, -2)  '8=ForAppending, -1=Юникод
    
    For ii = first_row To last_row
Forms!frmProcess!ProgressBar.Value = ii - first_row
Forms!frmProcess.Repaint
If Len(wa.Cells(ii, 1)) = 0 Then Exit For
If Asc(Left(wa.Cells(ii, 1), 1)) < 48 Or Asc(Left(wa.Cells(ii, 1), 1)) > 57 Then Exit For
    Set rst = CurrentDb.OpenRecordset("select * from TempДоговорыДт")
    
        КодДоговора = Nz(DLookup("Код", "TempДоговорыДт", "number = """ & wa.Cells(ii, mdTags.GetPos("number")) & _
                                                          """ and region = """ & wa.Cells(ii, mdTags.GetPos("region")) & _
                                                          """ and subject_name = """ & wa.Cells(ii, mdTags.GetPos("subject_name")) & """"), 0)
        If КодДоговора = 0 Then
            flEdit = False
            rst.AddNew
            КодДоговора = rst!Код
        Else
            flEdit = True
            rst.MoveFirst
'            rst.FindFirst
            rst.Filter = "Код = " & КодДоговора
            Set rst2 = rst.OpenRecordset
            
'If rst!number <> wa.Cells(ii, mdTags.GetPos("number")) Then Stop
            rst2.Edit
        End If
        
        If flEdit Then
            For Each f In rst2.Fields
                If f.Name = "insurance_amount" Or f.Name = "insurance_premium" Or f.Name = "payments_all" Or f.Name = "payments_gov" Then
                    f.Value = f.Value + IIf(wa.Cells(ii, mdTags.GetPos(f.Name)) = "", 0, wa.Cells(ii, mdTags.GetPos(f.Name)))
                End If
            Next
            rst2.Update
        Else
            For Each f In rst.Fields
                If f.Name <> "Код" Then
                    tmp_str = Trim(wa.Cells(ii, mdTags.GetPos(f.Name)))
                    If f.Type = 8 And tmp_str <> "" Then
                        f.Value = wa.Cells(ii, mdTags.GetPos(f.Name))
                        GoTo Next1
                    End If
                    f.Value = IIf(tmp_str = "", Null, tmp_str)
Next1:
                End If
            Next
            rst.Update
        End If
        If Len(wa.Cells(ii, mdTags.GetPos("event_description"))) > 0 Then
            Set rstEv = CurrentDb.OpenRecordset("select * from TempДоговорыДтСлучаи where " & _
                "КодДоговора = " & КодДоговора & _
                " and event_description = """ & wa.Cells(ii, mdTags.GetPos("event_description")) & """")
            If rstEv.RecordCount > 0 Then
                rstEv.MoveFirst
                rstEv.Edit
                Set f = rstEv.Fields("estimation_value")
                f.Value = f.Value + IIf(wa.Cells(ii, mdTags.GetPos(f.Name)) = "", 0, wa.Cells(ii, mdTags.GetPos(f.Name)))
                Set f = rstEv.Fields("payment_val")
                f.Value = f.Value + IIf(wa.Cells(ii, mdTags.GetPos(f.Name)) = "", 0, wa.Cells(ii, mdTags.GetPos(f.Name)))
            Else
                rstEv.AddNew
                rstEv!КодДоговора = КодДоговора
                For jj = 2 To rstEv.Fields.Count - 1
                    tmp_str = Trim(wa.Cells(ii, mdTags.GetPos(rstEv.Fields(jj).Name)))
                    If rstEv.Fields(jj).Type = 8 And tmp_str <> "" Then
                        rstEv.Fields(jj).Value = wa.Cells(ii, mdTags.GetPos(rstEv.Fields(jj).Name))
                        GoTo Next2
                    End If
                    rstEv.Fields(jj).Value = IIf(tmp_str = "", Null, tmp_str)
Next2:
                Next
            End If
            rstEv.Update
        End If
    Next ii
    
    wd.Close False
    Set wd = Nothing
    Set wa = Nothing
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM TempДоговорыДтДляXML ORDER BY number, region, subject_name")
    If rst.RecordCount > 0 Then
        rst.MoveLast
        rst.MoveFirst
    End If
    
Forms!frmProcess.Caption = "Запись в файл"
Forms!frmProcess.Repaint
Forms!frmProcess!ProgressBar.Max = rst.RecordCount
    ii = 0
    While Not rst.EOF
        ii = ii + 1
Forms!frmProcess!ProgressBar.Value = ii
Forms!frmProcess.Repaint
        
        curdog = rst!number
        cursub = rst!subject_name
        curreg = rst!region
        
        If prevdog <> rst!number Then
            ts1.WriteLine Space(4 * 1) & "<ContractData>"
            ts1.WriteLine Space(4 * 2) & "<insurance_company_code>" & Me![КодСтраховойОрганизации].Column(2) & "</insurance_company_code>"
            ts1.WriteLine Space(4 * 2) & "<InsuranceKind>" & rst!КодВидаСтрахования & "</InsuranceKind>"
            ts1.WriteLine Space(4 * 2) & "<region>" & ToUTF8(rst!region) & "</region>"
            ts1.WriteLine Space(4 * 2) & "<number>" & ToUTF8(rst!number) & "</number>"
            ts1.WriteLine Space(4 * 2) & "<date_contract>" & Format(rst!date_contract, "yyyy-mm-dd") & "</date_contract>"
            ts1.WriteLine Space(4 * 2) & "<begin_date>" & Format(rst!date_contract, "yyyy-mm-dd") & "</begin_date>"
            ts1.WriteLine Space(4 * 2) & "<end_date>" & Format(rst!end_date, "yyyy-mm-dd") & "</end_date>"
            'Получаем суммарные данные
tmp_str = Round(DSum("payments_all", "TempДоговорыДт", "number = """ & rst!number & """"), 2)
            ts1.WriteLine Space(4 * 2) & "<payments_all>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</payments_all>"
tmp_str = Round(DSum("payments_gov", "TempДоговорыДт", "number = """ & rst!number & """"), 2)
            ts1.WriteLine Space(4 * 2) & "<payments_gov>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</payments_gov>"
        End If

        If Not (prevdog = rst!number And prevsub = rst!subject_name And prevreg = rst!region) Then
            kk = 1
            ts1.WriteLine Space(4 * 2) & "<SubjectData>"
            ts1.WriteLine Space(4 * 3) & "<subject_name>" & ToUTF8(rst!subject_name) & "</subject_name>"
            ts1.WriteLine Space(4 * 3) & "<subject_size>0</subject_size>"
tmp_str = Round(DSum("insurance_amount", "TempДоговорыДт", "number = """ & rst!number & """" & _
                                                           " and region = """ & rst!region & """" & _
                                                           " and subject_name = """ & rst!subject_name & """" _
                                                            ), 2) 'rst!insurance_amount
            ts1.WriteLine Space(4 * 3) & "<insurance_amount>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</insurance_amount>"
tmp_str = Round(DSum("insurance_premium", "TempДоговорыДт", "number = """ & rst!number & """" & _
                                                           " and region = """ & rst!region & """" & _
                                                           " and subject_name = """ & rst!subject_name & """" _
                                                            ), 2) 'rst!insurance_premium, 2)
            ts1.WriteLine Space(4 * 3) & "<insurance_premium>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</insurance_premium>"
tmp_dbl = rst!franshiza
'If tmp_dbl > 30 Then tmp_dbl = 30
            ts1.WriteLine Space(4 * 3) & "<franshiza>" & Replace(tmp_dbl, ",", ".") & "</franshiza>"
            ts1.WriteLine Space(4 * 3) & "<franshiza_agr>" & ToUTF8("Нет") & "</franshiza_agr>"
        Else
            kk = kk + 1
        End If
        If kk = 1 Then ts1.WriteLine Space(4 * 3) & "<event_info>"

        Set rstEv = CurrentDb.OpenRecordset("select * from TempДоговорыДтСлучаи where " & _
            "КодДоговора = " & rst!Код)
        If rstEv.RecordCount > 0 Then 'Дата страхового случая не пустая
            ts1.WriteLine Space(4 * 4) & "<event_description>" & ToUTF8(rstEv!event_description) & "</event_description>"
            ts1.WriteLine Space(4 * 4) & "<event_date>" & Format(rstEv!event_date, "yyyy-mm-dd") & "</event_date>"
            ts1.WriteLine Space(4 * 4) & "<event_size>0</event_size>"
            ts1.WriteLine Space(4 * 4) & "<damage_info>"
tmp_str = Round(Nz(rstEv!estimation_value, 0), 2)
            ts1.WriteLine Space(4 * 5) & "<estimation_value>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</estimation_value>"
            ts1.WriteLine Space(4 * 5) & "<payment_date>" & Format(rstEv!payment_date, "yyyy-mm-dd") & "</payment_date>"
tmp_str = Round(Nz(rstEv!payment_val, 0), 2)
            ts1.WriteLine Space(4 * 5) & "<payment_val>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</payment_val>"
            ts1.WriteLine Space(4 * 4) & "</damage_info>"
            ts1.WriteLine Space(4 * 4) & "<refusal_info>"
            ts1.WriteLine Space(4 * 5) & "<act_date></act_date>"
            ts1.WriteLine Space(4 * 5) & "<refusal_reason></refusal_reason>"
            ts1.WriteLine Space(4 * 5) & "<refusal_inf></refusal_inf>"
            ts1.WriteLine Space(4 * 4) & "</refusal_info>"
        Else
            If kk = 1 Then
                ts1.WriteLine Space(4 * 4) & "<event_description></event_description>"
                ts1.WriteLine Space(4 * 4) & "<event_date></event_date>"
                ts1.WriteLine Space(4 * 4) & "<event_size></event_size>"
                ts1.WriteLine Space(4 * 4) & "<damage_info>"
                ts1.WriteLine Space(4 * 5) & "<estimation_value></estimation_value>"
                ts1.WriteLine Space(4 * 5) & "<payment_date></payment_date>"
                ts1.WriteLine Space(4 * 5) & "<payment_val></payment_val>"
                ts1.WriteLine Space(4 * 4) & "</damage_info>"
                ts1.WriteLine Space(4 * 4) & "<refusal_info>"
                ts1.WriteLine Space(4 * 5) & "<act_date></act_date>"
                ts1.WriteLine Space(4 * 5) & "<refusal_reason></refusal_reason>"
                ts1.WriteLine Space(4 * 5) & "<refusal_inf></refusal_inf>"
                ts1.WriteLine Space(4 * 4) & "</refusal_info>"
            End If
        End If
        If kk = 1 Then ts1.WriteLine Space(4 * 3) & "</event_info>"
        
        prevdog = curdog
        prevreg = curreg
        prevsub = cursub
        
        rst.MoveNext
        
        If rst.EOF Then
            ts1.WriteLine Space(4 * 2) & "</SubjectData>"
            ts1.WriteLine Space(4 * 1) & "</ContractData>"
            GoTo Wend_
        End If
        If Not (curdog = rst!number And cursub = rst!subject_name And curreg = rst!region) Then
            ts1.WriteLine Space(4 * 2) & "</SubjectData>"
        End If
        If curdog <> rst!number Then
            ts1.WriteLine Space(4 * 1) & "</ContractData>"
        End If
        
Wend_:
    Wend
    
    ts1.WriteLine "</ContractList>"
DoCmd.SetWarnings True
    MsgBox "Готово"
Exit_:

DoCmd.Close acForm, "frmProcess"
    If Not wd Is Nothing Then wd.Close False
    Set wd = Nothing
    Set wa = Nothing
    
Exit2_:
DoCmd.Hourglass False
    Exit Sub
Error_:
    ErrCount = ErrCount + 1
    Select Case fl1
    Case 1
        MsgBox "Ошибка в строке " & ii + 1 & " и в колонке " & tmpCellName
    Case 2
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    Case 3
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    Case 4
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    End Select
    'Debug.Print Err.Source, Err.HelpContext
    Call GetError(Err.number, Err.Description, Me.Name, "btnProcess_Click")
    If ErrCount = 1 Then
        Resume Exit_
    Else
        Resume Exit2_
    End If

End Sub

Private Sub btnProcess_Click_Old()
On Error GoTo Error_
Dim fl1 As Integer, ErrCount As Integer
Me.Dirty = False
    If Nz(Me!path_xml, "") = "" Then
        MsgBox "Сначала надо выбрать путь куда сохранять"
        Exit Sub
    End If
    If Nz(Me!КодСтраховойОрганизации, 0) = 0 Then
        MsgBox "Сначала надо выбрать страховую компанию"
        Exit Sub
    End If
    If Nz(Me!КодВидаСтрахования, 0) = 0 Then
        MsgBox "Сначала надо выбрать вид страхования"
        Exit Sub
    End If
    
    mdTools.SaveBaseXml Me!path_xml
    
'Начинаем
Dim wa As Object 'Object 'Excel.Application
Dim wd As Object 'Object 'Excel.Workbook
Dim ws As Object 'Object 'Excel.Worksheet
Dim c1 As Object 'Object 'Excel.Cell

Dim ts1 As Object
Dim fs As New fso
Dim first_row As Long, last_row As Long, tmp_int As Integer, tmp_dbl As Double, tmp_str As String
Dim ii As Integer, jj As Integer, curdog As String, cursub As String, curreg As String, prevdog As String, prevsub As String, prevreg As String
Dim curdog8 As String, cursub8 As String, curreg8 As String, prevdog8 As String, prevsub8 As String, prevreg8 As String
Dim payments_all As Double, payments_gov As Double
Dim ListName As String, ListNumber As Integer, tmpCellName As String
    Set ts1 = fs.fso.OpenTextFile(Me!path_xml, 8, 0, -2)  '8=ForAppending, -1=Юникод
    Set wa = CreateObject("Excel.Application")
    Set wd = wa.WorkBooks.Open(Me!path_xls)
'Выбор листа
    If wd.Sheets.Count > 1 Then
        Set wd_ = wd
        DoCmd.OpenForm "frmList1", , , , , acDialog, Me.Name
        If IsLoaded("frmList1") Then
            If Nz(Forms("frmList1")!lst1, 0) = 0 Then
                DoCmd.Close acForm, "frmList1"
                Set wd_ = Nothing
                GoTo Exit_
            Else
                ListName = Forms("frmList1")!lst1.Column(1)
                wd.Sheets(ListName).Select
                DoCmd.Close acForm, "frmList1"
                Set wd_ = Nothing
            End If
        End If
    Else
        ListName = wd.Sheets(1).Name
    End If
    ListNumber = wd.Sheets(ListName).Index
'Определение размеров
    wa.Cells(1, 1).Select
    wa.Range(wa.Selection, wa.ActiveCell.SpecialCells(xlLastCell)).Select
    last_row = wa.ActiveCell.SpecialCells(xlLastCell).row
    
    wa.Columns("A:A").Select
    wa.Selection.Find(What:="1", After:=wa.ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    
    first_row = wa.ActiveCell.row

    wa.Rows(first_row & ":" & first_row).Select
    wa.Selection.Delete Shift:=xlUp
    
'Создание сводных таблиц
    wd.Sheets.Add After:=wd.Sheets(wd.Sheets.Count)
    wd.Sheets(wd.Sheets.Count).Name = "Summary1"
    wd.Sheets.Add After:=wd.Sheets(wd.Sheets.Count)
    wd.Sheets(wd.Sheets.Count).Name = "Summary2"
    wd.Sheets(ListNumber).Select
    Set ws = wd.Sheets(ListNumber)
    Set c1 = wa.ActiveCell

'1
    wa.Sheets("Summary1").Select
    wa.ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        ListName & "!R" & first_row - 1 & "C1:R" & last_row & "C16", Version:=xlPivotTableVersion12).CreatePivotTable _
        TableDestination:="Summary1!R2C2", TableName:="pvt1", _
        DefaultVersion:=xlPivotTableVersion12

    tmpCellName = c1.Offset(-1, 1)
    mdTags.Update_tmpCellName "number", tmpCellName
    With wa.ActiveSheet.PivotTables("pvt1").PivotFields( _
        tmpCellName)
        .Orientation = xlRowField
        .Position = 1
    End With
    tmpCellName = c1.Offset(-1, mdTags.GetPos("payments_all") - 1)
    mdTags.Update_tmpCellName "payments_all", tmpCellName
    wa.ActiveSheet.PivotTables("pvt1").AddDataField wa.ActiveSheet.PivotTables _
        ("pvt1").PivotFields(tmpCellName), _
        "Сумма по полю " & tmpCellName, xlSum
    tmpCellName = c1.Offset(-1, GetPos("payments_gov") - 1)
    mdTags.Update_tmpCellName "payments_gov", tmpCellName
    wa.ActiveSheet.PivotTables("pvt1").AddDataField wa.ActiveSheet.PivotTables _
        ("pvt1").PivotFields(tmpCellName), _
        "Сумма по полю " & tmpCellName, xlSum
    wa.ActiveWorkbook.ShowPivotTableFieldList = False
    wa.ActiveSheet.PivotTables("pvt1").RowAxisLayout xlTabularRow
'2
    wa.Sheets("Summary2").Select
    wa.ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        ListName & "!R" & first_row - 1 & "C1:R" & last_row & "C16", Version:=xlPivotTableVersion12).CreatePivotTable _
        TableDestination:="Summary2!R2C2", TableName:="pvt2", _
        DefaultVersion:=xlPivotTableVersion12

    tmpCellName = c1.Offset(-1, 1)
'    mdTags.Update_tmpCellName "number", tmpCellName
    With wa.ActiveSheet.PivotTables("pvt2").PivotFields( _
        tmpCellName)
        .Orientation = xlRowField
        .Position = 1
    End With
    tmpCellName = c1.Offset(-1, mdTags.GetPos("region") - 1)
    mdTags.Update_tmpCellName "region", tmpCellName
    With wa.ActiveSheet.PivotTables("pvt2").PivotFields( _
        tmpCellName)
        .Orientation = xlRowField
        .Position = 2
    End With
    tmpCellName = c1.Offset(-1, mdTags.GetPos("subject_name") - 1)
    mdTags.Update_tmpCellName "subject_name", tmpCellName
    With wa.ActiveSheet.PivotTables("pvt2").PivotFields( _
        tmpCellName)
        .Orientation = xlRowField
        .Position = 3
    End With
    tmpCellName = c1.Offset(-1, mdTags.GetPos("insurance_amount") - 1)
    mdTags.Update_tmpCellName "insurance_amount", tmpCellName
    wa.ActiveSheet.PivotTables("pvt2").AddDataField wa.ActiveSheet.PivotTables _
        ("pvt2").PivotFields(tmpCellName), _
        "Сумма по полю " & tmpCellName, xlSum
    tmpCellName = c1.Offset(-1, GetPos("insurance_premium") - 1)
    mdTags.Update_tmpCellName "insurance_premium", tmpCellName
    wa.ActiveSheet.PivotTables("pvt2").AddDataField wa.ActiveSheet.PivotTables _
        ("pvt2").PivotFields(tmpCellName), _
        "Сумма по полю " & tmpCellName, xlSum
    wa.ActiveWorkbook.ShowPivotTableFieldList = False
    wa.ActiveSheet.PivotTables("pvt2").RowAxisLayout xlTabularRow

    wa.ActiveSheet.PivotTables("pvt2").PivotFields(Get_tmpCellName("number")). _
        Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
    wa.ActiveSheet.PivotTables("pvt2").PivotFields(Get_tmpCellName("region")). _
        Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
    wa.ActiveSheet.PivotTables("pvt2").PivotFields(Get_tmpCellName("subject_name")). _
        Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)

    wd.Sheets(ListNumber).Select

DoCmd.OpenForm "frmProcess", acNormal
Forms!frmProcess.Repaint
Forms!frmProcess!ProgressBar.Max = last_row - first_row

    For ii = first_row To last_row
Forms!frmProcess!ProgressBar.Value = ii - first_row
Forms!frmProcess.Repaint
If Len(wa.Cells(ii, 1)) = 0 Then Exit For
If Asc(Left(wa.Cells(ii, 1), 1)) < 48 Or Asc(Left(wa.Cells(ii, 1), 1)) > 57 Then Exit For
        curdog = wa.Cells(ii, mdTags.GetPos("number"))
        cursub = wa.Cells(ii, mdTags.GetPos("subject_name"))
        curreg = wa.Cells(ii, mdTags.GetPos("region"))
        curdog8 = ToUTF8(curdog)
        cursub8 = ToUTF8(cursub)
        curreg8 = ToUTF8(curreg)
        If prevdog <> curdog Then
            ts1.WriteLine Space(4 * 1) & "<ContractData>"
            ts1.WriteLine Space(4 * 2) & "<insurance_company_code>" & Me![КодСтраховойОрганизации].Column(2) & "</insurance_company_code>"
            ts1.WriteLine Space(4 * 2) & "<InsuranceKind>" & Me!КодВидаСтрахования & "</InsuranceKind>"
            ts1.WriteLine Space(4 * 2) & "<region>" & curreg8 & "</region>"
            ts1.WriteLine Space(4 * 2) & "<number>" & curdog8 & "</number>"
            ts1.WriteLine Space(4 * 2) & "<date_contract>" & Format(wa.Cells(ii, mdTags.GetPos("date_contract")), "yyyy-mm-dd") & "</date_contract>"
            ts1.WriteLine Space(4 * 2) & "<begin_date>" & Format(wa.Cells(ii, mdTags.GetPos("begin_date")), "yyyy-mm-dd") & "</begin_date>"
            ts1.WriteLine Space(4 * 2) & "<end_date>" & Format(wa.Cells(ii, mdTags.GetPos("end_date")), "yyyy-mm-dd") & "</end_date>"
            'Получаем суммарные данные
            wa.Worksheets("Summary1").Activate
            wa.Columns("B:B").Select
            wa.Selection.Find(What:=curdog, After:=wa.ActiveCell, LookIn _
                :=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
                xlNext, MatchCase:=False, SearchFormat:=False).Activate
tmp_str = wa.Cells(wa.ActiveCell.row, 3)
            ts1.WriteLine Space(4 * 2) & "<payments_all>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</payments_all>"
tmp_str = wa.Cells(wa.ActiveCell.row, 4)
            ts1.WriteLine Space(4 * 2) & "<payments_gov>" & Replace(IIf(tmp_str = "", "0", tmp_str), ",", ".") & "</payments_gov>"
            wd.Sheets(1).Select
        End If

        If Not (prevdog = curdog And prevsub = cursub And prevreg = curreg) Then
            ts1.WriteLine Space(4 * 2) & "<SubjectData>"
            ts1.WriteLine Space(4 * 3) & "<subject_name>" & cursub8 & "</subject_name>"
            ts1.WriteLine Space(4 * 3) & "<subject_size>0</subject_size>"
            'Получаем суммарные данные
            wa.Worksheets("Summary2").Activate
            wa.Columns("B:B").Select
            wa.Selection.Find(What:=curdog, After:=wa.ActiveCell, LookIn _
                :=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
                xlNext, MatchCase:=False, SearchFormat:=False).Activate
            wa.ActiveCell.Offset(0, 1).Select
            While wa.ActiveCell <> curreg
                wa.ActiveCell.Offset(1, 0).Select
            Wend
            wa.ActiveCell.Offset(0, 1).Select
            While wa.ActiveCell <> cursub
                wa.ActiveCell.Offset(1, 0).Select
            Wend

            ts1.WriteLine Space(4 * 3) & "<insurance_amount>" & Replace(wa.Cells(wa.ActiveCell.row, 5), ",", ".") & "</insurance_amount>"
            ts1.WriteLine Space(4 * 3) & "<insurance_premium>" & Replace(wa.Cells(wa.ActiveCell.row, 6), ",", ".") & "</insurance_premium>"
            wa.Worksheets(ListNumber).Activate
fl1 = 1
tmpCellName = "Франшиза"
tmp_str = Replace(wa.Cells(ii, mdTags.GetPos("franshiza")), ",", ".")
tmp_dbl = IIf(tmp_str = "", 0, Val(tmp_str))
fl1 = 0
If tmp_dbl > 30 Then tmp_dbl = 30
            ts1.WriteLine Space(4 * 3) & "<franshiza>" & Replace(tmp_dbl, ",", ".") & "</franshiza>"
            ts1.WriteLine Space(4 * 3) & "<franshiza_agr>" & ToUTF8("Нет") & "</franshiza_agr>"
        End If
        ts1.WriteLine Space(4 * 2) & "<event_info>"
        If wa.Cells(ii, 13) <> "" Then 'Дата страхового случая не пустая
            ts1.WriteLine Space(4 * 4) & "<event_description>" & ToUTF8(wa.Cells(ii, mdTags.GetPos("event_description"))) & "</event_description>"
            ts1.WriteLine Space(4 * 4) & "<event_date>" & Format(wa.Cells(ii, mdTags.GetPos("event_date")), "yyyy-mm-dd") & "</event_date>"
            ts1.WriteLine Space(4 * 4) & "<event_size>0</event_size>"
            ts1.WriteLine Space(4 * 4) & "<damage_info>"
            ts1.WriteLine Space(4 * 5) & "<estimation_value>" & Replace(wa.Cells(ii, mdTags.GetPos("estimation_value")), ",", ".") & "</estimation_value>"
            ts1.WriteLine Space(4 * 5) & "<payment_date>" & Format(wa.Cells(ii, mdTags.GetPos("payment_date")), "yyyy-mm-dd") & "</payment_date>"
            ts1.WriteLine Space(4 * 5) & "<payment_val>" & Replace(wa.Cells(ii, mdTags.GetPos("payment_val")), ",", ".") & "</payment_val>"
            ts1.WriteLine Space(4 * 4) & "</damage_info>"
            ts1.WriteLine Space(4 * 4) & "<refusal_info>"
            ts1.WriteLine Space(4 * 5) & "<act_date></act_date>"
            ts1.WriteLine Space(4 * 5) & "<refusal_reason></refusal_reason>"
            ts1.WriteLine Space(4 * 5) & "<refusal_inf></refusal_inf>"
            ts1.WriteLine Space(4 * 4) & "</refusal_info>"
        Else
            ts1.WriteLine Space(4 * 4) & "<event_description></event_description>"
            ts1.WriteLine Space(4 * 4) & "<event_date></event_date>"
            ts1.WriteLine Space(4 * 4) & "<event_size></event_size>"
            ts1.WriteLine Space(4 * 4) & "<damage_info>"
            ts1.WriteLine Space(4 * 5) & "<estimation_value></estimation_value>"
            ts1.WriteLine Space(4 * 5) & "<payment_date></payment_date>"
            ts1.WriteLine Space(4 * 5) & "<payment_val></payment_val>"
            ts1.WriteLine Space(4 * 4) & "</damage_info>"
            ts1.WriteLine Space(4 * 4) & "<refusal_info>"
            ts1.WriteLine Space(4 * 5) & "<act_date></act_date>"
            ts1.WriteLine Space(4 * 5) & "<refusal_reason></refusal_reason>"
            ts1.WriteLine Space(4 * 5) & "<refusal_inf></refusal_inf>"
            ts1.WriteLine Space(4 * 4) & "</refusal_info>"
        End If
        ts1.WriteLine Space(4 * 3) & "</event_info>"
        If Not (curdog = wa.Cells(ii + 1, mdTags.GetPos("number")) And cursub = wa.Cells(ii + 1, mdTags.GetPos("subject_name")) And curreg = wa.Cells(ii + 1, mdTags.GetPos("region"))) Then
            ts1.WriteLine Space(4 * 2) & "</SubjectData>"
        End If
        If curdog <> wa.Cells(ii + 1, mdTags.GetPos("number")) Then
            ts1.WriteLine Space(4 * 1) & "</ContractData>"
        End If
        prevdog = curdog
        prevsub = cursub
        prevreg = curreg
    Next ii
    ts1.WriteLine "</ContractList>"
    MsgBox "Готово"
Exit_:

DoCmd.Close acForm, "frmProcess"
    If Not wd Is Nothing Then wd.Close False
    Set wd = Nothing
    Set wa = Nothing
    
Exit2_:
DoCmd.Hourglass False
    Exit Sub
Error_:
    ErrCount = ErrCount + 1
    Select Case fl1
    Case 1
        MsgBox "Ошибка в строке " & ii + 1 & " и в колонке " & tmpCellName
    Case 2
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    Case 3
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    Case 4
        MsgBox "Ошибка в строке " & wa.ActiveCell.row & ". Выполнение прервано."
    End Select
    'Debug.Print Err.Source, Err.HelpContext
    Call GetError(Err.number, Err.Description, Me.Name, "btnProcess_Click")
    If ErrCount = 1 Then
        Resume Exit_
    Else
        Resume Exit2_
    End If

End Sub


Public Function ToUTF8(ByVal sText As String) As String
    Dim nRet As Long, strRet As String
 
    strRet = String(Len(sText) * 2, vbNullChar)
    nRet = WideCharToMultiByte(65001, &H0, StrPtr(sText), Len(sText), StrPtr(strRet), Len(sText) * 2, 0&, 0&)
    
    ToUTF8 = Left(StrConv(strRet, vbUnicode), nRet)
End Function
guest_rusimport
Дата: 09.02.2016 02:19:39