[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
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.