Word VBA 2016, ตาราง: ไม่มีการตอบสนองเมื่อตั้งค่าการแรเงาของเซลล์ด้วยการวนซ้ำ

ใน Word 2016 VBA ฉันต้องการตั้งค่าการแรเงาของแต่ละเซลล์ของตารางด้วยการวนซ้ำ ดูเหมือนว่าจะใช้ได้กับตารางที่มีขนาดสูงสุดประมาณ 15*15 ด้วยตารางเช่น 20*20 หรือใหญ่กว่า Word จะไม่ตอบสนองอีกต่อไป ดูเหมือนว่าการทำงานของโปรแกรมจะถูกต้องแม้ว่าจะใช้ขั้นตอนเดียวก็ตาม ฉันลองสิ่งนี้กับตารางประมาณ 50*50. ScreenRefresh และ ScreenUpdating ดูเหมือนจะไม่มีผลใดๆ ในตัวอย่างโค้ด การตั้งค่าการแรเงาของแต่ละเซลล์ให้เป็นสีพื้นหลังเดียวกันนั้นเป็นเพียงการสาธิตเท่านั้น สุดท้ายนี้ฉันต้องการใช้การตั้งค่าที่ซับซ้อนมากขึ้น

Sub TableCells_SetBackgroundColors()
' Set background color for each cell in Word table
' Application does not respond if table is larger than about 20*20
' debug  single step works in any case
'Application.ScreenUpdating = False

Dim i, k, cntCol, cntRow As Integer
cntCol = 15 ' 20 is not ok
cntRow = 15 ' 20 is not ok
If ActiveDocument.Tables.Count <> 0 Then
    ActiveDocument.Tables(1).Delete
End If
ActiveDocument.Tables.Add Range:=Selection.Range, _
                             numRows:=cntRow, _
                             NumColumns:=cntCol

Dim myTable As Word.Table
Set myTable = Selection.Tables(1)
With myTable.Borders
 .InsideLineStyle = wdLineStyleSingle
 .OutsideLineStyle = wdLineStyleSingle
End With
For i = 1 To cntRow Step 1
    For k = 1 To cntCol Step 1
        myTable.Cell(i, k).Shading.BackgroundPatternColor = wdColorRed
        'Application.ScreenRefresh
    Next k
Next i

'Application.ScreenUpdating = True

End Sub

person ht2016    schedule 19.11.2016    source แหล่งที่มา
comment
คุณเพิ่งลองรอเมื่อแอปพลิเคชันไม่ตอบสนองอีกต่อไปหรือไม่? เมื่อการเรียกใช้โค้ดใช้เวลานานกว่านั้นในช่วงเวลาหนึ่ง แอปพลิเคชัน Office ทั้งหมดจะแสดงพฤติกรรมนี้เท่าที่ฉันกังวล แต่โดยปกติแล้ว คุณจะยังสบายดีหากคุณแค่รอ   -  person Xam Eseerts    schedule 19.11.2016


คำตอบ (2)


บทนำ: คนที่แสดงความคิดเห็นที่นี่ ปัญหาของคุณเกิดขึ้นเนื่องจากการรันโค้ดใช้เวลานานโดยที่ตัวแอปพลิเคชันไม่ได้ทำกิจกรรมใด ๆ เท่าที่ฉันรู้ หากใช้เวลานานกว่านั้น แสดงว่าแอปพลิเคชันไม่ตอบสนองอีกต่อไป ตัวอย่างเช่น บนเครื่องของฉัน แอปพลิเคชันไม่ตอบสนองอีกต่อไปแม้จะมีเพียง 15 แถวและคอลัมน์เท่านั้น มีวิธีการหนึ่งที่จะป้องกันไม่ให้สิ่งนี้เกิดขึ้น: DoEvents ด้านล่างนี้คือโค้ดของคุณพร้อมอีก 3 บรรทัดที่ฉันเพิ่มเข้าไปซึ่งใช้งานได้ดีบนเครื่องของฉัน ด้านล่างโค้ดมีคำอธิบายเพิ่มเติมเล็กน้อย

Sub TableCells_SetBackgroundColors()
' Set background color for each cell in Word table
' Application does not respond if table is larger than about 20*20
' debug  single step works in any case
'Application.ScreenUpdating = False

    Dim i, k, cntCol, cntRow As Integer


    cntCol = 21 ' 20 is not ok
    cntRow = 21 ' 20 is not ok
    If ActiveDocument.Tables.Count <> 0 Then
        ActiveDocument.Tables(1).Delete
    End If
    ActiveDocument.Tables.Add Range:=Selection.Range, _
                                 numRows:=cntRow, _
                                 NumColumns:=cntCol

    Dim myTable As Word.Table
    Set myTable = Selection.Tables(1)
    With myTable.Borders
     .InsideLineStyle = wdLineStyleSingle
     .OutsideLineStyle = wdLineStyleSingle
    End With
    For i = 1 To cntRow Step 1

        'New
        Application.StatusBar = "Row " & i & " of " & cntRow
        'New

        For k = 1 To cntCol Step 1
            'New and important
            DoEvents
            'New and important
            myTable.Cell(i, k).Shading.BackgroundPatternColor = wdColorRed
        Next k
    Next i

    'New
    Application.StatusBar = False
    'New

End Sub

คำอธิบายเพิ่มเติม: ด้วยเหตุผลบางประการ Word จึงช้ามากโดยวนซ้ำเซลล์ทั้งหมดของตารางและใช้การแรเงาบางส่วนกับเซลล์เหล่านั้น สิ่งนี้ทำให้เกิดพฤติกรรมที่ฉันอธิบายไว้ข้างต้น เพื่อป้องกันไม่ให้แอปพลิเคชันไม่ตอบสนอง ฉันจึงแทรกบรรทัด DoEvents ลงในลูปคอลัมน์ของคุณ เพื่อให้แอปพลิเคชัน "ตระหนักว่าแอปพลิเคชันยังมีชีวิตอยู่" ในระหว่างการวนซ้ำเซลล์ทุกครั้ง ฉันไม่ได้ทดสอบว่าเมธอด DoEvents มีค่าใช้จ่ายเท่าใดในกรณีนี้ แต่ถ้าคุณพบว่ามีความสำคัญ คุณสามารถลองย้าย DoEvents ไปที่ลูปแถวและ ดูว่าคุณยังสบายดีหรือเปล่า สำหรับอีกสองบรรทัดที่มี StatusBar สิ่งเหล่านี้ไม่จำเป็นในการป้องกันไม่ให้แอปพลิเคชันไม่ตอบสนอง แต่ฉันพบว่ามีประโยชน์มากเนื่องจากจะป้องกันไม่ให้ผู้ใช้/คุณ/ฉันกังวลว่าแอปพลิเคชันขัดข้อง มันจะแจ้งให้คุณทราบในแถบสถานะว่ารหัสปัจจุบันอยู่ในแถวใด

แถบสถานะระหว่างการดำเนินการ:

ป้อนคำอธิบายรูปภาพที่นี่

person Xam Eseerts    schedule 19.11.2016

@Xam Eserts

ขอบคุณสำหรับคำตอบที่ช่วยแก้ปัญหาได้ (ยังคงน่าประหลาดใจที่ Word ทำงานช้าที่นี่ สำหรับงานของฉันในการสร้างตารางสีสันสดใสขนาดใหญ่ ในที่สุดฉันก็เปลี่ยนมาใช้ Excel)

person ht2016    schedule 04.12.2016