Спасибо, что задали действительно хороший вопрос.
Прежде всего, отказ от ответственности: это не прямое решение, а обходной путь, который мы должны были принять много лет назад.
Точно такая же проблема возникла на моем рабочем месте (буквально заставило нас вырвать свои волосы), и мы также попытались перейти на iNDIRECT
.Но поскольку формулы в рабочих листах являются сложными, мы не смогли заменить их на INDIRECT
.Таким образом, вместо длительной ручной замены сотен формул на рабочем листе, мы использовали для вставки временного листа и изменения ссылки на формулы на этот лист.После импорта нового листа и переименования его в название старого листа формулы были возвращены к исходному.Я попытался воспроизвести используемый код (поскольку у меня нет доступа к тем же файлам сейчас).Мы использовали только Sub ChangeFormulas
, здесь я использовал то же самое в соответствии с вашим кодом.
Option Explicit
Sub TestSheet2Delete()
Dim Wb As Workbook
Dim Ws As Worksheet, Ws1 As Worksheet, Ws2 As Worksheet
Dim Xstr As String, Ystr As String
Set Wb = ThisWorkbook
Set Ws = Wb.Sheets("Sheet1")
Xstr = "Sheet2"
Ystr = "TempSheetX"
Set Ws1 = Wb.Sheets(Xstr)
Set Ws2 = Worksheets.Add(After:=Ws)
Ws2.Name = Ystr
DoEvents
ChangeFormulas Ws, Xstr, Ystr
Application.DisplayAlerts = False
Ws1.Delete
' Now again add another sheet with Old name and change formulas back to Original
Set Ws1 = Worksheets.Add(After:=Ws)
Ws1.Name = Xstr
DoEvents
ChangeFormulas Ws, Ystr, Xstr
Ws2.Delete
Application.DisplayAlerts = True
End Sub
Sub ChangeFormulas(Ws As Worksheet, Xstr As String, Ystr As String)
Dim Rng As Range, C As Range, FirstAddress As String
Set Rng = Ws.UsedRange
With Rng
Set C = .Find(What:=Xstr, LookIn:=xlFormulas)
If Not C Is Nothing Then
FirstAddress = C.Address
Do
C.Formula = Replace(C.Formula, Xstr, Ystr)
Set C = .FindNext(C)
If C Is Nothing Then Exit Do
If C.Address = FirstAddress Then Exit Do
Loop
End If
End With
End Sub
Еще один самый простой обходной путь - вообще не удалять лист, импортировать CSV и полностью копироватьлист на рассматриваемый лист. Однако это полностью зависит от фактических условий работы с CSV и всеми.