[[20081001224855]] 『Calculate、CalculateFull』(ひでん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Calculate、CalculateFull』(ひでん)

 複数のブック(全てにユーザ関数がはいっています)を開いていて、
 指定ブックをアクティブにした時そのブックのみ再計算をさせたい。

 activesheet.Calculateをすると、ステータスバーに再計算の表示消えずに残る。 
 application.CalculateやCalculatefullの場合指定したブック以外も再計算される。

 アクティブブックのみユーザ関数の再計算する方法はありますか?

 「指定ブック」とは、「複数のブック」の任意の一つと言う意味ですか?
つまり、マクロの仕様的に同じものとして運用したいのかどうか、と言うことですが。
一つのブックだけそうしたいと言うのなら、Workbook_Activateイベントで可能だとは思います。
が、
どのブックでも「アクティブにしたときに再計算する」と言う仕様だと、
再計算することを目的としてないのにたまたまアクティブになってしまったとき、
再計算されてしまうので、Workbook_Activateイベントは向いていないような気がします。
 
アイデアとしては、ボタンクリックなどユーザーの意図を確実に反映するイベントマクロで、置換。
(Function test()というユーザー定義関数の場合)
 
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Cells.Replace what:="=test(", replacement:="=test("
Next sh
 
つまりは、対象ブックの対象関数だけ入力しなおすわけですが。
なお、下記が放置状態です。
あなたの相談を検索でご覧になる方もいらっしゃいます。
回答が適切であったかどうかはそれらの方に大変有効な情報になり得ますので、
結果報告を書き込んでみてください。
 
[[20080926201858]] 『メッセージを表示したままセルの移動、入力』(ひでん)
[[20080929223135]] 『セルの表示形式』(ひでん)
[[20080929224304]] 『条件付書式でセルの表示形式』(ひでん)
 
(みやほりん)(-_∂)b


回答ありがとうございます。
実は、会社でブックをメールで改良しながら作成しているので、誰が、いつ更新したか知りたい為
ユーザー関数でBuiltinDocumentProperties関数を使用しています。この関数を使用したブックを複数開いているときにアクティブブックをApplication.Calculate後、保存したら、アクティブブック以外のブックも再計算され、ブックを開いたあとデータの更新がないのに変更有状態になりブックを閉じるときに保存するか?の確認されます。変更なしのブックを確認なしに閉じたいのですが・・・
質問がへたで申し訳ありませんが、下に現在のマクロを記載します。save時、シート選択時にそのアクティブブックのみ再計算したいのです。宜しくお願いします。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

   Dim MySvNm As Variant
      Application.StatusBar = ""               'ステータスバー
      Application.EnableEvents = False        'イベント中止
    MySvNm = Application.Dialogs(xlDialogSaveWorkbook).Show
      Application.EnableEvents = True         'イベント開始
      Application.StatusBar = False               'ステータスバー
      If MySvNm <> False Then
        Application.StatusBar = ""               'ステータスバー
    MyPh2$ = MyUserName()
    MyPh3$ = Replace(MyThisWorkbookPath(), MyHomePath(), "")
ThisWorkbook.BuiltinDocumentProperties("Title") = "(書込パス)" & MyPh3$
ThisWorkbook.BuiltinDocumentProperties("Subject") = "(書込名)" & MyThisWorkbookName()
ThisWorkbook.BuiltinDocumentProperties("Author") = "(書込パソコン)" & MyComputerName()
ThisWorkbook.BuiltinDocumentProperties("Manager") = "(書込OS)" & MyOsNm()
ThisWorkbook.BuiltinDocumentProperties("Company") = "(書込ユーザー)" & MyPh2$
ThisWorkbook.BuiltinDocumentProperties("Category") = "(書込日)" & Now()
ThisWorkbook.BuiltinDocumentProperties("Keywords") = "(書込ホームパス)" & MyHomePath()
ThisWorkbook.BuiltinDocumentProperties("Comments") = "(書込場所)" & MyThisWorkbookFullPath()
ThisWorkbook.BuiltinDocumentProperties("Hyperlink base") = "(書込エクセルVer)" & MyXlsNm()

       APPLICATION.Calculate            'すべて計算

        Application.StatusBar = False               'ステータスバー
          Application.EnableEvents = False        'イベント中止
            ActiveWorkbook.Save
          Application.EnableEvents = True         'イベント開始
        ActiveWorkbook.Saved = True       '変更クリア
      End If
    Cancel = True
End Sub

Private Sub workbook_sheetactivate(ByVal Sh As Object)

     Application.Run "再計算"
End Sub

Sub 再計算()

   MyChgCk = "変更無"
   If ActiveWorkbook.Saved = False Then         '   If Not ActiveWorkbook.Saved Then
        MyChgCk = "変更有"       'MsgBox "このブックには保存されていない変更があります。"
   End If
        ThisWorkbook.Application.CalculateFull            'すべて計算
   If MyChgCk = "変更無" Then
   Else
        ActiveWorkbook.Saved = False       '変更あり
   End If
   MyChgCk = ""
End Sub

Function MyThisWorkbookName() 'ファイル名

    MyThisWorkbookName = ThisWorkbook.Name
End Function

Function MyComputerName() 'コンピュータ名

    MyComputerName = CreateObject("WScript.Network").ComputerName
End Function

Function MyOsNm()

     Dim osvsn
    Dim 商品名, タイトル
    osvsn = Application.OperatingSystem         'OSのバージョン情報を取り出す
    If osvsn = "Windows (32-bit) NT 5.01" Then
                                                商品名 = "Windows XP"
    ElseIf osvsn = "Windows (32-bit) NT 5.00" Then
                                                商品名 = "Windows 2000"
    ElseIf osvsn = "Windows (32-bit) 4.90" Then
                                                商品名 = "Windows Me"
    ElseIf osvsn = "Windows (32-bit) 4.10" Then
                                                商品名 = "Windows 98"
    ElseIf osvsn = "Windows (32-bit) 4.00" Then
                                                商品名 = "Windows 95"
    ElseIf osvsn = "Macintosh (PowerPC) 10.13" Then
                                                商品名 = "Mac OS X"
    ElseIf osvsn = "Macintosh (PowerPC) 9.00" Then
                                                商品名 = "Mac OS 9"
    Else                                        'それ以外
                                                商品名 = "不明"
    End If
    MyOsNm = 商品名
End Function

Function MyHomePath()

    MyHomePath = Environ("homepath")
End Function

Function MyThisWorkbookPath() 'パス名

    MyThisWorkbookPath = ThisWorkbook.Path
End Function

Function MyThisWorkbookFullPath() 'フルパス名

    Dim Mychk$
    Mychk$ = ThisWorkbook.Path
    If Left(Mychk$, 2) <> "\\" Then
        Mychk$ = "\\" & MyComputerName() & "\" & Mychk$
    End If
    MyThisWorkbookFullPath = Mychk$
End Function

Function MyXlsNm() 'Windowsパソコンだけの環境用

    Dim バージョン, 商品名
    バージョン = Application.Version            'バージョン番号を取得
    Select Case Val(バージョン)
        Case Is >= 12
                    商品名 = "2007"
        Case Is >= 11
                    商品名 = "2003"
        Case Is >= 10
                    商品名 = "2002"
        Case Is >= 9
                    商品名 = "2000"
        Case Is >= 8
                    商品名 = "97"
        Case Is >= 7
                    商品名 = "95"
        Case Else
                    商品名 = "不明"
    End Select
    MyXlsNm = "Excel " & 商品名
End Function


 「アクティブブックのみ再計算したい」というのは、結果的に
「必要ないブックは再計算されたとしても保存されずに閉じられればよい」
と言うことですよね?
 
保存したいブックと保存したくないブックの差異は「アクティブかどうか」
だけのように文面からは読み取れるので、「アクティブなブックだけ○○する」が
ホントウに安定した作業なのかどうかを、ご自身で判断してください。
 
アクティブかどうか、って言うのは区別する目印としては弱い、と私は考えます。
意図しないブックが実はアクティブだった、というケースはありえます。
レイアウトのそっくりな、兄弟・従兄弟関係のブックをたくさん開くならなおさらです。
 
「アクティブブックのみ再計算」というロジックを考えるのが面倒臭い、また、
わからないせいもありますが、上書したくないものを、上書できる状態で開いているのが、
「再計算されると困る」原因なのではないかと。
 
私なら、
ブックを開く段階からマクロを使って、目印をつけるでしょう。
 
確認するだけのファイルなら、OpenメソッドでReadOnly属性をつけて開く。
更新するファイルなら単に開くだけ。そういうのをマクロで作っておきます。
Workbook_BeforeSaveイベントやWorkbook_BeforeCloseイベントで、ReadOnlyのブックは
保存せずに閉じ、そうでないブックは保存するかどうか選択をさせる分岐をさせます。
 
万が一、悪意で保存動作をしても、ReadOnlyのブックは上書できないので、事故も(ある
程度)防げます。ただ、ブックを間違って開いてしまう可能性もありますから、
私としては「更新するつもりで開いたファイル」では、保存時の上書確認メッセージは
なるべく残したいところですね。
 
コードは検証していないのであしからずご了承ください。
(みやほりん)(-_∂)b
 


ご意見ありがとうございました。
やりたいことの表現がへたで、すみません。
必要ないブックは再計算されたとしても保存されずに閉じられればよい。ともやりたいことが、異なります。
複数のブックを複数のパソコンで編集しメールでやりとりし、ブックを改良していきたい為、誰がいつ最後に変更したか?しりたいのです。
そのために、保存時にブックプロパティに最終変更者や変更日を記録し、印刷されたときも判るようにシートにユーザー関数にて表示しようと思っています。
参照するためとして開いたブックは、保存せずに閉じれるようにしたい。(保存すると、変更もしていないのに最終変更者になってしまう)
参照するために開いたブックも編集される可能性があり、そのときは、編集した人の情報を保存したいのです。
したがって、複数のブックを開き、全てのブックを編集するときもあり、参考として開いたブックのときもあります。また保存後、閉じないままその後編集することもあります。
そのため保存時に、保存するブックのみユーザー関数の再計算して、保存し、それ以外のブックは再計算したくないのです。
やはり、無理なことをしようとしているのでしうか?


 >保存時にブックプロパティに最終変更者や変更日を記録し、
 >印刷されたときも判るようにシートにユーザー関数にて表示
 
そのユーザー定義関数はセルに入力しておく必要はあるのでしょうか。
関数としてセルに入力してあるから、再計算しちゃうわけですし。
 
保存時に、プロパティ設定するのは問題ないとして、
シートに表示する必要があるのなら、保存時にプロパティに設定した内容を
直接セルにも値代入してはいかがでしょうか。
 
ブックを開いたときに必ず値が変化するような関数が他になければ、
手を加えないかぎり、そのまま閉じることができるのではないでしょうか。
 
(みやほりん)(-_∂)b 


ありがとうございました。
印刷時にフッターに設定、保存時にセルに値として代入する方法しかないのですね。
この方法でやつてみます。

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.