Как мне добиться, чтобы мой код сохранялся последовательно?

#excel #vba

#excel #vba

Вопрос:

У меня есть главная рабочая книга, которая позволяет пользователям выбирать определенные регионы, а затем запускать макрос для сохранения рабочей книги с новым именем. Но перед выполнением кода мой код написан так, чтобы удалить выбранные элементы и сохранить образец, затем вставить их выбранные элементы в образец и повторно сохранить с другим именем книги. В конце кода исходный образец снова открывается и должен отображаться как пустой образец . . но иногда он сохраняет пустые данные правильно, а в других случаях он сохраняет образец с выбором пользователя.

Основная рабочая книга огромна, и обновление данных занимает несколько секунд всякий раз, когда делается выбор или данные очищаются. Может ли это быть причиной проблемы? Вот часть моего кода. Я добавил вызовы для обновления макросов на случай, если пользователь использует свои настройки для вычисления вручную.

 Option Explicit


Sub SavetoNewWorkbook()
    With Application
        .StatusBar = "Processing...."
        .ScreenUpdating = False
    End With
    
'   copying company and division
    Dim Customer As String
    Customer = Budget.Range("A2")

'   clearing contents and saving master as blank
    Range("A2:A3").ClearContents
    Call Refresh
'    MsgBox Customer
    
    ThisWorkbook.Save
    
'   Pasting selected values back in to A2
    ActiveSheet.Range("A2").Value = Customer
    Application.DisplayAlerts = False
    Call Refresh
      
'   Saving new workbook with standard file name
    Dim Master As String
    Dim Path1 As String
    Dim PathMaster As String
    Dim MasterNew As String
    Master = ThisWorkbook.Name
    Path1 = ThisWorkbook.Path
    PathMaster = Path1 amp; "" amp; Master
    MasterNew = Budget.Range("A2") amp; "_Div Code-" amp; Left(Budget.Range("C2"), 2) amp; "-" amp; Right(Budget.Range("C2"), 3) amp; "_Budget_" amp; VBA.Format(VBA.Date, "MM-DD-YYYY")
    MsgBox MasterNew
    MsgBox ThisWorkbook.Path amp; "" amp; MasterNew
    ThisWorkbook.SaveAs FileName:=ThisWorkbook.Path amp; "" amp; MasterNew

  

Комментарии:

1. Range("A2:A3").ClearContents — лучше всего указать рабочую книгу, в / на которой находится Range . В противном случае вы неявно отрабатываете ActiveSheet , который может быть, а может и не быть тем, который вам нужен.

2. Спасибо Бен, макрос выполняется с помощью кнопки на рабочем листе, вот почему я не указал рабочий лист. Но я добавлю название рабочего листа, чтобы посмотреть, поможет ли это.

Ответ №1:

Вы позвонили :

 Range("A2:A3").ClearContents
  

При использовании Range всегда обращайтесь к листу, из которого он должен брать диапазон. Если в вашем коде используются разные книги, обратитесь также к книге.

Используйте вместо :

 Dim ws as Workbook
'Define ws with the workbook you want
ws.Sheets("whateveryoursheetnameis").Range("A2:A3").ClearContents
  

Это потому, что Excel не знает, на каком листе он должен использовать ClearContent

Комментарии:

1. Я добавил этот код, и он по-прежнему не очищает данные при сохранении основного файла. Если я пройдусь по коду и дам рабочей книге время обновить все данные, то получу желаемый результат. Это почти так, как если бы код выполнялся быстрее, чем могут обновляться данные, и не дожидался завершения функции обновления перед сохранением.

2. Это странно, VBA — это однопоточный язык, он не должен достигать ThisWorkbook.Save , пока не завершит ClearContents

Ответ №2:

Я думаю, что я разобрался с проблемой. Файл Excel находился в режиме автосохранения. Когда я отключил автосохранение, оно работало так, как должно.