Управление шириной столбцов «через синтаксис»
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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 | 'Begin Description 'Данный скрипт позволяет пользователю через синтаксис задать индивидуальную ширину для столбцов 'данных и меток строк в таблицах, создаваемых процедурами SPSS. 'End Description ' 'ТРЕБОВАНИЯ: ' SPSS Base, верия 8.0 для Windows или выше. ' 'НАЗНАЧЕНИЕ: ' Скрипт позволяет пользователю через синтаксис задать индивидуальную ширину для столбцов ' данных и меток строк в мобильных таблицах, создаваемых процедурами SPSS. ' Ширину можно задавать в пунктах или миллиметрах. Скрипт также позволяет создавать ' корректный синтаксис для своего вызова на основе таблицы, в которой вы вручную ' поправили ширину столбцов, так что вам не нужно переписывать размеры. ' 'ВХОДНЫЕ ПАРАМАТРЫ: ' Скрипт требует указания ширины столбцов данных (а при необходимости - и ширины ' столбцов в метками строк) при вызове его из окна редактора синтаксиса, причём ' значения ширины столбцов разделяются запятыми. Значения ширины столбцов с метками ' строк отделяются от прочих значений символом |. См. варианты использования A и Б. '' Скрипт может быть использован и для "снятия мерки" с таблицы, в которой пользователь ' вручную задал размеры столбцов, для последующего использования в синтаксисе. См. вариант использования В. ' 'ИСПОЛЬЗОВАНИЕ: ' Вызов из синтаксиса: ' SCRIPT file = 'filename' ('{ед.}{r1,r2,...,rn|}c1,c2,...,cn') ' ' здесь ед. mm = миллиметры [* по умолчанию - пункты *] ' rn ширина столбца n с метками строк [необязательные параметры] ' cn ширина столбца данных n ' ' ВАРИАНТ ИСПОЛЬЗОВАНИЯ А: ' ' SCRIPT file="c:\\...\\spss\\scripts\\Table Widths - with Syntax.sbs" ("95,,95,,50"). ' ' Устанавливает ширину первого и третьего столбца в 95 пунктов, пятого столбца - в 50 пунктов. ' Ширина второго, четвёртого и всех последующих столбцов не изменяется. ' Указание ширины для несуществующих фактически в таблице столбцов игнорируются. ' ' ВАРИАНТ ИСПОЛЬЗОВАНИЯ Б: ' ' SCRIPT file="c:\\...\\spss\\scripts\\Table Widths - with Syntax.sbs" ("mm 80|,20,,35"). ' ' Устанавливает ширину первого столбца с метками строк в 80 мм. ' Ширина второго столбца с данными делается равной 20 мм, а четвёртого - 35 мм. ' Первый, третий и все последующие столбцы данных своей ширины не меняют. ' ' ВАРИАНТ ИСПОЛЬЗОВАНИЯ В: ' ' Если вы запустите этот скрипт через меню Utilities>Run Script, он создаст синтаксис, ' в котором "запомнит" размеры столбцов, выделенной таблицы, которую вы можете предварительно ' подправить под нужное вам форматирование. Этот синтаксис вставится в назначенное окно синтаксиса. ' ' Скрипт также попутно определит синтаксис, который был использован для создания самой таблицы. ' Обе команды будут вставлены в окно синтаксиса. 'Примеч. перев.: если команда производит несколько таблиц, и вы вручную изменили ширину столбцов какой-либо 'непоследней таблицы и запомнили эти размеры через запуск скрипта, сгенерированный синтаксис будет таков, что 'запомненные размеры скрипт будет пытаться воспроизводить на последней таблице из выдачи - это следует учитывать 'при написании программ обработки. ' 'ПРИМЕЧАНИЯ: ' Единицы измерения по умолчанию - пункты. При необходимости можно указать миллиметры (mm). ' ' Скрипт выделяет и изменяет последнюю мобильную таблицу, которая была создана перед вызовом скрипта. ' ' Указание ширины столбца равной 0 приведёт к скрытию этого столбца. ' ' Скрипт следует сохранить с именем "Table Widths - with syntax.sbs". ЭТО ВАЖНО. ' 'ВЕРСИЯ: ' Версия : 1.1a ' Обновлено : 26 ноября 2001 г. ' 'АВТОР: ' Имя : Jason Burke, SPSS Australasia Pty Ltd. ' Телефон : +61 (0)2 9954 5660 ext 242 ' E-Mail : jburke AT spss DOT com ' Авторские права : Copyright @ 1999 by Jason Burke. ' '***************************************************************************** 'Константы уровня скрипта Const cSCRIPTNAME As String = "Table Widths - with syntax.sbs" Const cNONAVMSG As String = "Не найдено документов редактора результатов (output)." Const cNOPIVSELMSG As String = "Выделите мобильную таблицу перед запуском скрипта." Public objPivotTable As PivotTable Sub Main 'Строка со значениями ширины столбцов передаётся в качестве параметра из синтаксиса. Dim strParam As String Dim objItem As ISpssItem Dim bolFoundOutputDoc As Boolean Dim bolPivotSelected As Boolean Dim strFormatArray() As String Dim strColWidthArray() As String Dim strRowWidthArray() As String Dim strTableSyntaxArray() As String Dim intUnitSize As Long Dim intDelimiter As Integer Dim intNumVars As Integer Dim intNumCols As Integer Dim strVarName As String Dim strSyntax As String Dim intObjectType As Integer Dim i As Integer strParam = objSpssApp.ScriptParameter(0) 'Устанавливаем константу для определения типа объекта "мобильная таблица" (SPSS Pivot table) intObjectType = 5 'Если передан параметр, надо будет разложить переданное по элементам массива If strParam <> "" Then Call Get_PivotTable(objPivotTable, objItem, bolFoundOutputDoc, bolPivotSelected, intObjectType) If (bolFoundOutputDoc = False) Or (bolPivotSelected = False) Then 'выход, если окно результатов не существует или мобильная таблица не выделена Exit Sub End If 'Откладываем перерисовку экрана до окончания обработки объекта objPivotTable.UpdateScreen = False intDelimiter = 124 Call Str_To_Array(strParam, strFormatArray, intUnitSize, intDelimiter) intDelimiter = 44 If UBound(strFormatArray) > 0 Then strParam = strFormatArray(0) Call Str_To_Array(strParam, strRowWidthArray, intUnitSize, intDelimiter) 'устанавливаем ширину столбцов, относящихся к меткам строк Call Set_RowLabel_Width(strRowWidthArray) strParam = strFormatArray(1) Call Str_To_Array(strParam, strColWidthArray, intUnitSize, intDelimiter) Else strParam = strFormatArray(0) Call Str_To_Array(strParam, strColWidthArray, intUnitSize, intDelimiter) End If 'устанавливаем ширину столбцов с данными Call Set_ColLabel_Width(strColWidthArray) End If If strParam = "" Then 'Устанавливаем константу для определения типа объекта "примечания" (SPSSNote) - дополнительная (и обычно скрытая) 'таблица со служебной информацией, которая создаётся после каждого вызова статистической процедуры. intObjectType = 4 'Ищем объект-таблицу "примечания", соответствующую выделенной мобильной таблице Call Get_PivotTable(objPivotTable, objItem, bolFoundOutputDoc, bolPivotSelected, intObjectType) 'Откладываем перерисовку экрана до окончания обработки объекта objPivotTable.UpdateScreen = False '"Вытягиваем" синтаксис из таблицы NOTES ("примечания") Call Get_Table_Syntax(objPivotTable, objItem, strSyntax) 'запоминаем расположение таблицы, выделенной пользователем (его нам вернула в переменной intObjectType функция Get_PivotTable) i = intObjectType 'устанавливаем разделитель для строки с синтаксисом vbCR (возврат каретки) intDelimiter = 13 Call Str_To_Array(strSyntax, strTableSyntaxArray, intUnitSize, intDelimiter) Call Create_Table_Format_Syntax(objPivotTable, objItem, strTableSyntaxArray, i) End If 'разрешим обновить экран objPivotTable.UpdateScreen = True 'деактивация мобильной таблицы objItem.Deactivate End Sub Sub Set_ColLabel_Width(strArrVar() As String) 'Объявление объектных переменных SPSS Dim objColumnLabels As ISpssLabels ' массив меток столбцов Dim objDataCells As ISpssDataCells 'Объявление прочих переменных, используемых в процедуре Dim lngCol As Long ' число столбцов в массиве меток СТОЛБЦОВ Dim lngRow As Long ' число строк в массиве меток СТОЛБЦОВ Dim lngR As Long ' счетчик цикла Dim lngC As Long ' счетчик цикла 'ссылка на массив с метками столбцов Set objColumnLabels = objPivotTable.ColumnLabelArray Set objDataCells = objPivotTable.DataCellArray 'ColumnLabelArray - двумерный массив. lngCol = objColumnLabels.NumColumns lngRow = objColumnLabels.NumRows 'Обеспечим, чтобы количество устанавливаемых значений ширины столбца не превышало количество столбцов If lngCol <= UBound(strArrVar) Then n = lngCol Else n = UBound(strArrVar) + 1 End If 'Становимся на последнюю строку в массиве меток столбцов lngR = lngRow - 1 'для каждого столбца устанавливаем заданную пользователем ширину For lngC = 0 To n - 1 If Not IsNull(objColumnLabels.ValueAt(lngR,lngC)) Then If Len(strArrVar(lngC)) > 0 Then If Trim(strArrVar(lngC)) = "0" Then objColumnLabels.HideLabelsWithDataAt(lngR, lngC) Else objDataCells.ReSizeColumn (lngC, Val(strArrVar(lngC))) End If End If End If Next lngC End Sub Sub Set_RowLabel_Width(strArrVar() As String) 'Объявление объектных переменных SPSS Dim objRowLabels As ISpssLabels ' массив меток строк 'Объявление прочих переменных, используемых в процедуре Dim lngCol As Long ' число столбцов в массиве меток СТРОК Dim lngRow As Long ' число строк в массиве меток СТРОК Dim lngR As Long ' счетчик цикла Dim lngC As Long ' счетчик цикла 'ссылка на объект меток строк Set objRowLabels = objPivotTable.RowLabelArray 'RowLabelArray - двумерный массив. lngCol = objRowLabels.NumColumns lngRow = objRowLabels.NumRows If lngCol <= UBound(strArrVar) Then n = lngCol Else n = UBound(strArrVar) + 1 End If 'становимся на верхнюю строку размерности с метками строк lngR = 0 'для каждого столбца, относящегося к меткам строк (их может быть несколько), устанавливаем желаемую ширину For lngC = 0 To n - 1 If Not IsNull(objRowLabels.ValueAt(lngR,lngC)) Then If Len(strArrVar(lngC)) > 0 Then objRowLabels.RowLabelWidthAt(lngR,lngC + 1) = CLng(strArrVar(lngC)) End If End If Next lngC End Sub Sub Str_To_Array(strVar As String, strArrVar() As String, intUnitSize As Long, intDelimiter As Integer) 'Функция : берёт переданную пользователем строку с разделителями <stvar> и ' : раскладывает её элементы по элементам массива <arrvar>. ' : Число элементов хранится в переменной <arrsize> - ? А.Б. 'Входящие : strVar - строка с разделителями 'Выходящие : strArrVar - возвращаемый массив ' : intArrSize - число элементов (переменных) в массиве - не используется? - А.Б. 'Исх. версия: автор AW, январь 1997, адаптация по проекту MD (авторе - JM), сент. 1994. 'Обновления : автор JB, август 1998, адаптация Dim intStart As Integer Dim intRet_Loc As Integer Dim ii As Integer Dim strToken As String intStart = 1 intRet_Loc = 1 ii = 0 'особо обрабатываем строку, если единицы в ней указаны в миллиметрах If (intDelimiter = 124) And (UCase$(Left(strVar,2)) = "MM") Then strVar = Mid(strVar, 3) intUnitSize = 72/25.4 ElseIf intDelimiter = 124 Then intUnitSize = 1 End If Debug.Print intDelimiter Do While intRet_Loc > 0 intRet_Loc = InStr(intStart, strVar, Chr(intDelimiter)) If (intRet_Loc > 0) Then strToken = Mid(strVar, intStart, intRet_Loc - intStart) intStart = intRet_Loc + 1 Else strToken = Mid(strVar, intStart, Len(strVar) + 1 - intStart) intStart = intRet_Loc + 1 End If ReDim Preserve strArrVar(ii) If Trim(strToken)<>"" And intDelimiter = 44 Then strArrVar(ii) = Str$(Val(Trim(strToken))* intUnitSize) ElseIf Trim(strToken)<>"" And intDelimiter = 13 Then strArrVar(ii) = Left(RTrim(strToken), Len(RTrim(strToken))) Else strArrVar(ii) = Trim(strToken) End If Debug.Print strArrVar(ii) & "*" ii = ii + 1 Loop End Sub Sub Get_PivotTable(objSelectedPivot As Object, objItem As ISpssItem, bolFoundOutput As Boolean, bolFoundPivot As Boolean, intType As Integer) 'Функция : поиск первой выделенной таблицы (не только: + доп. функциональность для задач скрипта - примеч. перев.) 'Условия : в окне результатов выделена мобильная таблица 'Действия : активирует выделенную мобильную таблицу 'Входные : объект "мобильная таблица" и "родительский" объект, содержащий выделенную таблицу, тип искомой таблицы 'Выходные : выделенная таблица и родительский объект ' bolFoundOutput("истина", если есть окно результатов) ' bolFoundPivot("истина", если найдена выделенная мобильная таблица) Dim objDocuments As ISpssDocuments ' коллекция документов SPSS Dim objOutputDoc As ISpssOutputDoc ' документ Output (окно результатов) Dim objItems As ISpssItems ' коллекция объектов в окне результатов Dim intItemCount As Integer Dim intItemType As Integer Dim bolSelected As Boolean ' "Истина", если объект выделен Dim i As Integer ' устанавливаем признак того, что окно результатов ещё не обнаружено bolFoundOutput = False 'получаем перечень (коллекцию) документов SPSS. Set objDocuments = objSpssApp.Documents ' ссылка на назначенное окно результатов только есть хотя бы одно окно результатов If objDocuments.OutputDocCount > 0 Then 'ссылка на назначенное окно результатов Set objOutputDoc = objSpssApp.GetDesignatedOutputDoc bolFoundOutput = True Else 'если не обнаружено окна результатов MsgBox(cNONAVMSG) Exit Sub End If 'проверка, что назначенное окно результатов обнаружено If bolFoundOutput = True Then 'признак, что мобильная таблица ещё не найдена bolFoundPivot = False ' ставим ссылку на дерево объектов и подсчитываем их количество Set objItems = objOutputDoc.Items intItemCount = objItems.Count If objSpssApp.ScriptParameter(0)<>"" Then ' ставим ссылку на последнюю мобильную таблицу в окне результатов, если передан параметр с шириной столбцов For i = intItemCount - 1 To 0 Step -1 Set objItem = objItems.GetItem(i) intItemType = objItem.SPSSType bolSelected = objItem.Selected If intItemType = intType Then ' Set objSelectedPivot = objItem.Activate() 'активируем мобильную таблицу bolFoundPivot = True 'признак того, что таблица найдена Exit For 'выход из цикла End If Next i ElseIf intType = 4 Then ' если найденный объект - SPSSNote ("примечания") For i = intItemCount - 1 To 0 Step -1 Set objItem = objItems.GetItem(i) bolSelected = objItem.Selected If bolSelected = True Then For j = i - 1 To 0 Step -1 Set objItem = objItems.GetItem(j) intItemType = objItem.SPSSType If objItem.SPSSType = intType Then Set objSelectedPivot = objItem.Activate() 'запоминаем индекс найденной таблицы в переменной intType intType = i Exit Sub End If Next j End If Next i Else ' ставим ссылку на первую выделенную таблицу Call GetFirstSelectedPivot(objSelectedPivot, objItem, bolFoundOutput, bolFoundPivot) End If End If If bolFoundPivot = False Then 'Если не выделено (не найдено) нужной таблицы MsgBox(cNOPIVSELMSG) Exit Sub End If End Sub Sub Create_Table_Format_Syntax(objPivotTable As Object, objItem As ISpssItem, strArrVar() As String, intTest As Integer) 'Объявление объектных переменных SPSS Dim objRowLabels As ISpssLabels ' массив меток строк Dim objSyntaxDoc As ISpssSyntaxDoc Dim objDocuments As ISpssDocuments ' коллекция документов SPSS. Dim objOutputDoc As ISpssOutputDoc ' документ результатов (Output) Dim objItems As ISpssItems 'Объявление прочих переменных, которые используются в процедуре Dim strAppPath As String ' путь, куда установлен SPSS Dim intCol As Integer ' число столбцов в массиве меток СТОЛБЦОВ Dim intRow As Integer ' число строк в массиве меток СТОЛБЦОВ Dim intR As Integer ' счетчик цикла Dim intC As Integer ' счетчик цикла Set objOutputDoc = objSpssApp.GetDesignatedOutputDoc Set objItems = objOutputDoc.Items Set objItem = objItems.GetItem(intTest) ' objItem.Selected = True Set objPivotTable = objItem.Activate() On Error GoTo Error_Handler 'установка ссылок на массивы меток строк и столбцов Set objRowLabels = objPivotTable.RowLabelArray Set objColumnLabels = objPivotTable.ColumnLabelArray Set objSyntaxDoc = objSpssApp.GetDesignatedSyntaxDoc 'Определение папки, куда установлен SPSS strAppPath = objSpssApp.GetSPSSPath For i = 0 To UBound(strArrVar) strSyntaxCommands = strSyntaxCommands & strArrVar(i) & vbLf Next i strSyntaxCommands = strSyntaxCommands & "SCRIPT file = '" & strAppPath & "scripts\\" & cSCRIPTNAME & "' ('" intCol = objRowLabels.NumColumns intRow = objRowLabels.NumRows 'встаём на верхнюю строчку размерности с метками строк intR = 0 'для каждого столбца, формирующего метки строк, записываем его ширину 'игнорируем верхний левый угол таблицы (столбец 0) For intC = 1 To intCol - 2 'SPSS возвращает нулевое значение для ширины столбца с метками строк, если столбец не изменял своей ширины после создания таблицы. 'Чтобы избежать проблем, связанных с этим, мы проверяем возвращаемые значения. If objRowLabels.RowLabelWidthAt(intR,intC) <> 0 Then 'If Not IsNull(objRowLabels.ValueAt(intR,intC)) Then strSyntaxCommands = strSyntaxCommands & objRowLabels.RowLabelWidthAt(intR,intC) End If strSyntaxCommands = strSyntaxCommands & Chr(44) Next intC strSyntaxCommands = strSyntaxCommands & objRowLabels.RowLabelWidthAt(intR,intC) & Chr(124) intCol = objColumnLabels.NumColumns intRow = objColumnLabels.NumRows 'Встанем на последнюю строку размерности меток столбцов intR = intRow - 1 'сохраняем ширину каждого столбца For intC = 0 To intCol - 2 If Not IsNull(objColumnLabels.ValueAt(intR,intC)) Then strSyntaxCommands = strSyntaxCommands & objColumnLabels.ColumnLabelWidthAt(intR,intC) & Chr(44) End If Next intC strSyntaxCommands = strSyntaxCommands & objColumnLabels.ColumnLabelWidthAt(intR,intC) strSyntaxCommands = strSyntaxCommands + "')." & vbLf strSyntaxCommands = objSyntaxDoc.Text & strSyntaxCommands objSyntaxDoc.Text = strSyntaxCommands Exit Sub Error_Handler: 'откроем окно синтаксиса, если его нет Set objSyntaxDoc = objSpssApp.NewSyntaxDoc objSyntaxDoc.Visible = True Resume Next End Sub Sub Get_Table_Syntax (objPivot As Object, objItem As ISpssItem, strSyntax As String) Dim SYNTAX_COLUMN Dim cSYNTAX As String 'Объявляем переменные Dim intSelItemType As Integer Dim intVariableCount As Integer Dim intItem As Integer Dim lngRow As Long Dim strLabel As String Dim objSPSSInfo As ISpssInfo Dim objSPSSDataDoc As ISpssDataDoc Dim objRowLabels As ISpssLabels Dim objDataCells As ISpssDataCells Dim bolFoundOutputDoc As Boolean Dim bolItemSelected As Boolean SYNTAX_COLUMN = 2 'столбец, в котором располагается синтаксис в таблице примечаний cSYNTAX = "Syntax" 'исходное значение - признак, что синтаксис ещё не обнаружен strSyntax = "" ' проверка, что переданный объект имеет нужный тип - таблицы примечаний (Notes) intItemType = objItem.SPSSType If intItemType = SPSSNote Then ' цикл по меткам строк сверху вниз Set objRowLabels = objPivot.RowLabelArray For lngRow = 0 To objRowLabels.NumRows - 1 'проверка, что метка присутствует (ячейка не пуста) If Not IsNull(objRowLabels.ValueAt(lngRow, SYNTAX_COLUMN)) Then strLabel = objRowLabels.ValueAt(lngRow, SYNTAX_COLUMN) ' проверка, не это ли строка синтаксиса ("Syntax") If strLabel = cSYNTAX Then ' захват синтаксиса Set objDataCells = objPivot.DataCellArray If Not IsNull(objDataCells.ValueAt(lngRow, 0)) Then strSyntax = objDataCells.ValueAt(lngRow, 0) Exit For End If End If End If Next lngRow End If End Sub |
Related pages
...