ขอคำสั่งสร้างสี ในฟอร์ม ตามค่าที่เราตั้งไว้
กระทู้เก่าบอร์ด อ.Yeadram

 6,114   22
URL.หัวข้อ / URL
ขอคำสั่งสร้างสี ในฟอร์ม ตามค่าที่เราตั้งไว้

ยกตัวอย่างข้อมูล
ชื่อ        คะแนน
นาย ก       10
นาย ข      20
นาย ค       60
นาย ง       90

โดยนำมาสร้างฟอร์ม โดยให้ T1 แทนช่อง คะแนน
จะให้ช่องค่าคะแนนในฟอร์ม แสดงสีในกรอบสี่เหลี่ยมของแต่ละคะแนน

ผมเขียนคำสั่ง แล้วมันไม่แสดง ครับ ผมยกตัวอย่างมา 3 สี( ตามจริง จะกำหนด ย่อยกว่านี้ เอา 5 สี ) แต่ในคำสั่งที่เมนู การจัดรูปแบบตามเงื่อนไข ผมทำให้ฟอร์มแสดงสีได้ แต่ มันทำได้แค่ 3 คำสั่งเท่านั้น) เลยอยากได้คำสั่ง VB สั่งมันให้ทำ ครับ
ตัวอย่าง vb ที่ผมทำนะครับ

If [t1].Value < 50 Then
[T1].BackColor = red      
Else If [t1].Value > 50 and < 75 Then
[T1].BackColor = Blue
Else if If [t1].Value >75 Then
[T1].BackColor = Green      

End If


..
ถ้าผมถามไม่ละเอียด ก็บอกมานะครับ จะอธิบายใหม่

ขอบคุณครับ

22 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R14072
สำหรับ Access 2007 ขึ้นไป
ใช้ Conditional Formating ครับ
โดยคลิ๊กขวาที่ control เลยครับ
2 @R14073
1. ฟอร์มเป็น Single Form หรือ Continuous Form
2. โค้ดนี้คุณใส่ไว้ที่ envent ไหน
3 @R14091
เอาไว้ที่ตอนโหลดฟอร์มครับ
Private Sub Form_Load()

ตอนนี้ ใช้ 2003 ครับ ใช้ Conditional Formating ทำได้ ครับ แต่ทำได้ 3 คำสั่ง

พอดี อยากได้ 7 คำสั่ง
เลยจะใช้ VB ส่งครับ


v2007 ยังไม่เคยใช้ครับ
ไม่รู้ว่า 2007 Conditional Formating ได้กี่คำสั่งครับ
4 @R14092
เป็น Continuous Form ครับ แต่ลองกับ Single Form ก็ไม่ได้ผลครับ

แต่ใช้ access 2003 ทำ Conditional Formating ได้ผลครับ แต่ได้ 3 คำสั่งครับ
อยากได้ แปรผลตามตัวเลข สัก 7 สี ครับ เลยคิดว่า Vb น่าจะทำได้ครับ

แต่ทำแล้ว ไม่ได้ผลครับ .... ลองเดาๆ ทำนะครับ...
5 @R14094
Conditional Formatting รองรับได้แค่ 3 เงื่อนไขครับ ดังนั้นจะทำ 7 สีไม่ได้

ในเมื่อไม่สามารถใช้ Conditional Formatting ได้ ก็ต้องหันไปทำอย่างโค้ดที่ให้มา แต่โค้ดนี้ถ้าทำกับ Continous Form ก็จะมีผลกับทุกๆบรรทัด ไม่ใช่มีผลต่อบรรทัดตามค่า t1 อย่างที่ตั้งใจไว้ ดังนั้นก็จะทำเป็น Continuous Form ไม่ได้ ต้องทำเป็น Single Form อีกอย่าง โค้ดนี้ต้องใส่ไว้ที่ Form_Current event procedure ไม่ใช่ใส่ไว้ที่ Form_Load นะครับ

ถ้าอยากทำ Continuous Form อาจจะต้องพลิกแพลงหน่อย เช่น อาจต้องทำ 2 TextBox ว่างๆเพื่อแสดงสีที่แตกต่างกันเอาไว้เฉพาะต่างหาก เช่น t1=20 อาจแสดงสีขาวที่ช่องแรก สีฟ้าที่ช่องที่สอง พอเป็น 60 ก็แสดงสีขาวกับเขียวทำนองนี้ครับ

