VBA - Excel หยุดตอบสนอง - ตารางนำไปใช้กับแผ่นงานทั้งหมดหรือไม่


0

ฉันมีปุ่มที่เรียกมาโครแยกกันหลายอัน ทุกอย่างทำงานได้ตามที่คาดหวัง แต่มีข้อยกเว้น 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

การทำเช่นนี้ทำให้ไฟล์สามารถประมวลผลได้ในเวลาเพียงไม่กี่วินาทีและทุกอย่างถูกต้อง


ทำไมผสม A1 refs กับ R1C1 ภายในโพรซีเดอร์?
Mark Fitzgerald

@ MarkFitzgerald ฉันบันทึกส่วนนั้น นั่นเป็นเพียงวิธีที่มันปรากฏตัวขึ้น (ส่วนใหญ่)
Lenny

1
ฉันตัดสินใจที่จะลบการสร้างตารางและกระบวนการลบออกอย่างสมบูรณ์และแทนที่มาโคร FormulaInput แทนเพื่อลากสูตรลง กระบวนการไฟล์ทั้งหมดในไม่กี่วินาทีในขณะนี้ หากใครสามารถหาสาเหตุที่รหัสต้นฉบับกำลังสร้างตารางขนาดใหญ่เมื่อมีการระบุช่วง แต่ฉันชอบที่จะรู้!
Lenny

@Lenny ลองทำดัชนีปกติกับ Range แทนที่จะเป็น R1 C1 และต้องบอกว่าดีกว่าที่คุณรวม Macros ทั้งหมดเข้าเป็นหนึ่งเดียวเนื่องจากเป็นขั้นตอนง่าย ๆ ในการติดตาม
Rajesh S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.