1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
'Begin Description
' Пример демонстрирует работу функции GetNextPivot, с помощью которой можно перебрать все мобильные таблицы
' в окне результатов и совершить над ними некоторое стандартное действие (в данном примере - выполнить метод Autofit).
'End Description

'Перевод: А. Балабанов, 24.11.2008.
'Проверено: SPSS 15.0.1.1.

Sub Main
	Dim objPivot As PivotTable
	Dim objItem As ISpssItem

	Do While GetNextPivot(objPivot, objItem)
		objPivot.Autofit
		objItem.Deactivate
	Loop
End Sub

Function GetNextPivot(objPivot As PivotTable, objItem As ISpssItem) As Boolean
'Назначение: Найти и активировать следующую мобильную таблицу (Pivot Table) в Output-навигаторе
'Условия: В документе Output существуют мобильные таблицы, документ не меняется между вызовами функции
'Результат: каждый раз при вызове функция активирует следующую мобильную таблицу
'Входные параметры: переменные, куда запишутся ссылки на активированную мобильную таблицу и объект Item, её содержащий
'Возвращаемые значения: ссылка на активированную мобильную таблицу и объект Item, её содержащий; функция возвращает True, если была обработана мобильная таблица.


	Static objDocuments As ISpssDocuments  	' Коллекция документов SPSS.
	Static objOutputDoc As ISpssOutputDoc   ' Документ Output (окно результатов)
	Static objItems As ISpssItems       	' Коллекция объектов Output-навигатора
	Static intItem As Integer 		   		' Индекс очередного объекта
	Static intItemCount As Integer			' Общее число объектов в навигаторе

	Dim intItemType As Integer
	Dim bolSelected As Boolean             	' True, если объект выделен.
	Dim bolReset As Boolean
	Dim i As Integer

	' инициализация возвращаемых значений
	GetNextPivot = False
	Set objPivot = Nothing
	Set objItem = Nothing

	' если функция за время исполнения скрипта вызвана первый раз, установим флаг, указывающий на необходимость инициализации некоторых переменных
	If (objDocuments Is Nothing) Or (objOutputDoc Is Nothing) Or (objItems Is Nothing) Then
		bolReset = True
	End If

	If bolReset Then
		'Установление ссылки на коллекцию документов SPSS.
		Set objDocuments = objSpssApp.Documents
	End If	' закончена обработка переменной с коллекцией документов

	If bolReset Then
		' Установление ссылки на текущий документ выдачи только если есть хотя бы один такой документ
		If objDocuments.OutputDocCount > 0 Then
		   'Ссылка на текущий документ выдачи (окно результатов).
		   Set objOutputDoc = objSpssApp.GetDesignatedOutputDoc
		Else
			'Если отсутствуют окна результатов
			MsgBox( "Не найдено окна с результатами (Output Navigator)!" )
			Exit Function
		End If
	End If	' закончена обработка переменной с документом Output

	' Установление ссылки на дерево объектов и подсчёт количества объектов в окне результатов:
	If bolReset Then
		Set objItems = objOutputDoc.Items
		intItemCount = objItems.Count
	End If

	' Убедимся, что не было никаких сбоев при инициализации переменных. В случае проблем - сообщение пользователю и выход.
	If (objDocuments Is Nothing) Or (objOutputDoc Is Nothing) Or (objItems Is Nothing) Then
		Debug.Print "Пустая ссылка objDocuments: " & (objDocuments Is Nothing)
		Debug.Print "Пустая ссылка objOutputDocIs: " & (objOutputDoc Is Nothing)
		Debug.Print "Пустая ссылка objItems: " & (objItems Is Nothing)
		MsgBox "Случились проблемы при инициализации переменных окна навигатора результатов!", vbExclamation, "GetNextPivot"
		Exit Function
	End If

	' Проверка, что документ Output не изменился между вызовами функции. Если изменился: сообщение и выход.
	If intItemCount <> objItems.Count Then
		MsgBox "Содержимое окна результатов изменилось во время выполнения скрипта!", vbExclamation, "GetNextPivot"
		Exit Function
	End If

	If bolReset Then
		intItem = 0
	End If

	' Get the next pivot table.
	For i = intItem To intItemCount - 1
		Set objItem = objItems.GetItem(i)
		intItemType = objItem.SPSSType
		If intItemType = SPSSPivot Then
			intItem = i + 1								' при следующем вызове начнём отсюда
			Set objPivot = objItem.ActivateTable()  	'активация мобильной таблицы
			GetNextPivot  = True	                  	' Подтверждение, что мобильная таблица обнаружена и активирована.
			Exit For                                  	' Выход из цикла.
        End If
	Next i

	If GetNextPivot = False And intItem = 0 Then
		'Не было найдено мобильной таблицы.
		MsgBox( "Мобильных таблиц не обнаружено!" )
		Exit Function
	End If

End Function