ฉันมีปุ่มที่เรียกมาโครแยกกันหลายอัน ทุกอย่างทำงานได้ตามที่คาดหวัง แต่มีข้อยกเว้น 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
การทำเช่นนี้ทำให้ไฟล์สามารถประมวลผลได้ในเวลาเพียงไม่กี่วินาทีและทุกอย่างถูกต้อง