3

使用されているカスタマイズされたスプレッドシート ソリューションが多数あり、それらを追跡するプログラムによる方法が必要です。これらは明らかにスプレッドシートであるため、ローカルに保存したり、名前を変更したりできるため、それを考慮できるソリューションが必要です。

いくつかのアイデアは次のとおりです。

  1. スプレッドシートを開いたときに、OnOpen イベントを処理し、追跡のためにデータベースにメッセージを書き込みます

これに関する問題は、データベースの詳細をどこに保存するかです。データベースがダウンした場合、スプレッドシートがクラッシュすることは望ましくありません。

上記のすべての問題を処理する優れたスプレッドシートの在庫管理ソリューションを思いついた人はいますか?

4

8 に答える 8

3

ここで解決しようとしている問題がわかりません。最終結果としてスプレッドシートの使用状況のログを記録する必要はありません。何かが問題を引き起こしています。これは、それを修正するために考案したものです。

すべてのスプレッドシートの使用状況を真剣に信頼できるログに記録する必要がある場合、これは機能しないと思います。ほとんどの信頼できるログが必要な場合は、データベースを使用するだけで、データベースがダウンする (まれな) 状況について心配する必要はありません。On Error Resume Nextそのイベントでスプレッドシートが継続することを保証するのに十分なはずです。

そうは言っても、私は Web ベースのソリューションを採用する傾向があります。そうすれば、必要なデータベース ドライバーを全員が確実に手に入れたり、接続文字列を動作させたり、その他の恐ろしさを感じたりする必要がなくなります。

別のアプローチが必要かもしれないと私に思わせるいくつかの厄介な質問:

ロギング ソリューションへの変更をどのようにデプロイしますか?

ユーザーはマクロのセキュリティ レベルを制御できますか? それとも、マクロを作成および編集する機能ですか? したがって、彼らは(無邪気であるかどうかにかかわらず)ロギングを無効にすることができますか?

ユーザーはオフラインで操作できますか? その後どうなりますか?

于 2009-05-18T19:07:18.650 に答える
1

これと非常によく似た操作を行って、Excelアプリケーションの現在のバージョンを確認します。これと同じコードを使用して、「ヒット」をログに記録するサーバーへのWebリクエストを簡単に作成できます。これが私のコードです:

ThisWorkbook

Option Explicit

Private Sub Workbook_Open()
    Updater.CheckVersion
End Sub

他の場所(アップデータと呼ばれるモジュール内)

Option Explicit

Const VersionURL = "http://yourServer/CurrentVersion.txt"
Const ChangesURL = "http://yourServer/Changelog.txt"
Const LatestVersionURL = "http://yourServer/YourTool.xlsm"

#If VBA7 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If


Public Sub CheckVersion()
    On Error GoTo fail
    Application.StatusBar = "Checking for newer version..."

    Dim ThisVersion As String, LatestVersion As String, VersionChanges As String
    ThisVersion = Range("CurrentVersion").Text
    If ThisVersion = vbNullString Then GoTo fail

    LatestVersion = FetchFile(VersionURL, , True)
    VersionChanges = FetchFile(ChangesURL, , True)
    If LatestVersion = vbNullString Then
        Application.StatusBar = "Version Check Failed!"
        Exit Sub
    Else
        If LatestVersion = ThisVersion Then
            Application.StatusBar = "Version Check: You are running the latest version!"
        Else
            Application.StatusBar = "Version Check: This tool is out of date!"
            If (MsgBox("You are not running the latest version of this tool. Your version is " & _
                ThisVersion & ", and the latest version is " & LatestVersion & vbNewLine & _
                vbNewLine & "Changes: " & VersionChanges & vbNewLine & _
                vbNewLine & "Click OK to visit the latest version download link.", vbOKCancel, _
                "Tool Out of Date Notification") = vbOK) Then
                ShellExecute 0, vbNullString, LatestVersionURL, vbNullString, vbNullString, vbNormalFocus
            End If
        End If
    End If
    Exit Sub
fail:
    On Error Resume Next
    Application.StatusBar = "Version Check Failed (" & Err.Description & ")"
End Sub

ご覧のとおり、URLが利用できない場合でもアプリがクラッシュせず、ステータスバーにユーザーにメッセージを書き込むだけのエラー処理が行われています。

これを行うWebサービスを設定したくない場合は、スプレッドシートにデータベースへの書き込みを試みることができます。このコードの多くを再利用できますが、それほど多くは再利用できません。

于 2012-05-01T15:17:11.500 に答える
1

あなたの考えは良いです。通常、データベースの可用性は、ユーザーのラップトップの可用性よりも高くなります。また、VBA には一種のプリミティブ エラー (例外) 処理があるため、おかしなエラー メッセージが表示されるとは限りません。

