2012-06-28 5 views
0


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

Я работаю над 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 

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

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

+0

thanks MPelletier –

ответ

2

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

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

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

  • Dim objSpssApp As?

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

Dim objSpssApp 

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

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

    «петля 1
    Для я = 0 Для -1
    тока = GetObject (переменной.Valuelist (я)) хотел бы использовать это, чтобы получить значение
    Set varLabels (я) = ток
    Следующая

Я точно не знаю, почему вы хотите считать от 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» увеличить количество так, что он показывает правильный номер
    «это из петли так, что даже заполненные метки значений подсчитываются
    » Возможно, этот метод был бы лучше?

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

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

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

Я надеюсь, что этот ответ может пригодиться вам!

+0

Thanks user1383120! только проблема теперь находит список классов Spss ... –

+0

oh и цикл For, который равен от 0 до -1. Я хотел завершить цикл до тех пор, пока переменная .valuelist не выполнит его (например, если в первый раз я запустил скрипт переменная имела 12 значений, цикл будет выполняться 12 раз, а во второй раз я запускаю его, когда переменная имеет 34 значения, цикл будет выполняться 34 раза и т. д.). –

+0

О да, и для объектов вы можете использовать как Object вместо Variant. Я предполагаю, что вам нужно обратиться к библиотеке, а затем сделать что-то вроде SPSS. () => в дальнейшем вы можете получить список предложений. Но я не могу сказать это точно. – Trace