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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
'Код решения:  100007757

'Тема:
'Установка нужного числа знаков после запятой во всех ячейках таблицы, либо в определённом столбце.

'Описание:
'Вопрос.
'Используемая версия SPSS: 7.5 или выше.
'Мне довольно часто требуется менять число десятичных знаков в таблицах.
'Например, требуется отображение 5 знаков после запятой для всех ячеек.
'А для некоторых показателей я хотел бы видеть ещё больше знаков, например, 9 знаков для уровня значимости.
'Можно ли как-то автоматизировать эти действия, чтобы не менять каждый раз формат вручную?

'Ответ.
'Да. Ниже приводится скрипт, который делает нужные вам настройки для первой выделенной мобильной таблицы.
'Процедуру Sub Main вы можете заменить, или вовсе заменить своей, но процедуры  SetDecimalDigits и SetDecimalDigitsInColumn,
'а также функция FindColumnLabel, вероятно, не потребуют изменений, вне зависимости от того, захотите ли вы
'включить их в свой собственный скрипт, или в файл с автоскриптами, например.

'Чтобы посмотреть, как это работает: откройте новое окно скриптов,
'удалите всё его содержимое, и вставьте туда все, что находится ниже, после чего
'сохраните это как файл SetDecimals.sbs и запустите.

'Begin Description 
'Процедура SetDecimalDigits меняет число отображаемых знаков после запятой во всех ячейках.
'Процедура SetDecimalDigitsInColumn воздействует лишь на определённый столбец.
'Функция FindColumnLabel ищет этот определённый столбец по его метке;
'она возвращает индекс (номер) столбца, либо -1, если столбца с такой меткой не было найдено.
'End Description 

'--------------------------------------------------------------------------- 
' Демонстрация того, как можно организовать вызов процедур SetDecimalDigits и SetDecimalDigitsInColumn.
'--------------------------------------------------------------------------- 
Sub Main 
Dim objPivot As PivotTable 
Dim objItem As ISpssItem 
'ищем и активируем первую выделенную мобильную таблицу
GetFirstSelectedPivot objPivot, objItem, True, True 
'отложим перерисовку экрана до завершения преобразований
objPivot.UpdateScreen = False 

'*********************************************************************** 
'установим для всех ячеек десятичнй формат с 5 знаками после запятой
SetDecimalDigits objPivot, 5 
'*********************************************************************** 

'*********************************************************************** 
'для ячеек в колонке с меткой "Sig." формат установим с 9 знаками после запятой
SetDecimalDigitsInColumn objPivot, 9, FindColumnLabel(objPivot, "Sig.") 
'*********************************************************************** 

'разрешаем перерисовку экрана
objPivot.UpdateScreen = True 
'деактивируем таблицу
objItem.Deactivate 
'ещё раз выполняем активацию/деактивацию таблицы - иногда это позволяет избежать
'проблем с перерисовкой таблицы по ширине или высоте
objItem.ActivateTable 
objItem.Deactivate 
End Sub 
'--------------------------------------------------------------------------- 

'--------------------------------------------------------------------------- 
'Изменяет число отображаемых знаков после десятичной точки для ВСЕХ ячеек в мобильной таблице
'--------------------------------------------------------------------------- 
Sub SetDecimalDigits(objPivot As PivotTable, intDigits As Integer) 
Dim lngRow As Long, lngCol As Long 
Dim objDataCells As ISpssDataCells 

Set objDataCells = objPivot.DataCellArray 

With objDataCells 
For lngRow = 0 To .NumRows - 1 
For lngCol = 0 To .NumColumns - 1 
If Not IsNull (.ValueAt (lngRow, lngCol)) Then 
.HDecDigitsAt (lngRow, lngCol) = intDigits 
End If 
Next 
Next 
End With 

objPivot.Autofit 
End Sub 
'--------------------------------------------------------------------------- 

'--------------------------------------------------------------------------- 
'Изменяет число отображаемых знаков после десятичной точки для ячеек определённого столбца.
'(использует функцию FindColumnLabel для поиска нужного столбца)
'--------------------------------------------------------------------------- 
Sub SetDecimalDigitsInColumn(objPivot As PivotTable, intDigits As Integer, lngColumn As Long) 
Dim lngRow As Long 
Dim objDataCells As ISpssDataCells 

Set objDataCells = objPivot.DataCellArray 

With objDataCells 
If lngColumn >= 0 And lngColumn < .NumColumns Then 
For lngRow = 0 To .NumRows - 1 
If Not IsNull (.ValueAt (lngRow, lngColumn)) Then 
.HDecDigitsAt (lngRow, lngColumn) = intDigits 
End If 
Next 
Else 'нужный столбец не найден
Exit Sub 
End If 
End With 

objPivot.Autofit 
End Sub 

'--------------------------------------------------------------------------- 
'Возвращает индекс ПЕРВОГО столбца, чья метка содержит заданную строку.
'Возвращает -1, если такой столбец не был найден.
'--------------------------------------------------------------------------- 
Function FindColumnLabel (objPivot As PivotTable, strText As String) As Long 
Dim objColLabels As ISpssLabels ' массив меток столбцов.

Dim lngR As Long ' счетчик цикла
Dim lngC As Long ' счетчик цикла

If objPivot Is Nothing Then 
Debug.Print "PivotTable is Nothing!" 
Exit Function 
End If 

Set objColLabels = objPivot.ColumnLabelArray 

' ColLabelArray есть двумерный массив. Осуществляем пробежку по его элементам в поисках совпадения подстроки (strText)
'функция вернёт -1, если метка не будет найдена
FindColumnLabel = -1 
For lngC = 0 To objColLabels.NumColumns - 1 
For lngR = 0 To objColLabels.NumRows - 1 
If InStr(objColLabels.ValueAt(lngR,lngC), strText) Then 
FindColumnLabel = lngC 
Exit Function 
End If 
Next 
Next 
End Function 
'---------------------------------------------------------------------------