2016-08-30 10 views
0

私はLibreOffice Calcにマクロを書きましたが、正しく動作することができました。しかし、ファイルを閉じてから再び開くと、正しい値の代わりに常に#NULL!と表示されます。私はここで何が欠けていますか?LibreOfficeマクロは常に#NULLを表示します!ファイルを開いた後に

マイマクロコード

Rem Attribute VBA_ModuleType=VBAModule 
Option VBASupport 1 
Function Calculate(CalType As String) As Double 
' 
' Calculate Macro 
' 

Dim i As Integer 
Calc = 0 

i = 1 

Do While Not IsEmpty(Cells(i, 2)) 
    If (Cells(i, 3).Value = CalType And (Cells(i,2) = "A" Or Cells(i,2) = "B")) Then 
     Calculate = Calculate + Cells(i, 4).Value 
    ElseIf (Cells(i, 3).Value = CalType And Cells(i,2) = "C") Then 
     Calculate = Calculate - Cells(i, 4).Value 
    End If 
    i = i + 1 
Loop 

' 
End Function 

は、呼び出し元の関数は、ファイルが.ods形式で保存され

=Calculate(J6)のようなものになります。

+0

問題を示すサンプルマクロを提供してください。また、.ods形式を使用していますか? –

+0

マクロコードを追加しました。 – rcs

答えて

0

Cells呼び出しが全く機能しませんでした。それはVBAであり、LO Basicではありません。しかし、私はそれが主要な問題だとは思わない。

LibreOfficeは、ユーザー定義関数が単純で、数式を含むセルにのみアクセスすると想定しています。関数が呼び出されたときにスプレッドシートがまだ完全に読み込まれていないため、他のセルを読み取ることはできません。

回避策は、エラーを無視して、関数を実行する前にドキュメントが完全に読み込まれるまで待つことです。例として、次のコードを取る:

Function ReadOtherCell(row, col) 
    On Error GoTo ErrorHandler 
    oSheet = ThisComponent.CurrentController.ActiveSheet() 
    oCell = oSheet.getCellByPosition(row, col) 
    ReadOtherCell = "value is '" & oCell.getString() & "'" 
    Exit Function 
    ErrorHandler: 
     Reset 
End Function 

Sub RecalculateAll 
    ' This is for user-defined functions that need to read the spreadsheet. 
    ' Assign it to the "View created" event, 
    ' because before that, the spreadsheet is not fully loaded. 
    ThisComponent.calculateAll 
End Sub 

はA2にA1でfoo、および=ReadOtherCell(0,0)を入力します。これまでのところ、これは同じ問題を抱えています。文書を最初に開くと失敗します。

今度は、Tools -> Customizeに行ってください。 [イベント]タブでView createdをハイライト表示します。 Macro...を押して、RecalculateAllの機能を見つけます。 OKを押します。

文書を閉じて再度開くと、セルA2にはvalue is 'foo'の結果が表示されます。

これはB. Marcellyの答えhttp://ooo-forums.apache.org/en/forum/viewtopic.php?f=20&t=73090&sid=f92a89d676058ab597b4b4494833b2a0に由来します。

+0

そして 'ThisComponent.calculateAll'は何をしていますか?どのように 'ReadOtherCell'関数に接続しますか?' row、col'パラメータは入力として必要ですか? – rcs

+0

'ThisComponent.calculateAll'は、A2の式を再計算し、' ReadOtherCell() 'を呼び出します。 –

+0

私はあなたの例を試してみましたが、ファイルを開くときに、セルに最終的に値が表示されても、パラメータの数が間違っています。 – rcs

0

私は同じ問題がありました。 モジュール内に空のSub Mainがあることがわかりました 私はそれを消去した後、機能が再び働き始めました

関連する問題