MXMEMORY (maximum cumulative memory) = 14,300K bytes 256K bytes are currently allocated. WORKSPACE (special workspace memory limit) = 1,000K bytes. |
Number of locations requested = 123520; Number of locations available = 12699 >Error encountered in source line # 2831 >Error # 12477 >MATRIXの作業領域が使い果たされています。追加のメモリを割り当ててから再 >度実行するか、RELEASE宣言を使って未使用の行列を解放してください。割り >当てるすべての対象をリストするには、DISPLAY宣言を使ってください。ある >いは、SET WORKSPACEコマンドで作業領域を増やしてください。 , or change the >Special Working Memory Limit in the Options Dialog Box. >This command not executed. |
MXMEMORY (maximum cumulative memory) = 14,300K bytes 1,327K bytes are currently allocated. WORKSPACE (special workspace memory limit) = 3,000K bytes. |
[専用ワークスペースのメモリ制限]どういう風に参考にしたらいいかよくわからないですね。どういう単位で出力されているのでしょう。
(略)
「ワークスペースの割り当てを変更しなければなりません」というメッセージが表示された場合、専用メモリ ワークスペースの制限を大きくします。新しい値を決めるには、メモリ不足メッセージの前に出力ウィンドウに表示される情報を使用します。ワークスペースの割り当てを増やすと特定状況下では性能を低下させるので、手続きの終了後、制限を以前の容量 (デフォルトは 512K) に戻してください。(太字筆者)
スクリプトからデータ文書にあるデータを直接参照できないようです。と書いたが,直接参照できることが分かった。
'----------------------------------------
Sub getandputdata()
Dim objDocuments As ISpssDocuments
Dim objDataDoc As ISpssDataDoc
Dim lngNumCases As Long
Set objDocuments = objSpssApp.Documents
Set objDataDoc = objDocuments.GetDataDoc (0)
' ファイルに含まれているケースの数を取得する
lngNumCases = objDataDoc.GetNumberOfCases
If lngNumCases=0 Then
MsgBox "データがありません。終了します。"
End
End If
'新変数を作るにはやはり,シンタックス
Dim strCommand As String
strCommand = "string plabel (a11)." &vbCrLf
strCommand = strCommand + "exec." &vbCrLf
objSpssApp.ExecuteCommands strCommand , True
'シンタックスを実行する。 True は終了までまつ。同期させるということ。
'(1)本来なら,次のvariant を使えば簡単にデータをget できるはず。
'Dim SpssTextData As Variant
'SpssTextdata = objDataDoc.GetTextData ("varcat", "varcat", 1, lngNumCases)
'しかしちょっとケース数が多いとエラーがでてしまう。使用環境によってはこれでいいだろう。
'(2)そこで一つずつデータを読む
'(3)エラーとラップの仕掛け:
'データスクロールが遅いので,? を受け取ることがある。
'そのときエラーとしてトラップし,(14)で時間を1秒おき, (4)のところに戻り,再度読み込む。
On Error GoTo errortrap
Dim i As Integer, j As Integer, k As Integer
Dim xd As Variant,slabel As String
For i=1 To lngNumCases
'(4)(8)でエラーがでたときここから再度読み込む
restart:
'(5)(2)の一つずつ読むの実行部
xd=objDataDoc.GetTextData ("varcat", "varcat", i, i)
'(6)シンタックスのときのSPSSのお薦めのポーズの入れ方だが,効果無し
While objSpssApp.IsBusy
'pause
Wend
'(7)一定の時間をおく方法も試みたがエラートラップのほうが有効であった。
'If (Int(i/30))*30=i Then Wait 1
'ここからはラベルを作るための作業で無視していい
'(8)ここでエラーが生じる。xdはvariant だが,数値型で入るデータ。(もし文字型だったらどうなる)
j=Val(Right$(CStr(xd(0,0)),2))
k=Int(xd(0,0)/100)
'(9)データ書き込みをslabelにためている。
'slabel=slabel+cstr(xd(0,0)) &vbCrLf でよい
slabel=slabel+strVarsSelected(k-1)+"_"+CStr(j) &vbCrLf
Next i
'(10)書き込みの最初の位置を決めている。gettextdata は読み込みのための命令だが,これでも動いている
xd = objDataDoc.GetTextData ("plabel", "plabel", 1, 1)
'(11)クリップボードに書き込む
Clipboard$ slabel
'(12)クリップボードへの書き込みは意外と時間がかかることがあるので,安全のためwait 1秒
Wait 1
'(13)クリップボードからデータエディタに書き込み。 &vbCrLf で一つずつリターンが入っているので,順々に書き込んでいく。こっちは高速。
objDataDoc.Paste
Exit Sub
'(14)エラートラップはexit sub のあとに。
errortrap:
Wait 1
Resume restart:
End Sub