WWBasic + SPSS, скрипт для переименования меток значений


прежде чем я начну, я хочу указать, что я пометил этот вопрос как VBA, потому что я не могу создать новый тег для Winwrap, и мне сказали, что Winwrap почти такой же, как VBA.

Я работаю над SPSS V19.0 и пытаюсь написать код, который поможет мне идентифицировать и назначать метки значений всем значениям, которые не имеют метки в указанной переменной (или во всех переменных).
Приведенный ниже псевдокод относится к версии, в которой это одна переменная (возможно, введенная в текстовом поле или отправленная через пользовательский диалог в программе SPSS Stats (вызовите файл .sbs из синтаксиса, задав ему имя переменной).

Вот псевдокод:

Sub Main(variable As String)

On Error GoTo bye

'Variable Declaration:
Dim i As Integer, intCount As Integer
Dim strValName As String, strVar As String, strCom As String
Dim varLabels As Variant 'This should be an array of all the value labels in the selected record
Dim objSpssApp As 'No idea what to put here, but I want to select the spss main window.

'Original Idea was to use two loops
'The first loop would fill an array with the value lables and use the index as the value and 
'The second loop would check to see which values already had labels and then
'Would ask the user for a value label to apply to each value that didn't.
'loop 1
'For i = 0 To -1 
'current = GetObject(variable.valuelist(i)) 'would use this to get the value
'Set varLabels(i) = current
'Next

'Loop for each number in the Value list.
strValName = InputBox("Please specify the variable.")
'Loop for each number in the Value list.
 For i = 0 To varLabels-1
 If IsEmpty (varLabels(i)) Then
 'Find value and ask for the current value label
 strVar = InputBox("Please insert Label for value "; varLabels(i);" :","Insert Value Label")
 'Apply the response to the required number
 strCom = "ADD VALUE LABELS " & strVar & Chr$(39) & intCount & Chr$(39) & Chr$(39) & strValName & Chr$(39) &" ."
 'Then the piece of code to execute the Syntax
 objSpssApp.ExecuteCommands(strCom, False)

 End If
 'intCount = intCount + 1 'increase the count so that it shows the correct number
 'it's out of the loop so that even filled value labels are counted
 'Perhaps this method would be better?
 Next

Bye:
End Sub

Это никоим образом не работающий код, это просто псевдокод для процесса, которого я хочу достичь. Я просто ищу помощи в этом, если бы вы могли, это было бы волшебно.

Заранее большое спасибо
Мав


person Maverick Jones    schedule 28.06.2012    source источник


Ответы (1)


Winwrap и VBA практически идентичны, с различиями, которые вы можете найти в этом посте: http://www.winwrap.com/web/basic/reference/?p=doc_tn0143_technote.htm Я не использовал winwrap, но попытаюсь ответить, используя свои знания VBA.

  • Dim varLabels как вариант

Вы можете сделать из этого массив, сказав, например, dim varLabels() как вариант «Динамически объявленный массив dim varLabels (10) как вариант» Статически объявленный массив dim varLabels (от 1 до 10) как вариант «Массив, начинающийся с 1 — который я в основном используют dim varLabels(от 1 до 10, от 1 до 3) 'Многомерный массив

  • Dim objSpssApp как?

«Теоретически» вы можете оставить это как тип варианта или даже сделать

Dim objSpssApp 

Без дальнейшего объявления, что в принципе то же самое - и это будет работать, потому что вариант может быть любым и не вызовет ошибки. Тем не менее, это хороший обычай объявлять объекты в соответствии с явным типом данных, потому что вариантный тип требует больших затрат памяти. На самом деле вы должны узнать об имени класса объектов, но я не могу вам этого дать. Я предполагаю, что вы должны сделать что-то вроде:

set objSpssApp = new <Spss Window> 
set objSpssApp = nothing 'In the end to release the object 
  • Код:

    'loop 1
    For i = 0 To -1
    current = GetObject(variable.valuelist(i)) 'будет использовать это для получения значения
    Set varLabels(i) = current
    Next

Я точно не знаю, почему вы хотите считать от 0 до -1, но, возможно, это не имеет значения. Чтобы заполнить массив, вы можете просто сделать: varLabels(i) = i Оператор SET используется для установки объектов, и вам не нужно создавать объект для создания массива. Также обратите внимание, что вы не объявили половину используемых здесь переменных.

  • Код:

    strVar = InputBox("Пожалуйста, вставьте метку для значения "; varLabels(i);" :","Вставьте метку значения")

Обратите внимание, что синтаксис оператора конкатенации — &. То же самое и в WinWrap: http://www.winwrap.com/web/basic/language/?p=doc_operators_oper.htm Но вы это знаете, поскольку используете это в своем коде.

  • Код:

    'intCount = intCount + 1 'увеличить счетчик так, чтобы он показывал правильное число
    'выйти из цикла, чтобы учитывались даже заполненные метки значений
    'Возможно, этот метод был бы лучше?

Я не уверен, что понимаю этот вопрос, но теоретически все циклы действительны в любой ситуации, это зависит от ваших предпочтений. For... Next, Do... Loop, While... Wend, в конце концов, все они делают в основном одно и то же. intCount = intCount + 1 кажется допустимым при использовании его в цикле.

  • Использование Next (для... next)

При использовании счетчика всегда используйте Next iCounter, так как он увеличивает значение счетчика.

Я надеюсь, что этот ответ может быть вам полезен!

person html_programmer    schedule 28.06.2012
comment
о, и цикл For, который составляет от 0 до -1, я хотел завершить цикл до тех пор, пока переменная.valuelist не запустит свой курс (например, если в первый раз, когда я запустил скрипт, в переменной было 12 значений, цикл будет выполняться 12 раз и во второй раз, когда я запускаю его, когда переменная имеет 34 значения, цикл будет выполняться 34 раза и так далее). - person Maverick Jones; 28.06.2012
comment
Ах да, и для объектов вы можете использовать как объект, а не как вариант. Я предполагаю, что вам нужно сослаться на библиотеку, а затем сделать что-то вроде SPSS. (‹точка›) => в дальнейшем вы можете получить список предложений. Но я не могу этого сказать наверняка. - person html_programmer; 28.06.2012
comment
Думаю, вам лучше считать от 1 до ubound(varLabels). - person html_programmer; 28.06.2012
comment
Я нашел импорт, который предположительно добавляет классы SPSS и т. д., но классы не видны, а ключевое слово Imports не выделяется, когда скрипт открывается в SPSS. (тогда как в Notepad++ он выделен) : Импортирует spss - person Maverick Jones; 28.06.2012
comment
Я не уверен, что понимаю все, что вы говорите, но в Vba вы не можете импортировать другие классы, потому что наследование не поддерживается. Вы можете - person html_programmer; 28.06.2012
comment
N только ссылаться на библиотеку и создавать экземпляры предоставленных классов. - person html_programmer; 28.06.2012
comment
как сослаться на библиотеку? - person Maverick Jones; 28.06.2012
comment
Хе-хе, ну не знаю. Рассматривали ли вы возможность использования Spss с Excel? Я думаю, что они могут быть совместимы. - person html_programmer; 28.06.2012
comment
Смогу ли я настроить таргетинг на метки значений в Excel? - person Maverick Jones; 29.06.2012
comment
Я думаю, что эта веб-страница может вас заинтересовать: pages.infinit.net/rlevesqu/SampleScripts.htm - person html_programmer; 29.06.2012
comment
Я не знаю, что такое метки целевых значений, прошло 9 лет с тех пор, как я в последний раз работал с SPSS. - person html_programmer; 29.06.2012
comment
Спасибо Ким, сайт выглядит очень полезным! - person Maverick Jones; 29.06.2012