[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ぶっくの共有にて』(みほ)
ブックの共有をしているエクセルがあります。
シートが大量にあり、常に何人かが見たり変更したりします。
そこで、メインシートを作成し、すべてのシート名を入力しました。
やりたい事としては、メインページにてどのページを参照しているか確認できることは可能ですか?
全員が毎回上書き保存をするとは限りません。
よろしくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
無理なんで、シートを別のブックに分けて共有かけないで管理されては・・・ (稲葉) 2023/03/16(木) 08:42:21
マクロ(のイベント)をつかえば、ユーザがどのシートを参照しているか、書き出し(更新)することは出来そうですが、「ブックの共有」だと即時反映は無理だった気がします。
よって、Excel2010では、お望みのことは難しいとおもいます。
私が知らないだけかもしれませんから、他の回答者さんの意見も参考にしてください。
(もこな2) 2023/03/16(木) 08:46:38
しかもちょっとめんどくさいマクロになりそうなので
稲葉さんの言われるようにブックをわけるほうがよいと思います。
さらに前述のとおりやったことも環境もないので
もこな2さんの懸念されている反応速度はわかりません。
これもやったことありませんが、
監視ボタンを作って、押されていれば数秒ごとにActiveシートを確認することもできるような気がしますが、断言できません。
ここまで書いて思ったのですが、
ファイルが更新(上書き)されないとせっかく追加したユーザ名等が反映されないので
管理シートではなく別ブックにして
シートが切り替わるたびに別に作った管理ブックを開いて更新して閉じる???
PCやネットワーク環境によっては重くなりそうですね。
お役に立てず申し訳ないです。
(たつ) 2023/03/16(木) 12:53:00
共有ブックの
・Private Sub Workbook_SheetActivate(ByVal Sh As Object)
にて、各個人Name.xlsのA1セルにADOでsh.nameを書き込みます。
http://www.ken3.org/asp/backno/asp103.html
(接続最初は時間かかるけど2度目からは早そう)
http://pineplanter.moo.jp/non-it-salaryman/2019/06/26/vba-username/
・メインページに
各個人Name.xls(のデータを反映させるセルを追加します。
例)同一ディレクトリの場合
A1:=[みほ.xls]Sheet1!A1 A2:=[Aさん.xls]Sheet1!A1 ・ ・ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) などにて、再度上記数式を書き込み直し、それを元に表を完成させます。
(kazuo) 2023/03/16(木) 15:17:35
とりあえずテキストファイルに都度都度書き出ししておいて...
Option Explicit Rem ----------------------------------------------------------------------------------------------------------------------------------- Private Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long Private Function GetPCName() As String Dim str As String str = String(&H100&, Chr(0)) Call GetComputerName(str, Len(str)) GetPCName = Left$(str, InStr(1, str, Chr(0)) - 1) End Function Private Sub WriteMyIni(argKey As String, argValue As String) Call WritePrivateProfileString(GetPCName & "\" & Application.UserName, argKey, argValue, ThisWorkbook.Path & "\UserLog.ini") End Sub Rem ----------------------------------------------------------------------------------------------------------------------------------- Private Sub Workbook_AfterSave(ByVal Success As Boolean) Call WriteMyIni("TimeLastSaved", CStr(Now())) End Sub
Private Sub Workbook_Deactivate() Call WriteMyIni("TimeDeactivate", CStr(Now())) End Sub
Private Sub Workbook_Open() Call WriteMyIni("TimeOpened", CStr(Now())) End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Call WriteMyIni("ActiveSheetTimeActivate", CStr(Now())) Call WriteMyIni("ActiveSheetName", CStr(Sh.Name)) End Sub
必要になったらテキストファイルからリスト作る。 (GetPrivateProfileString使って読み込むも良し、リスト作るんだからシーケンシャルに読み込んでもOKでしょうし) という手もイケるかも知んないですね。
(白茶) 2023/03/16(木) 16:01:18
>やりたい事としては それは貴方だけが知りたいんですか。 (興味津々) 2023/03/16(木) 19:20:31
あ、思い出し追記。
ユーザー名に Application.UserName だと都合悪い場合は、APIの GetUserName で。
って、 後で書こうと思って、案の定、書き忘れてました。^^;
【ExcelVBA API操作】ログイン名を取得(GetUserName)する方法を教えて! - 教えて!ExcelVBA!
https://www.osiete-excelvba.work/entry/2020/03/31/070000
(白茶) 2023/03/16(木) 19:45:05
それらしき事をやってみた。
|[A] |[B] |[C]|[D] [1] |シート名|参照 | |書き出し [2] |Sheet1 | | |Sheet2 [3] |Sheet2 |参照中| |Sheet4 [4] |Sheet3 | | |Sheet6 [5] |Sheet4 |参照中| |Sheet8 [6] |Sheet5 | | | [7] |Sheet6 |参照中| | [8] |Sheet7 | | | [9] |Sheet8 |参照中| | [10]|Sheet9 | | | [11]|Sheet10 | | |
これがメインシートだとします。 選択されているシートをD列に書き出す。 それをシート名の横に表示するようにしてみた。 D列はユーザー定義で「;;;」として表示しないようにする。 ThisWorkbookモジュールに Private Sub Workbook_Open() Call 複数選択したシートのシート名をクリップボードに取得 End Sub と記載する。 シートにボタンを設置して実行し時折確認する。
Sub 複数選択したシートのシート名をクリップボードに取得() '選択したシートは左側から順次ループ処理されます Dim V As String Dim mySheet As Object Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する For Each mySheet In ActiveWindow.SelectedSheets '選択したシートに対してループ処理を行う V = V & mySheet.Name & vbCrLf Next mySheet V = Left(V, Len(V) - 2) '最後の改行区切りを取り除く(CrLfは2文字) myLib.SetText V '変数の値をDataObjectに格納する myLib.PutInClipboard 'DataObjectのデータをクリップボードに格納する Call 書き出し '追加 Call 参照 '追加 End Sub Sub 書き出し() Sheets("Sheet1").Select Range("D2").Select Range("D2:D11").Delete ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True Range("B2").Select End Sub Sub 参照() Range("B2").Value = "=IF(COUNTIF($D$2:$D$10,A2)=1,""参照中"","""")" Selection.AutoFill Destination:=Range("B2:B11") End Sub
「複数選択したシートのシート名をクリップボードに取得」は https://kouten0430.hatenablog.com/entry/2018/04/20/233915 を参考にしました。
共有ブックを使用できる環境じゃないので これでいのかどうかわかりませんが参考にしてください。 (KLY) 2023/03/17(金) 16:16:01
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.