среда, 3 июня 2015 г.

Использование функции Go To при построении сводных таблиц

В некоторых макросах обработки файлов, в середине обработки может возникнуть необходимость построения сводной таблицы, но может оказаться так, что данных для ее построения не будет. Например в макросе проверки не привязанных позиций на каком-либо МХ их может не оказаться и сводная начнет строится на пустых данных. В этом случае ООО аварийно завершит работу, не закончив выполнение кода до конца.
Чтобы программно обойти возможный ошибочный кусок кода можно использовать функцию go to  с условием перенаправления на строку сразу после этого кода. Поясним на примере построения одной из сводных в макросе не привязанных позиций.

Sub Chist_PK ()
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Ч_Пекарня", oSheet)
' Определим переменную oshipka она будет равна ячейке А2 на листе с отфильтрованными
' данными по которым будет строится наши сводная таблица
oshipka = ThisComponent.Sheets(3).getCellRangeByName("A2")
' Если эта ячейка окажется пуста, значит весь диапазон пуст, т.к. она является первой ячейкой
If oshipka.String = "" Then
'Перенаправить код на Line 1
GoTo Line1
End If
Dim oRange 'Диапазон - источник для сводной таблицы
Dim oRangeAddress'Адрес объекта диапазон
Dim oTables 'Совокупность сводных таблиц
Dim oTDescriptor 'Один описатель сводной таблицы
Dim oFields 'Совокупность всех полей
Dim oField 'Одно поле
Dim oCellAddress As New com.sun.star.table.CellAddress
CreateDataPilotSource = oRange
oRange = CreateDataPilotSource("Сводка")
oSheet = ThisComponent.getSheets().getByIndex(3)
oRangeAddress = ThisComponent.getSheets().getByIndex(3).getCellRangeByName("A1:B65535").getRangeAddress()
oRangeAddress2 = ThisComponent.Sheets (9).getCellByPosition(0, 0).getCellAddress()
oSheet = ThisComponent.Sheets.getByName("Ч_Пекарня")
oTables = oSheet.getDataPilotTables()
REM Шаг 1, создадим описатель
oTDescriptor = oTables.createDataPilotDescriptor()
REM Шаг 2, Зададим исходный диапазон
oTDescriptor.setSourceRange(oRangeAddress)
REM Шаг 3, Зададим поля
oFields = oTDescriptor.getDataPilotFields()
REM Столбец 0 в источнике - Предмет и Я я хочу его как строку Предмет.
oField = oFields.getByIndex(1)
oField.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW
oTables.insertNewByName("MyFirstDataPilot", oRangeAddress2, oTDescriptor)
oSheet = ThisComponent.Sheets (9)
oRangeAddress = oSheet.getCellRangeByName("A1:A3").getRangeAddress()
oSheet.removeRange(oRangeAddress,  com.sun.star.sheet.CellDeleteMode.UP)
 oDoc = ThisComponent 
   oSheet = ThisComponent.getSheets().getByIndex(9) 
    oAddr = oSheet.getCellRangeByName("A1:A65535").getRangeAddress() 
    oDoc.DatabaseRanges.addNewByName("пекарня", oAddr) 
  oRange = oDoc.DatabaseRanges.getByName("пекарня")
 oSheet = ThisComponent.Sheets(9)
 myrows=oSheet.getrows
 oCellCursor = oSheet.createCursor()
 oCellCursor.GotoStartOfUsedArea(True)
 oCellCursor.GotoEndOfUsedArea(True)
 Start_Row = oCellCursor.getRangeAddress.StartRow
 End_Row = oCellCursor.getRangeAddress.EndRow + 1
 For i=End_Row To Start_Row step -1
  text1 = osheet.getcellbyposition(0,i).String
   If Left(text1,4) = "Итог" Then
    myrows.removebyindex(i,1)
   End if   
   Next i
'И выполнение кода начнется с этой строчки, пропуская весь процесс построения сводной
      Line1:
' В на листе, на котором должна была быть сводная просто напишем следующее
   ThisComponent.Sheets(9).getCellByPosition (9, 0).String = "Нет таких позиций" 
End Sub

Задание: простойте простую сводную в файле реестр документов по МХ (произвольную на новый лист) с включенным условием go to которое проверяет содержимое ячейки A1. Проверьте код выполнением. Затем проведите отмену всех изменений и удалите данные из ячейки A1  - снова запустите код - проверьте результат работы и корректность работы функции обхода.

Комментариев нет:

Отправить комментарий