0


始める前に、この質問にVBAのタグを付けたことを指摘したいと思います。これは、実際にはWinwrapの新しいタグを作成できず、WinwrapはVBAとほとんど同じであると言われているためです。

私はSPSSV19.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

これは決して機能するコードではありません。基本的には、達成したいプロセスの疑似コードです。魔法になる可能性がある場合は、ヘルプを探しています。

事前に感謝し
ますMav

4

1 に答える 1

2

WinwrapとVBAは、この投稿にある違いとほぼ同じです 。http : //www.winwrap.com/web/basic/reference/?p=doc_tn0143_technote.htm私はwinwrapを使用していませんが、試してみます。 VBAからの私の知識で答えるために。

  • バリアントとしての薄暗いvarLabels

たとえば、dim varLabels()をバリアントとして'動的に宣言された配列dimvarLabels(10)をバリアントとして'静的に宣言された配列dim varLabels(1から10)をバリアントとして'1から始まる配列-これから配列を作成できます。主にdimvarLabels(1〜10、1〜3)を使用します'多次元配列

  • Dim objSpssApp As?

「理論的には」、これをバリアントタイプのままにすることも、実行することもできます。

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の場合)

カウンターを使用する場合は、カウンターをインクリメントするため、常にNextiCounterを使用してください。

この返信がお役に立てば幸いです。

于 2012-06-28T09:54:05.583 に答える