Page 1 of 1

สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 1:28 pm
by yodpao.b

Code: Select all

    ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort. _
        SortFields.Clear
"Return_status" คือชื่อหน้าครับ
ผมอยากเปลี่ยนมาใช้ Sheet3 แทน "Return_status"
สาเหตุเพราะ อาจมีคนเปลี่ยนชื่อหน้า จะได้ไม่ส่งผลกระทบต่อ code ครับ
เขียนอย่างไรดี

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 8:00 pm
by puriwutpokin
ลองปรับเป็น

Code: Select all

Sheet1.Activate.ListObjects("Table9").Sort. _
        SortFields.Clear

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 9:27 pm
by yodpao.b
3.JPG
3.JPG (51.71 KiB) Viewed 104 times
ติดตรง Activate
เปลี่ยนเป็น ActiveWorkbook หรือ Active ก็ยัง eeror ครับ

Code: Select all

    Range("C6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    'ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort.SortFields.Clear
    Sheet3.Activate.ListObjects("Table9").Sort.SortFields.Clear 'แทนบรรทัดบนความหมายเหมือนกัน
    ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort. _
        SortFields.Add Key:=Range("C6"), SortOn:=xlSortOnValues, Order:= _
        xlDescending, DataOption:=xlSortNormal

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 9:31 pm
by snasui
:D ลบ Activate ทิ้งไปครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 11:42 pm
by yodpao.b

Code: Select all

    Range("C6").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
'    ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort.SortFields.Clear
    Sheet3.ListObjects("Table9").Sort.SortFields.Clear  'á·¹ºÃ÷Ѵº¹¤ÇÒÁËÁÒÂàËÁ×͹¡Ñ¹
'    ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort.SortFields.Add Key:=Range("C6"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    Sheet3.ListObjects("Table9").Sort.SortFields.Add Key:=Range("C6"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal   'á·¹ºÃ÷Ѵº¹¤ÇÒÁËÁÒÂàËÁ×͹¡Ñ¹
'    With ActiveWorkbook.Worksheets("Return_status").ListObjects("Table9").Sort
    With Sheet3.ListObjects("Table9").Sort    'á·¹ºÃ÷Ѵº¹¤ÇÒÁËÁÒÂàËÁ×͹¡Ñ¹
        .Header = xlYes
ขอบตุณครับใช้ได้แล้วครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Mon Oct 21, 2019 11:47 pm
by yodpao.b

Code: Select all

Sub ProtectAllsheets0()
    Dim sht As Worksheet
    For Each sht In Worksheets
          Select Case sht.Name
          
                Case "Form_ของบ", "Form_ตัดงบ"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True
                        
                Case "table_ของบ", "table_ตัดงบ", "PV_1", "PV_2", "Chart_1", "cal_1"   ', "FormTable_โอนเงิน", "FormTable_ยืมเงิน", "Formtable_ชดใช้เงินยืม"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
                         
                Case "conclude1", "conclude2", "conclude3", "conclude4", "conclude5", "conclude11", "conclude12", "conclude13", "conclude14"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True
                        
                Case "Return_status"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
                        
        End Select
    Next sht
End Sub
และ code นี้ ครับใช้คำว่า sheet1 แทนได้ไหมครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 6:53 am
by snasui
:D ผมเข้าใจว่าหมายถึงใช้แทนตัวแปร sht ถ้าใช่ คำตอบคือใช้แทนได้ แต่ sheet1 จะต้องมีอยู่จริง เมื่อเราต้องการทำกับชีตเดียวและทราบอยู่แล้วว่าชีตชื่ออะไร เราจะไม่เขียนให้ Loop ครอบ ไม่เขียน Select Case ครอบ เพราะไม่จำเป็นที่จะต้องทำเช่นนั้นครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 6:44 pm
by yodpao.b
มีหลาย sheet ครับ
1.JPG
1.JPG (28.6 KiB) Viewed 88 times

Code: Select all

[code]Sub ProtectAllsheets011()
    Dim sht As Worksheet
    For Each sht In Worksheets
          Select Case sht.Name
          
                Case "sheet1", "sheet2"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True
                        
                Case "sheet3", "sheet4", "sheet5", "sheet6", "sheet7"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
                         
                Case "sheet8", "sheet9", "sheet10", "sheet11", "sheet12"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True
                                                
        End Select
    Next sht
End Sub
[/code]
แก้แล้วครับ
ไม่ error แต่ไม่ทำงานครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 6:44 pm
by yodpao.b
มีหลาย sheet ครับ
1.JPG

Code: Select all

[code]Sub ProtectAllsheets011()
    Dim sht As Worksheet
    For Each sht In Worksheets
          Select Case sht.Name
          
                Case "sheet1", "sheet2"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True
                        
                Case "sheet3", "sheet4", "sheet5", "sheet6", "sheet7"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
                         
                Case "sheet8", "sheet9", "sheet10", "sheet11", "sheet12"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True
                                                
        End Select
    Next sht
End Sub
[/code]
แก้แล้วครับ
ไม่ error แต่ไม่ทำงานครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 7:03 pm
by puriwutpokin
ต้องการ Protect ทุกชีทหรือเปล่าครับ หรือแค่บาง ชีทที่ต้องการ เพราะดูจากชื่อ Sub เหมือนจะต้องการ ทั้งหมด

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 8:08 pm
by snasui
:D จาก Statement Select Case sht.Name คือชื่อแถบชีตที่เราเห็นด้วยสายตาที่ด้านล่างหน้าจอ สามารถคีย์แก้ ปรับเปลี่ยนได้ ที่เขียนมานั้นเป็น Code Name ไม่ใช่ชื่อชีตครับ

ดังนั้น ตาม Code ที่เขียนมาควรจะเป็น Select Case sht.CodeName ครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 9:20 pm
by yodpao.b
แก้แล้วครับ Select Case sht.CodeName
ผลไม่มีอะไรเกิดขึ้น

Code: Select all

[code]Sub ProtectAllsheets011()
    Dim sht As Worksheet
    For Each sht In Worksheets
          'Select Case sht.Name
          Select Case sht.CodeName
          
                Case "sheet1", "sheet2"
                        sht.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                        AllowFormattingRows:=True
                        
        End Select
    Next sht
End Sub
[/code]
ไฟล์แนบตรับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 9:31 pm
by snasui
:D ชื่อ CodeName ของแต่ละชีตขึ้นต้นด้วยตัวใหญ่ เช่น Sheet1, Sheet2 เป็นต้น

Code: Select all

Case "sheet1", "sheet2"
ควรเปลี่ยนเป็น

Code: Select all

Case "Sheet1", "Sheet2"
ครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Tue Oct 22, 2019 9:54 pm
by yodpao.b
ชอบคุณครับ
แย่จริงๆ ปกติผมจะไม่ค่อยพิมพ์จะใช้วิธี copy
พมพ์เองเลยผิดเลย

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Wed Oct 23, 2019 9:55 am
by yodpao.b
ขอถามหน่อยครับ
Dim sht As Worksheet
โตดตัวนี้ไฟล์เก่าๆรู้สึกว่าจะไม่มี (ไม่แนใจครับ)
แต่ที่จำได้น้องที่ทำงานเพื่มขึ้นมาเนีื่องจากมีปัญหาบางอย่างกับบางเครื่อง

โดยปกติไม่มีก็ได้ใช่ไหมครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Wed Oct 23, 2019 10:14 am
by snasui
:D อันนี้ต้องตรวจสอบด้วยตนเองครับ

หลักการของการทำงานกับ Code ที่มีประสิทธิภาพประการหนึ่งที่สำคัญคือเราจะต้องประกาศตัวแปรเสมอ ถ้าไม่ประกาศตัวแปรจะทำให้เปลือง Memory

ผมพบว่าคุณ yodpao.b เขียนคำผิดบ่อยครั้งมากไม่ได้พลาดแค่เฉพาะโพสต์นี้เท่านั้น เช่น คำว่า Code เขียนว่า โค้ด ไม่ใช่ โตด หากยังไม่ตรวจคำผิดด้วยตนเอง ต่อไปนี้ผมจะบายสีคำผิดแล้วให้แก้ไขมาทุกรอบจนกว่าจะแก้ไขถูก จึงจะให้คำตอบนะครับ

Re: สามถาม code ที่ใช้แทนชื่อหน้าครับ

Posted: Wed Oct 23, 2019 11:19 am
by yodpao.b
ขอโทษครับ