มันเป็นข้อจำกัดที่ผมก็ปวดหัวเมื่อต้องการทำเช่นกัน
6 @R14095
Conditional Formatting ใน 2007 ขึ้นไป มันไม่จำกัดครับ แต่ไฟล์คุณต้องเปลี่ยนเป็น accdb



แต่สังเกตุดูนะครับ ยิ่งทำมากยิ่งช้านะครับ
7 @R14098
ก่อนหน้านี้ผมยังจำได้ลางๆว่า Access 2007 ยังให้ Conditional Formatting แค่ 3 เงื่อนไข พอคุณ TTT บอกอย่างนี้ก็เลยไปค้นดูว่าจริงๆแล้วมันเป็นเท่าไหร่กันแน่ ก็พบว่าเมื่อเป็น Access 2010 แล้ว เงื่อนไขรองรับได้ถึง 50 เงื่อนไขครับ ถือว่าเยอะมากๆแล้ว เยี่ยมเลย
8 @R14102
มีcodde vb ให้ดูไหมครับ
เพราะ ผมลองแล้วไม่ผ่านครับ

Private Sub Form_Current()

If [t1].Value < 50 Then
[T1].BackColor = red       
Else If [t1].Value > 50 and < 75 Then
[T1].BackColor = Blue
Else if If [t1].Value >75 Then
[T1].BackColor = Green       

End If
หรือลองใช้ค่าตัวเลข แทน สี แล้ว ก็ไม่ผ่านครับ

สงสัย ต้องไปใช้ 2010 แล้วละมั้งครับ ( ผมถนัด 2003มากกว่านะครับ)

ถ้าจะลงเฉพาะ access2010 ใน winxp ได้ไหมครับ
9 @R14103
ต้องเป็น vbRed, vbBlue, vbGreen ครับ

เขียนโปรแกรมเสร็จแล้ว สั่ง Debug - Compile ด้วยนะครับ จะได้รู้ว่าตรงไหน syntax error บ้าง
10 @R14104
อีกอย่าง ต้อง

If ... then
....
....
elseif ... then
....
....
elseif ... then
....
....
end if

11 @R14107
@ อ.สันติสุข ขอบคุณสำหรับข้อมูลครับ
@ ประสงค์ ผมมีตัวอย่างสำหรับรูปแบบหากจะสั่งเป็น Conditional Formatting ลองปรับใช้ดู ข้อดีคือ เราไม่ต้องใช้ทันทีเมื่อเปิดฟอร์ม ยกเลิกการใช้งานได้

    Dim objFrc As FormatCondition
    Dim lngRed As Long
    Dim lngWhite As Long
    Dim lngBlack As Long
    Dim lngYellow As Long
    
    lngRed = RGB(255, 0, 0)
    lngWhite = RGB(255, 255, 255)
    lngBlack = RGB(0, 0, 0)
    lngYellow = RGB(255, 255, 0)

    'กำหนดเงื่อนไขแบบ Field Value Is คือ เงื่อนไข Text1 < 5, Text1 = 5, Text1 > 5
    Set objFrc = Me![Text1].FormatConditions.Add(acFieldValue, acLessThan, 5) ' เงื่อนไขที่ (0)
    Set objFrc = Me![Text1].FormatConditions.Add(acFieldValue, acEqual, 5) ' เงื่อนไขที่ (1)
    Set objFrc = Me![Text1].FormatConditions.Add(acFieldValue, acGreaterThan, 5) ' เงื่อนไขที่ (2)

            With Me![Text1].FormatConditions(0)
               .BackColor = lngYellow
               .FontBold = True
               .ForeColor = lngBlack
            End With

            With Me![Text1].FormatConditions(1)
               .BackColor = lngWhite
               .FontBold = True
               .ForeColor = lngBlack
            End With

            With Me![Text1].FormatConditions(2)
               .BackColor = lngBlack
               .FontBold = True
               .ForeColor = lngRed
            End With
    Set objFrc = Nothing


สำหรับการยกเลิก
    Me![Text1].FormatConditions.Delete