はい、あなたは損をしています。ユーザーがネットワークに接続していないときにオフラインで保存されたシートの使用は、データベースから失われます。しかし、これに対する 100% 確実な解決策はないと思います。

Financial Times の記事で、「Excel - その場しのぎでエラーが発生しやすいツール」などを検索してみてください。タイトルでさえすべてを物語っています。

于 2012-05-04T10:02:05.780 に答える
1

これまでに行われた提案とあなたが書いたものが気に入っています。私は個人的に物事をシンプルにするのが好きなので、ここに私の謙虚な提案があります。管理している可能性のあるテンプレートがたくさんあるように思えますが、Excel では物事がすぐに面倒になり、数式が改ざんされていないことを知るのは困難です。それを念頭に置いて、代わりにデータベース変更管理ソリューションを忘れてしまいます。

  • 読み取り専用に設定され、社内の全員がアクセスできる共有ドライブ フォルダーを作成する
  • チーム、部門、場所など、機能するものごとに意味のあるサブフォルダー構造を作成できます
  • Excel テンプレートの最新のコピーをフォルダーに保存します。
  • また、重要な計算を含むテンプレートをロックすることをお勧めします --> 必要に応じてカスタマイズできるように、できるだけ開いたままにしておいてください。

また、このフォルダー構造への変更を管理するバージョン コントロール リポジトリの設定を検討することもできます。tortoiseSVN のようなシンプルなインターフェイスでバージョン管理を調べて、いつ、どのような変更が行われたかを追跡できます。標準の共有ドライブのバックアップは命の恩人ですが、バージョン管理システムを追加したいと思います (作業を少し楽にするだけです)。始めるのに役立ついくつかのリンクを次に示します。Subversion をローカルで試して、どう思うかを確認してください。

Windows で Subversion をセットアップする手順

Subversion と対話する Tortoise クライアント

また、すでに述べたように、スプレッドシートに何らかのデータベース接続を実装してデータベースサーバーでログを実行することを選択した場合は、「on error resume next」を使用できます。できることは次のとおりです。

  • 再開後、DB への接続を開く次の試み
  • 次のようなifステートメントを使用して、エラーを処理することを選択できます。

    if err.number = 3024 then
        msgbox "Database file not found, check network connection and retry"
        exit
    end if
    

同様の方法でトラップするための追加のエラー コードを検索するためのリンクを次に示します。

VBA でのエラー トラップ

于 2012-04-30T01:26:05.120 に答える
1

Excel スプレッドシートで Web サーバーにリクエストを送信します。

msinet.ocx をツールボックスに追加し、Inet コントロールを含むフォームを作成します。ツールボックス領域のどこかを右クリックして、ocx を追加します。

次に、スプ​​レッドシートが開かれたことを処理できる場所に Inet コントロールの場所を設定できます。

于 2009-05-18T18:57:05.503 に答える
1

短期的にはログインする必要があるかもしれませんが、長期的な解決策は、スプレッドシートを管理下に置くことです。スプレッドシートの「最終的な」コピーを収集し、それらをすべて保護されるファイル共有に移動する必要があります。ユーザーはそれらのデータを変更できますが、数式を変更することはできません。

より制御されたコラボレーション ソリューションが必要な場合は、SharePoint の使用を検討する必要があります。おそらく、Excel Services を搭載した MOSS バージョンです。

また、スプレッドシートがどのように使用されているかを調査する必要がある場合もあります。おそらく、誰かがプログラムを書く代わりにそれらが使われているのでしょう。

最後に、スプレッドシートの使用状況を追跡する必要はありません。子供のサッカー チームのスコアを追跡するために誰かがスプレッドシートを作成してもかまいません。それはあなたが興味を持っている特定のスプレッドシートです。ロギングは、最初はそれを追跡するのに役立つかもしれませんが、それがあなたを助けることができるすべてです.

于 2009-05-18T19:12:22.807 に答える
0

いくつかのファイル整合性監視ソリューションのいずれかを使用して、ファイルベースのアプローチを実行できます。Samhain は、無料のオープン ソースの 1 つの例です。これにより、従業員は干渉を受けることなくスプレッドシートにアクセスできますが、新しいスプレッドシートが発見されたとき、またはタイムスタンプやハッシュ値が変更されたときに報告されます。また、開発者がネットワークに再接続すると、開発者がオフライン (ラップトップなど) で行われた変更も検出されます。

于 2012-04-30T01:37:24.813 に答える
0

データベースに書き込みます。書き込みが失敗した場合は、エラーをキャッチし、データベースがバックアップされたときに手動でカウントを増やすことができる人に電子メールを送信します。

于 2009-05-18T18:48:12.370 に答える