Как определить, что ячейка Excel была изменена по формуле, и записать данные в файл CSV

У меня есть файл Excel, который обновляется приложением каждые несколько секунд. Используя данные, предоставленные приложением, несколько ячеек на листе (называемых «TSdata») вычисляются с использованием различных формул. Если значение конкретной ячейки (B41) изменяется, макрос должен записать содержимое рабочего листа в файл CSV. С помощью одного из парней на superuser.com я создал версию на основе Worksheet_Change, которая отлично работала, если содержимое ячейки обновлялось вручную. Я создал версию с помощью Worksheet_Calculate, которая, как я ожидал, будет работать так же, когда значение ячейки было изменено формулой. Это код, который я использовал:

Private Sub Worksheet_Calculate()
If Worksheets(“TSdata”).Range(“B41”).Value<>prevval Then
    Call ExportWorksheetAndSaveAsCSV
End If
prevval = Worksheets(“TSdata”).Range(“B41”).Value
End Sub


Public Sub ExportWorksheetAndSaveAsCSV()
Dim wbkExport As Workbook
Dim shtToExport As Worksheet
Set shtToExport = ThisWorkbook.Worksheets("TSdata")     '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:\TSCSV\TSCSV1.csv", FileFormat:=xlCSV
     Application.DisplayAlerts = True
wbkExport.Close SaveChanges:=False
FileCopy "C:\TSCSV\TSCSV1.csv", "C:\ChartInfo\Data\TSCSV2.csv"
End Sub

Из более раннего теста с использованием ручного обновления я знаю, что Public Sub работает нормально (он скопирован из другого запроса, касающегося записи файлов CSV), но когда я запускаю макрос, кажется, что он пытается выполнить несколько обновлений (экран мигает несколько раз), а затем происходит сбой. Эксель. Итак, очевидно, что-то в Private Sub неверно, но я основывал его на других ответах на похожие вопросы, поэтому я не могу понять, что не так/отсутствует. Примечание: FileCopy в конце Public Sub предназначен для того, чтобы другая программа могла работать с CSV, не нарушая обновления Excel. Заранее благодарю за любую помощь.


person DWT818    schedule 26.03.2018    source источник
comment
ваши цитаты действительно похожи на “”? Если да, измените их на "   -  person Scott Craner    schedule 26.03.2018
comment
Нет, цитаты. Я использовал Word, когда писал исходный текст. Приносим извинения за путаницу.   -  person DWT818    schedule 27.03.2018


Ответы (1)


При копировании листа в никуда создается новая книга с одним листом, который является копией оригинала.

Public Sub ExportWorksheetAndSaveAsCSV()
    Dim fn1 As String, fn2 As String

    fn1 = "C:\TSCSV\TSCSV1.csv"
    fn2 = "C:\ChartInfo\Data\TSCSV2.csv"

    'copying a ws to no location creates a new workbook with a single worksheet
    ThisWorkbook.Worksheets("TSdata").Copy     'Sheet to export as CSV

    Application.DisplayAlerts = False          'Possibly overwrite without asking
    With ActiveWorkbook
        .SaveAs Filename:=fn1, FileFormat:=xlCSV
        .Close SaveChanges:=False
    End With
    Application.DisplayAlerts = True

    On Error Resume Next
    If CBool(Len(Dir(fn2))) Then Kill fn2
    FileCopy fn1, fn2
    On Error GoTo 0
End Sub
person Community    schedule 26.03.2018
comment
Спасибо за ваш ответ, но это имеет тот же эффект, что и раньше - он генерирует несколько новых проектов VBAProjects, как только попадает в строку ThisWorkbook.Worksheets(TSdata).Copy В конце концов Excel перестает работать. Возможно, это связано с тем, что другая программа одновременно обновляет рабочий лист, предоставляя данные, которые генерируют вычисляемое значение в ячейке, отслеживаемой на предмет изменений? - person DWT818; 27.03.2018