ประมาณนี้ครับ
หากเป็น 2010 FormatConditions(1,2,3........) สามารถเขียนเงื่อนไขได้เรื่อยๆ
12 @R14111
ขอบคุณอาจารย์นะครับ ( น่าจะเกือบได้แล้วครับ)
ทำสามค่าที่อาจารย์ ให้มา ได้ผล นะครับ
แต่มาปรับทำ อีก เป็น 5 ค่า แล้วมันไม่ได้ครับ ผมมั่วๆ ทำ ลองผิดลองถูกนะครับ แต่ไม่ได้ สักที....
ช่วยดูcode ให้หน่อยนะครับ

ผมไม่รูจะเอา คำสั่งไปวางที่ไหน ก็เลย เอามาวางที่

Private Sub Form_Current()

Dim objFrc As FormatCondition
    Dim lngRed As Long
    Dim lngWhite As Long
    Dim lngBlack As Long
    Dim lngYellow As Long
    Dim lngGreen1 As Long
    Dim lngGreen2 As Long
Dim lngRed1 As Long
     
     
        lngRed = RGB(255, 0, 0)
        lngWhite = RGB(255, 255, 255)
       lngBlack = RGB(0, 0, 0)
       lngYellow = RGB(255, 255, 0)
       IngGreen1 = RGB(0, 255, 255) ' ค่าสี ผม ลองใส่ มั่วๆ ก่อน ครับ ถ้าได้ ค่อยมาดูสีใหม่
       IngGreen2 = RGB(0, 0, 255)
       IngRed1 = RGB(0, 0, 255)
       
    ' IngGreen2 = 65408   ' ลองใส่แบบนี้ แล้วมันไม่ได้ผล ก็เลย เดามั่ว ใส่สี เหมือนข้างบน
     ' IngRed1 = 33023
     'IngGreen1 = 32768


    'กำหนดเงื่อนไขแบบ Field Value Is คือ เงื่อนไข 5 ค่า ดู ครับ < 120, 120-139 , 140-159 , 160-179 ,>180
       
    Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acLessThan, 120) ' à§×è͹䢷Õè (0) green1
    Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acBetween, 120, 139) ' à§×è͹䢷Õè (1) green2
    Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acBetween, 140, 159) ' à§×è͹䢷Õè (2) Yellow
   Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acBetween, 160, 179) ' à§×è͹䢷Õè (3) red1
    Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acGreaterThan, 180) ' à§×è͹䢷Õè (4) red2

            With Me![m11].FormatConditions(0)
               .BackColor = IngGreen1
                 End With

            With Me![m11].FormatConditions(1)
               .BackColor = IngGreen2
                     End With
                     
        With Me![m11].FormatConditions(2)
               .BackColor = lngYellow
            
            End With
                        With Me![m11].FormatConditions(3)
               .BackColor = lngRed
                    End With
       With Me![m11].FormatConditions(4)
               .BackColor = lngRed1
                    End With
                    
    Set objFrc = Nothing

end sub


ที่จริง ถ้าไปทำกับ 2010 ก้อน่าจะง่ายกว่า( มากด้วย)นะครับ (ผมทำเป็นโปรแกรม ค่าความดันโลหิต นะครับ ที่ไม่ได้ใช้ 2010 เพราะ ต้องทำโปรแกรมแจกหลายที่ แต่ละที่ ยังใช้ 2003 ก็เลยคิดว่าลองใช้ 2003 ดูก่อนครับ )
13 @R14117

พอรัน แล้ว มันฟ้องที่นี้ ก่อนครับ
เป็นแถบเหลือง
Set objFrc = Me![m11].FormatConditions.Add(acFieldValue, acLessThan, 120) ' à§×è͹䢷Õè (0) green1
14 @R14119
- ถ้าเป็น 2003 ใช้ได้ 3 เงื่อนไขนะครับ โค๊ดนี้ก็เหมือนกับการทำ Conditions Formatting ธรรมดาจากเมนูนั่นแหละครับ เพียงแต่เป็น VBA ฉนั้นหากต้องการแบบมากกว่า 3 เงื่อนไขก็ต้องใช้เวอร์ชั่น 2010 ขึ้นไปนะครับ
- ใส่ในเหตุการณ์ Current บนฟอร์มไม่ได้นะครับ เพราะมันเรียกใช้ครั้งเดียวก็พอ ควรใส่ในเหตุการ์ On Open หรือปุ่ม On Click อะไรก็ได้ตามต้องการที่เรียกใช้เพียงครั้งเดียวก็พอครับ
15 @R14122
เข้าใจแล้ว ว่า ทำไมมีกล่อง ฟ้องว่า   คุณตั้งเงื่อนไขมากไป

