0

まず、私のシナリオを説明しましょう。

私は、PaperCut 無料版の Windows サーバーを持っていました。「papercut-print-log-all-time.csv」を出力します。その出力は常にサービスによって公開されており、誰かがそれを印刷するたびにカウントされ、誰がそれを行ったかなどの多くの情報が文書化されます。

今、私はExcelを開くたびに「すべての新しいレジスタを新しいフォームに自動的に追加して、使用法に関するグラフィックを作成する、ある種のExcelテーブルを作成しようとしています.

トリックはどこにありますか?開くたびに数式をプルダウンして新しいレジスタを手動で更新する必要はありません。

ある種のマクロを作成する必要があると思いますが(これまでに行ったことはありませんが、C#とVBを知っています)、動的テーブルといくつかのトリッキーな式でそれを作成できるかどうかはまだわかりません..

「papercut-print-log-all-time.csv」形式の例は次のとおりです。

Time    User    Pages   Copies  Printer FileName    Client  PaperFormat Lenguaje    Duplex  GrayScale   Format
11/27/2012 11:29    Mberiguette 2   1   Printer1    Microsoft Office Outlook - Memorando    client-pc1  Letter  PCL6    NOT DUPLEX  GRAYSCALE   120kb
11/27/2012 11:30    mabreu  1   1   Printer1    PDF Print   client-pc2  Letter  PCL6    NOT DUPLEX  GRAYSCALE   58kb
11/27/2012 11:30    mabreu  1   1   Printer1    PrintTest   client-pc2  Letter  PCL6    NOT DUPLEX  GRAYSCALE   21kb
11/27/2012 11:35    mabreu  1   1   Printer2    PrintTest   client-pc2  Letter  PCL6    NOT DUPLEX  GRAYSCALE   21kb
11/27/2012 11:35    Mberiguette 1   2   Printer2    Microsoft Word - Entrega factyras de Proveedor.doc  client-pc1  Letter  PCL6    NOT DUPLEX  GRAYSCALE   51kb

ご支援ありがとうございます。

4

1 に答える 1

0

モジュール内のWorkbook_Open()ルーチンにコードを追加することで、ワークブックが開かれたときに VBA ルーチンを実行することができます。ThisWorkbook( Alt-F11を押して VBA IDE を開き、コードをモジュールに追加します。)

以下のコード:

  • オブジェクトを開きScripting.TextStream、CSV ファイルを 1 行ずつ読み取る
  • TextStream は、以前にスプレッドシートに書き込まれていない最初の行に進められます
  • 後続の各行が読み取られ、String変数に格納されます
  • これStringはカンマで区切られたフィールドに分割され、結果はArray
  • 次にArrayスプレッドシートにコピーされます
Option Explicit

Private Sub Workbook_Open()
    Call UpdateFromCSV("your path here\papercut-print-log-all-time.csv")

End Sub

Private Sub UpdateFromCSV(filePath As String)
    Dim ts As Object    'Scripting.TextStream
    Dim s As String
    Dim v As Variant
    Dim i As Long

    Set ts = CreateObject("Scripting.FileSystemObject").GetFile(filePath).OpenAsTextStream(ForReading, TristateUseDefault)

    For i = 1 To Application.ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row
        ts.SkipLine
    Next i

    Do While Not ts.AtEndOfStream
        s = ts.ReadLine
        v = Split(s, ",")
        Application.ActiveSheet.Range(Application.ActiveSheet.Cells(i, 1), Application.ActiveSheet.Cells(i, 12)) = v
        i = i + 1
    Loop
    ts.Close

    Set ts = Nothing

End Sub

ただし、CSV ファイルのすべての値を含む書き込みアクセス権のあるスプレッドシートが必要な場合は、次のような方法を試すことができます。CSV ファイルを読み取り専用で開き、xlsx ファイルとして保存するだけです。

Option Explicit

Public Sub OpenSaveCSVasXlsx()
    Dim wb As Workbook

    Set wb = Application.Workbooks.Open("your path here\papercut-print-log-all-time.csv", False, True, 2, , , True, , , , False, , False)
    wb.SaveAs "your path here\papercut-print-log-all-time.xlsx", xlOpenXMLWorkbook, , , , , , xlUserResolution

    Set wb = Nothing

End Sub

Scripting.TextStreamオブジェクトの詳細についてはこちらWorkbooks.OpenメソッドについてはこちらWorkbook.SaveAsメソッドについてはこちらをご覧ください

于 2014-10-02T05:46:04.323 に答える