#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 находился в режиме автосохранения. Когда я отключил автосохранение, оно работало так, как должно.