Page 1 of 1

code สำหรับ Data validation แบบ multi ติดปัญหาครับ

Posted: Sat Feb 18, 2012 9:17 am
by godman
อาจารย์ครับ ผมมีโค้ดนี้อยู่ใน sheet ที่ชื่อว่า DataEntry อยู่แล้ว แต่ผมต้องการให้เซลล์ G10 เป็น Data Validation แบบ multi เผื่อผู้ใช้งานลืมว่าจะเลือกอะไร มีข้อมูล 2 คอลัมพ์ให้เขาดู ปกติ data validation มีแค่ ตัวเลือกคอลัมพ์เดียว ผมทราบว่ามันต้องใช้ macro เขียนลงไป และผมก็ไปได้ตัวอย่าง code มา ปรากฏว่าผมเขียน Priwate Sub Worksheet_Change มันใช้ืชื่อ Private Sub เหมือนกัน ผมเลยอยากทราบว่า ผมจะใช้ Private sub ชื่อเดียวกันทั้งสองอันใน sheet data entry ได้ไหม ผมรู้สึกว่ามันไม่ทำงาน ผมเลยแนบไฟล์มาให้ดูด้วย ผมต้องการ macro ที่ทำให้ data valid มันทำงานได้โดยมี 2 คอลัมพ์ในบรรทัดเดียวให้เลือก ผมแนบไฟล์มา 2 ไฟล ครับ ขออาจารย์ด้วยดู code ในไฟล์ที่สองให้ผมด้วย ผมอยากเอา code นั้นมาใส่ใน ไฟล์ที่หนึ่ง ใน shet ดังกล่าว 2 code ทำไมมันใส่ไม่ได้ครับ

Code: Select all

Option Explicit
' Developed by Contextures Inc.
' www.contextures.com
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim historyWks As Worksheet
    Dim inputWks As Worksheet
    Dim rngA As Range

    Dim lRec As Long
    Dim lRecRow As Long
    Dim lLastRec As Long
    Dim lastRow As Long

    Set rngA = ActiveCell

    If Target.Address = Me.Range("CurrRec").Address _
        Or Target.Address = Me.Range("EnSel").Address Then
      Application.EnableEvents = False
      
      If Target.Address = Me.Range("EnSel").Address Then
        Me.Range("CurrRec").Value = Me.Range("SelRec").Value
      End If

      Set inputWks = Worksheets("DataEntry")
      Set historyWks = Worksheets("TNrecordData")
  
      With historyWks
          lastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1
          lLastRec = lastRow - 1
      End With
  
      With inputWks
          lRec = .Range("CurrRec").Value
          If lRec > 0 And lRec <= lLastRec Then
                lRecRow = lRec + 1
                historyWks.Range(historyWks.Cells(lRecRow, 3), historyWks.Cells(lRecRow, 16)).Copy
                .Range("G9").PasteSpecial Paste:=xlPasteValues, Transpose:=True
                rngA.Select
        End If
      End With
      Application.EnableEvents = True
    End If

End Sub




Re: code สำหรับ Data validation แบบ multi ติดปัญหาครับ

Posted: Sat Feb 18, 2012 9:25 am
by godman
นี่คือ code ทีสองที่ผมจะนำไปใส่ใน file แรกที่ส่งให้อาจารย์ไป แต่ใส่แล้วมันไม่ทำงานครับ โค้ดนี้ผมเอาจากไฟล์ที่แนบมาใน sheet data entry

Code: Select all

Option Explicit
' Developed by Contextures Inc.
' www.contextures.com
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo errHandler
If Target.Cells.Count > 1 Then GoTo exitHandler
If Target.Column = 2 Then
  If Target.Value = "" Then GoTo exitHandler
  Application.EnableEvents = False
  Target.Value = Worksheets("Codes").Range("C1") _
    .Offset(Application.WorksheetFunction _
    .Match(Target.Value, Worksheets("Codes").Range("ProdList"), 0), 0)
End If

exitHandler:
  Application.EnableEvents = True
  Exit Sub

errHandler:
  If Err.Number = 13 Or Err.Number = 1004 Then
    GoTo exitHandler
  Else
    Resume Next
  End If

End Sub

Sub MyFix()
Application.EnableEvents = True

End Sub

Re: code สำหรับ Data validation แบบ multi ติดปัญหาครับ

Posted: Sat Feb 18, 2012 9:37 am
by snasui
:D
godman wrote:เป็น Data Validation แบบ multi
ช่วยขยายความประโยคนี้ว่าต้องการเป็นอย่างไรครับ ปกติ Validation มันจะ Multiple อยู่แล้ว คือสามารถเลือกได้หลายค่า
godman wrote:ผมเลยอยากทราบว่า ผมจะใช้ Private sub ชื่อเดียวกันทั้งสองอันใน sheet data entry ได้ไหม
คำตอบคือ ไม่ได้ครับ กรณีต้องการเขียนหลาย Code จาก Worksheet_Change Event ให้เขียน Code ที่ Module ปกติแล้วค่อยเรียกใช้จาก Worksheet_Change Event หรือจะเลือกเขียน Code ต่อกันไปด้านล่างเรื่อย ๆ ก็เป็นอีกทางเลือก แต่ไม่เหมาะนัก หากเป็น Code ที่ทำหลายงานจะยุ่งยากในการตรวจทาน แก้ไข ปรับปรุง เปลี่ยนแปลง เพราะ Code ชุดหนึ่ง ๆ ควรทำงานใดงานหนึ่ง เพื่อให้ง่ายต่อการปรับปรุงเปลี่ยนแปลงครับ

การเรียกใช้จาก Worksheet_Change ยกตัวอย่างเช่น ตามด้านล่างครับ

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
    Call Macro1
    Call Macro2
    Call Macro3
    '....
End Sub

Re: code สำหรับ Data validation แบบ multi ติดปัญหาครับ

Posted: Sat Feb 18, 2012 11:42 am
by godman
Datavalidation แบบ multi หมายความว่า มันมี 2 ช่องใ้ห้เลือก เพื่อเป็นข้อมูลประกอบ แต่เวลากดเลือก มันก็ไปลงในเซลล์แค่อันเดียว เช่น ผมใส่รหัสวิชา A001 คือ วิชาภาษาไทย A002 คือวิชาภาษาอังกฤษ ผมก็ใส่แบบมัลติ ก็จะแสดง A001 ภาษาไทย ผมก็เลือก แต่มันไปแสดงค่าเพียง A001 เป็นประโยชน์ที่ผู้ใช้อาจจำไม่ได้ว่า รหัสนี้คืออะไร ครับ ผมแนบตัวอย่างมาให้อาจารย์ด้วยครับ

Re: code สำหรับ Data validation แบบ multi ติดปัญหาครับ

Posted: Sat Feb 18, 2012 12:03 pm
by snasui
:D รับทราบครับ เป็นการแสดง Validation ให้ผู้ใช้เห็นจาก Range name ที่เป็นการ Join ข้อมูลจากหลาย Column พอเลือกแล้วจะใช้ VBA ดึงค่าที่ตรงกันจากคอลัมน์ที่เป็น Course ID มาแสดง