У меня есть кнопка, которая вызывает много отдельных макросов. Все работает как положено, но с 1 исключением.
Мне нужно ввести формулу в строке 2 из четырех отдельных столбцов и перетащить формулы вниз до последней заполненной строки. Чтобы добиться этого "легко", я добавил макрос, который будет выбирать из A1:AK700 (никогда не должно быть больше 500 строк, поэтому я перешел на 700, чтобы быть в безопасности) и создать таблицу. Затем вводятся формулы (я делаю таблицу так, чтобы формулы автоматически переходили к последней заполненной строке). Затем у меня есть макрос, чтобы выбрать тот же диапазон и преобразовать его в диапазон. Наконец, у меня есть макрос, который запускается после всего этого, чтобы скопировать и вставить значения, а затем взять две вкладки и создать новый файл с копиями этих вкладок.
Все работает правильно, но в какой-то момент после преобразования в диапазон (или вокруг этой части процесса) Excel сильно замедляется, на некоторое время перестает отвечать, а затем, наконец, запускается снова. Когда все закончится, я перехожу к исходному файлу и к вновь созданному файлу, и форматирование таблицы применяется ко всему листу (вплоть до ячейки ~ 1 048 000!). Понятно, вот почему так долго и перестает отвечать, верно?
Как я могу остановить это?
Я вставляю код в том порядке, в котором он запускается из точки создания таблицы. У меня нет большого опыта написания макросов (около месяца), поэтому любая помощь будет оценена !! И все это нужно делать с помощью макроса. Они хотят, чтобы все произошло одним нажатием кнопки.
Код:
Sub CreateTable()
Sheet1.ListObjects.Add(xlSrcRange, Range("A1:AK500"), , xlYes).Name = "Table1"
End Sub
Sub FormulaInput()
Sheets("Activity - Hires").Select
Range("AH2").Select
ActiveCell.FormulaR1C1 = _
"=INDEX(NHO_Global!C[-21],MATCH('Activity - Hires'!RC[-24],NHO_Global!C[-33],0))"
End Sub
Sub FormulaInput2()
Sheets("Activity - Hires").Select
Range("AI2").Select
ActiveCell.FormulaR1C1 = _
"=IF(AND(ISERROR(RC[-1]),RC[-15]=""Contingent Worker""),""Contingent Worker"",IF(AND(ISERROR(RC[-1]),ISNUMBER(SEARCH(""(Terminated)"",RC[-33]))),""Terminated"",IF(AND(ISERROR(RC[-1]),RC[-34]=TODAY()),""Hired Today"",IF(ISERROR(RC[-1]),""Under Investigation"",""""))))"
End Sub
Sub FormulaInput3()
Sheets("Activity - Hires").Select
Range("AJ2").Select
ActiveCell.FormulaR1C1 = "=IF(ISERROR(RC[-2]),"""",IF(RC[-2]<0,RC[-17],""""))"
End Sub
Sub FormulaInput4()
Sheets("Activity - Hires").Select
Range("AK2").Select
ActiveCell.FormulaR1C1 = _
"=IF(ISERROR(RC[-3]),"""",IF(RC[-3]<-10,""Obtain Manager Email"",""""))"
End Sub
Sub ConvertToNumber()
'This is so that the formulas work as the numbers in column J are used, but they're stored as text initially
Range("J:J").Select
With Selection
Selection.NumberFormat = "General"
.Value = .Value
End With
End Sub
Sub ConvertToRange()
Sheet1.ListObjects("Table1").Unlist
End Sub
Sub CopyPasteValuesActivity()
Worksheets("Activity - Hires").Select
Worksheets("Activity - Hires").Range("A1:AK700").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Sub CopyPasteValuesNHO()
Worksheets("NHO_Global").Select
Worksheets("NHO_Global").Range("A1:Q700").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Sub SaveSepFile()
Sheets(Array("Activity - Hires", "NHO_Global")).Select
Sheets("Activity - Hires").Activate
Sheets(Array("Activity - Hires", "NHO_Global")).Copy
End Sub
Как указано в комментариях, я решил полностью удалить процессы создания и удаления таблиц. Я понял, как вводить формулы, и перетащил вниз до последней заполненной строки, поэтому я просто сделал это. Этот код ниже (только для одной из формул):
Sub FormulaInput12()
Dim rng As Range
Dim sht As Worksheet
Dim LastRow As Long
Set sht = ThisWorkbook.Sheets("Activity - Hires")
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
Set rng = Range("AH2:AH" & LastRow)
rng.Formula = "=INDEX(NHO_Global!C[-21],MATCH('Activity - Hires'!RC[-24],NHO_Global!C[-33],0))"
End Sub
Это позволяет файлу обрабатываться всего за несколько секунд, и все правильно.