...นึกว่า เขียน vb ผิด



16 @R14124
ตัวอย่างเพิ่มเติมนิดนะครับ พอดีเห็น Code คุณอาจต้องใช้
รูปแบบประมาณนี้
Between:
Set objFrc = Me.Text1.FormatConditions.Add(acFieldValue, acBetween, 1, 3)

หากเป็น Expression:
Set objFrc = Me![Text1].FormatConditions.Add(acExpression, acEqual, "[Text1] = 'เสาร์'")

หากต้องใช้ AND หรือ OR ด้วย:
Set objFrc = Me![Text2].FormatConditions.Add(acExpression, acEqual, "[Text2] <> 'เสาร์' AND [Text2] <> 'อาทิตย์'")

หากต้องใช้ฟังก์ชั่นประเภท Format ช่วย รูปแบบ:
Set objFrc = Me![Text2].FormatConditions.Add(acExpression, acEqual, "Format(" & "[Text2]" & ", 'dddd') <> 'เสาร์' and Format(" & "[Text2]" & ", 'dddd') <> 'อาทิตย์'")

สำคัญที่ยกตัวอย่างให้ดู คือผมเห็นในหลายเว็บมักมีปัญหากับการใส่ single quote และ double quote ในเงื่อนไขทำให้ผลที่ได้ไม่ตรง (ผมเองก็เป็น) เลยให้ตัวอย่างไว้ครับ

คุณประสงค์ ทำโปรแกรมที่น่าจะมีประโยชน์กับผู้อื่นด้วย ขอให้ทำสำเร็จตามต้องการนะครับ
17 @R14125
ถ้าต้องการทำให้ได้ใน 2003 จริงๆ ก็อาจพอมีแนวคิดแบบที่ อ.สันติสุข บอกแบบง่ายๆ แต่อาจไม่สวยเหมือน Conditions Formatting ตัวอย่างเช่น (ลองทำตามดูนะครับ)

1. ฟอร์มแบบ Continuous สร้าง Text Box เปล่าๆขึ้นมา 5 ตัว ตั้งชื่อเรียงดังนี้ Text1, Text2, Text3, Text4, Text5
2. จัดตำแหน่ง,ความยาวกว้าง ของ Text1 บนฟอร์มให้ได้ตามต้องการ อีกสี่ตัวไม่ต้องจัด วางไว้ตรงไหนก่อนก็ได้
3. เซ็ทขนาดอักษร, สีอักษร ตัวหนา ของทั้ง 5 Text Box ไม่ให้เหมือนกันตามต้องการ
4. ที่ Text1 > Data > Control Source ใส่คำสั่งตามนี้
=IIf([m11]=120 And [m11]=140 And [m11]=160 And [m11]=180,[m11],Null)
5 ที่ฟอร์ม On Open
Private Sub Form_Open(Cancel As Integer)
For i = 1 To 5
With Me("Text" & i)
.BackStyle = 0
.Locked = False
.TabStop = False
End With
If i <> 1 Then
Me("Text" & i).Move Me.Text1.Left, Me.Text1.Top, Me.Text1.Width, Me.Text1.Height
End If
Next
End Sub


โดย m11 มาจากชื่อฟิลด์จากตัวอย่างของคุณ

18 @R14126
แก้ไข
4. ที่ Text1 > Data > Control Source ใส่คำสั่งตามนี้
=IIf([m11]=120 And [m11]=140 And [m11]=160 And [m11]=180,[m11],Null)
19 @R14127
โพสไม่ติดอะครับ คือใน Control Source แต่ละตัวก็ใส่เงื่อนไขลงไป เช่น
>=120 and Data > Control Source ใส่คำสั่งตามนี้
ที่ Text2
IIf([m11]>=120 And [m11]=140 And [m11]=160 And [m11]=180,[m11],Null)

ลองปรับใช้ดูครับ
20 @R14128
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2513s