2016-04-01 3 views
0

ファイルサイズを返すVBA関数を定義しました。これで、別のマクロを呼び出すボタンで呼び出すようになりました。私の期待は、マクロを実行した後、私の機能を最後に呼び出すということです。私の問題は、セルに式を入れると、式を入力する瞬間に現在のファイルサイズが返されるということです。ファイルを編集して保存し直しても、編集前のファイルサイズは= wbksize()に表示されます。ボタンでVBA関数を実行する

ボタンで実行されるこのマクロの目的は、ファイルサイズの値を更新することです。ここでそれをやろうとしています。

機能:

Function wbksize() 
    myWbk = Application.ThisWorkbook.FullName 
    wbksize = FileLen(myWbk) 
End Function 

リフレッシュ:

Worksheets("Sheet2").Range("K1").Calculate 

上記動作していないよう:/

+2

マクロ/関数の実行を開始していないようです。デフォルトでは、ワークブック/シートを計算するだけなので、関数は実行されません。このように計算する関数は '揮発性'として知られており、関数の最上部付近に 'Application.Volatile'を追加することで明示的に定義することができます。もっと見る:http://excel.tips.net/T002013_Forcing_a_Macro_to_Run_when_a_Worksheet_is_Recalculated.html –

+0

また、ボタンをクリックしたときに関数を実行したい場合は、ボタンに関数を割り当てることができます。ボタンをクリックし、 "Assign Macro"を選択します(あなたのボタンはActiveXコントロールではなくフォームコントロールの基本であると仮定します)。 –

+2

関数は値を返します。そのため、ボタンによって呼び出すことはできません(値を返す場所がないため)。あなたはMichal Wolinskiの答えのようにそれをカプセル化しなければならないでしょう。 – Vegard

答えて

1

機能は正常に機能しますが、機能を呼び出すときにはリフレッシュする必要があります。

Function wbksize() As String 
    myWbk = Application.ThisWorkbook.FullName 
    wbksize = Str(FileLen(myWbk)) 
End Function 
Sub Refresh() 
    Worksheets("Sheet2").Range("K1") = wbksize 
End Sub 
+0

Michał - それは非常に合理的な解決策と思われますが、私は下付き文字が範囲外です。私は 'サブリフレッシュ() 点心wsToRefreshワークシートとして 設定wsToRefresh =シート(2) 設定rngToRefresh = wsToRefresh.Range( "K1") rngToRefresh = wbksize エンドSub' 問題とそれを解決しました私がSubを実行してトリガーボタンに固定され、そこに 'Call Refresh'という行があると、Sheet2.K1に変更はありません。セルに '= wbksize()'が含まれていても空であっても問題ありません。私はVBAについて本当に愚かですので、明示してください。ありがとう! –

+1

変更されました。埋め込まれたマクロとして保存したのか、エラーがコードの別の部分にあるのかを確認してください。ワークブックが計算されたときに呼び出す場合は、上記のようにPrivate Sub Worksheet_Calculate()と命名します。 –

0

これは、またはあなたの状況であなたを助けていない場合があります.... LINK

これをExcelで使用する必要はありませんでしたが、あなたは何かが計算されるたびにそれらを実行するように強制する「VOLATILE」としてカスタム関数を設定することができます。これを使う必要は一度もありませんので、私は何かの欠点や何かにコメントすることはできません。

0

私はこれをテストしましたが、どちらも正常です。これは、トリガーをどのようにするかによって異なります。ワークシートの変更、またはワークシートの計算の実行。

いずれかをワークシートに挿入します。最初はCalculateでトリガされ、2番目はChangeでトリガされます。

Private Sub Worksheet_Calculate() 
Dim lFileLength As Long 
    Application.EnableEvents = False 'to prevent endless loop 
    lFileLength = FileLen("\\MyFile\Path\AndName.XLS.XLS") 
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value = CStr(lFileLength) 
    MsgBox "You changed THE CELL!" 
    Application.EnableEvents = True 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim lFileLength As Long 
    Application.EnableEvents = False 'to prevent endless loop 
    lFileLength = FileLen("\\MyFile\Path\AndName.XLS") 
    ThisWorkbook.Sheets("Sheet1").Range("B1").Value = CStr(lFileLength) 
    MsgBox "You changed THE CELL!" 
    Application.EnableEvents = True 
End Sub 
+0

Simon、Worksheet_Calculate()は静的なファイル名とパスを持っていると仮定していますか?私のスプレッドシートはバージョンIDで構成されているため、頻繁に更新され、ファイル名の変更が行われます。さらに、新しいバージョンが異なる受信者に送信され、ファイルパスを動的にチェックする必要があります。この場合、CELL( "filename")が役立つことがわかります。 –

関連する問題