[[20230316075359]] 『ぶっくの共有にて』(みほ) ページの最後に飛ぶ

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

 

『ぶっくの共有にて』(みほ)

ブックの共有をしているエクセルがあります。
シートが大量にあり、常に何人かが見たり変更したりします。
そこで、メインシートを作成し、すべてのシート名を入力しました。

やりたい事としては、メインページにてどのページを参照しているか確認できることは可能ですか?
全員が毎回上書き保存をするとは限りません。

よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 無理なんで、シートを別のブックに分けて共有かけないで管理されては・・・
(稲葉) 2023/03/16(木) 08:42:21

断言しませんが、一般機能では多分無理です。

マクロ(のイベント)をつかえば、ユーザがどのシートを参照しているか、書き出し(更新)することは出来そうですが、「ブックの共有」だと即時反映は無理だった気がします。

よって、Excel2010では、お望みのことは難しいとおもいます。

 私が知らないだけかもしれませんから、他の回答者さんの意見も参考にしてください。

(もこな2) 2023/03/16(木) 08:46:38


ありがとうございます。
やはりそれぞれが上書き保存等をしないと難しそうですね
もしやり方を知っている方がいましたらお願いします。
(みほ) 2023/03/16(木) 10:13:21

管理シートを別に作成して
(メインシートでもいいけど編集されると困るので)
workbook_Openで管理シートのA列にユーザ名、B列にIPアドレス辺りを縦に追加していく。
workbook_Closeで追加したユーザ名、IPアドレス等を削除する。
workbook_SheetActivateでC列にアクティブになったシート名を上書きしていく。
メインシートは管理シートを参照させる。
とすればできそうな気がしますが、環境がないので試せません。

しかもちょっとめんどくさいマクロになりそうなので
稲葉さんの言われるようにブックをわけるほうがよいと思います。

さらに前述のとおりやったことも環境もないので
もこな2さんの懸念されている反応速度はわかりません。
これもやったことありませんが、
監視ボタンを作って、押されていれば数秒ごとにActiveシートを確認することもできるような気がしますが、断言できません。

ここまで書いて思ったのですが、
ファイルが更新(上書き)されないとせっかく追加したユーザ名等が反映されないので
管理シートではなく別ブックにして
シートが切り替わるたびに別に作った管理ブックを開いて更新して閉じる???
PCやネットワーク環境によっては重くなりそうですね。

お役に立てず申し訳ないです。
(たつ) 2023/03/16(木) 12:53:00


 やったこと無いけど、
 (.xlsのほうが読み書き動作速そうだから)個人Name.xls(2003タイプ)を人数分作ります

 共有ブックの
  ・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.