0


在开始之前,我想指出我将这个问题标记为 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

这绝不是功能代码,它基本上只是我想要实现的过程的伪代码我只是在寻找一些帮助,如果你可以的话,那将是神奇的。

非常感谢提前
马夫

4

1 回答 1

2

Winwrap 和 VBA 与您可以在这篇文章中找到的差异几乎相同:http: //www.winwrap.com/web/basic/reference/? p=doc_tn0143_technote.htm 我没有使用过 winwrap,但我会尝试用我从 VBA 获得的知识来回答。

  • 将 varLabels 调暗为变体

您可以通过说例如 dim varLabels() as variant '动态声明数组 dim varLabels(10) 作为变量 '静态声明数组 dim varLabels(1 到 10) 作为变量 '从 1 开始的数组 - 我多使用 dim varLabels(1 to 10, 1 to 3) '多维数组

  • 将 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 iCounter,因为它会递增计数器。

我希望这个回复可能对你有用!

于 2012-06-28T09:54:05.583 回答