Excelのセル値が変わるたびにCSVファイルを更新する方法


0

1分に数回ファイルを更新するアプリケーションにリンクされているExcelファイルがあります。特定のセル(B22)の内容が変わるたびに、Excelの内容(5行×22行)をCSVファイルに保存します。更新するたびに既存のCSVファイルが上書きされるため、CSVは常にExcelファイルの最新の内容を表します。 私はVBAの初心者なので、これを行うためのマクロの書き方に関するガイダンスは大歓迎です。 ありがとう

回答:


1

幸いなことに、CSVとしてエクスポートしたいコードはに文書化されています。 この答え

あなたがする必要があるのは、ワークシートが変わるたびに変わる関数からそれを呼び出すことです(それはまさしくそのように呼ばれます) Worksheet_Change そして、B22であることを確認します。

両方をまとめると、次のようなコードになります。

' Worksheet_Change
' Called whenever a change is made to a cell in a worksheet

Private Sub Worksheet_Change(ByVal Target As Range)

    ' Check if cell B22 has been changed 
    If Not Application.Intersect(Range("B22"), Range(Target.Address)) Is Nothing Then
        ' It has changed
        Call ExportWorksheetAndSaveAsCSV
    End If

End Sub

' ExportWorksheetAndSaveAsCSV
' Saves the contents of Sheet1 to a CSV file in c:\tmp\test.csv
' If the file already exists, it will be silently overwritten

Public Sub ExportWorksheetAndSaveAsCSV()

    Dim wbkExport As Workbook
    Dim shtToExport As Worksheet

    Set shtToExport = ThisWorkbook.Worksheets("Sheet1")     'Sheet to export as CSV
    Set wbkExport = Application.Workbooks.Add
    shtToExport.Copy Before:=wbkExport.Worksheets(wbkExport.Worksheets.Count)
    Application.DisplayAlerts = False                       'Possibly overwrite without asking
    wbkExport.SaveAs Filename:="C:\tmp\test.csv", FileFormat:=xlCSV
    Application.DisplayAlerts = True
    wbkExport.Close SaveChanges:=False

End Sub

そのシート名( Sheet1 )とファイル名( C:\tmp\test.csv )はハードコードされています。私がこれを書いたならば、私はおそらく変数としてこれらの両方を渡します ExportWorksheetAndSaveAsCSV


詳細な回答をありがとう、Richard。これについてちょっとしたテストをしました。 VBAコードをExcelファイルに追加し、それをマクロ対応のExcelファイルとして保存しました。 Altキーを押しながらF8キーを押してマクロを実行すると、CSVに更新が書き込まれますが、セルB 22に変更があると、マクロを再度実行するまでCSVは更新されません。マクロが有効なExcelファイルが開かれて更新されている限り、バックグラウンドで永続的に実行されていると思いました。 CSVの自動更新を実現するために他に何かする必要がありますか?
DWT818

私はそれをうまく働かせた。唯一の問題は、CSVが別のプログラムによって開かれている場合、Excelシート上に実行時エラー1004が発生し、開いているブックと同じ名前でブックを保存できないことが示されることです。更新を中断することなく他のプログラムでCSVを読むことができるように、それを回避する方法はありますか?
DWT818

@ DWT818かなり残忍なアプローチですが、入れてみてください On Error Resume Next 前の行に wbkExport.SaveAs そして On Error Goto 0 後の行に wbkExport.Close。ファイルを保存しようとしてエラーが発生した場合は、無視します。それが起こるならば、あなたがあなたの変更その時の時間があなたが次にセルB22を編集する時まで保存されないことを心に留めておいてください。
Richard

リチャード、提案をありがとう。それは確かにエラーメッセージを抑制しましたが、セルB22の更新を無視するようにも見えました。しかし、FileCopyを追加して別の名前で別のCSVを生成することで解決策を見つけることができ、私のプログラムはExcelの更新を中断することなくそのファイルにアクセスできます。ご協力ありがとうございます。
DWT818

追加の質問として、セルB22がユーザーによってではなく式によって変更された場合、CSVファイルを生成するために上記の例のPrivate Subを変更する必要があります。 Worksheet_Changeの代わりにWorksheet_Calculateを使用する必要があることを私は理解していますが、そうすると、Public SubはCSVを上書きするのではなく複数のコピーCSVブックを生成します。
DWT818
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.