Page 1 of 1

รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 3:22 pm
by natthaporn
เรียน ทุกท่าน
ดิฉันได้นำ code vba เกี่ยวกับการเปลี่ยน formatting จาก web แห่งหนึ่งมาประยุกต์ใช้เพื่อเปลี่ยนสีตัวอักษร โดยมีเงื่อนไขว่า
ถ้าข้อมูลของ cell ตั้งแต่ B2:B3133 มีคำที่ตรงกันกับ cell A1 ให้เปลียนข้อมูลของ cell ตั้งแต่ B2:B3133 เป็นสีแดง
ถ้าข้อมูลของ cell ตั้งแต่ B2:B3133 มีคำที่ตรงกันกับ cell A2 ให้เปลียนข้อมูลของ cell ตั้งแต่ B2:B3133 เป็นสีเขียว

Code: Select all


Dim strString1, x&
For i = 0 To 3133
strString1 = Range("A1")
With Range("B2").Offset(0, i)
.Font.ColorIndex = 1
For x = 1 To Len(.Text) Step 1
If Mid(.Text, x, Len(strString1)) = strString1 Then .Characters(x, Len(strString1)).Font.ColorIndex = 3
Next x
End With
Next i

Dim strString2, y&
For t = 0 To 3133
strString2 = Range("A2")
With Range("B2").Offset(0, t)
.Font.ColorIndex = 1
For y = 1 To Len(.Text) Step 1
If Mid(.Text, y, Len(strString2)) = strString2 Then .Characters(y, Len(strString2)).Font.ColorIndex = 4
Next y
End With
Next t

ตอนแรกดิฉันลองแยก code ออกเป็น 2 module แล้วลอง run ทีละ module แต่พอ run module ที่1 ก็จะได้เฉพาะสีแดง " Font.ColorIndex = 3" ,run module ที่2 ก็จะได้เฉพาะสีเขียว " Font.ColorIndex = 4" แต่พอเอา code มารวมกันแล้วลอง run ดูก็จะได้ เฉพาะสีเขียวเท่านั้น
ดิฉันลองเอาทั้ง 2 module มารวมกันแล้วใช้สุตร if....then ก็เกิด error (code นี้ทดลองเขียนมา 5 ชั่วโมงแล้วคะ)

ดิฉันจึงขอรบกวนท่านผู้รู้แนะนำด้วยคะ ขอขอบคุณล่วงหน้าคะ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 3:33 pm
by snasui
natthaporn wrote:ถ้าข้อมูลของ cell ตั้งแต่ B2:B3133 มีคำที่ตรงกันกับ cell A1 ให้เปลียนข้อมูลของ cell ตั้งแต่ B2:B3133 เป็นสีแดง
ถ้าข้อมูลของ cell ตั้งแต่ B2:B3133 มีคำที่ตรงกันกับ cell A2 ให้เปลียนข้อมูลของ cell ตั้งแต่ B2:B3133 เป็นสีเขียว
:D ข้อมูลตัวอย่างใน Sheet1 ไม่สอดคล้องกับที่กำลังอธิบาย ช่วยยกตัวอย่างและแสดงคำตอบที่ถูกต้องมาให้ตรงกับคำอธิบายนี้เพื่อจะได้เข้าใจตรงกันครับ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 4:16 pm
by natthaporn
ต้องขอโทษอาจาร์ย์ด้วยคะที่่ยกตัวอย่างผิดไป ดิฉันขออธิบายใหม่ดังนี้คะ

ถ้ามีคำในช่วงข้อมูลตั้งแต่ B2 เป็นต้นไปเหมือนกับคำที่ A1 ให้เปลี่ยนคำนั้นเป็นสีแดง
เช่น ที่ B2 และ C2 มีคำว่า "Excel" ซึ่งตรงกับ A1 ดังนั้นให้คำว่า "Excel" ที่ B2 และ C2 เปลี่ยนเป็นสีแดง

ถ้ามีคำในช่วงข้อมูลตั้งแต่ B2 เป็นต้นไปเหมือนกับคำที่ A2 ให้เปลี่ยนคำนั้นเป็นสีเขียว
เช่น ที่ D2 และ E2 มีคำว่า "VBA" ซึ่งตรงกับ A2 ดังนั้นให้คำว่า "VBA" ที่ D2 และ E2 เปลี่ยนเป็นสีเขียว

ดิฉันได้แนบ file มาใหม่มาด้วยคะ
ขอบคุณคะ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 4:26 pm
by snasui
:D ตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

Sub test()
    Dim rAll As Range, r As Range, i%, j%
    With Sheets(1)
        Set rAll = .Range("b2", .Range("b2").End(xlToRight))
    End With
    For Each r In rAll
        If InStr(r.Value, Range("a1").Value) <> 0 Then
            i = InStr(r.Value, Range("a1").Value)
            j = Len(Range("a1").Value)
            r.Characters(Start:=i, Length:=j).Font.Color = vbRed
        End If
        If InStr(r.Value, Range("a2").Value) <> 0 Then
            i = InStr(r.Value, Range("a2").Value)
            j = Len(Range("a2").Value)
            r.Characters(Start:=i, Length:=j).Font.Color = vbGreen
        End If
    Next r
End Sub

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 4:36 pm
by natthaporn
ได้ผลลัพธ์ตามที่ต้องการแล้วคะ ขอขอบคุณอาจารย์มากคะ ทำให้ดิฉันได้ความรู้เพิ่มเติมอีกว่าจะต้องนำ code 2 ส่วนมาปรับอย่างไรถึงจะใช้ร่วมกันได้
ขอขอบคุณอีกครั้งคะ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 4:54 pm
by natthaporn
อาจารย์คะ ดิฉันขอรบกวนถามเป็นความรู้เพิ่มเติมได้ไหมคะว่า

Code: Select all

Dim rAll As Range, r As Range, i%, j%
ทำไมตรง i%, j% ตรงใส่ % ด้วยคะ สามารถตั้งเป็น i,J เฉย ๆ ได้ไหมคะ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 4:58 pm
by snasui
:D Code นั้นมีค่าเท่ากับ Dim rAll As Range, r As Range, i As Integer, j As Interger

ถ้าไม่ใส่จะเป็นการประกาศตัวแปร i, j เป็น Variant ซึ่งจะกิน Memory มากกว่าเป็น Integer ครับ

Re: รบกวนสอบถาม code vba formatting

Posted: Sun Feb 09, 2014 5:10 pm
by natthaporn
ขอบคุณมาก ๆ คะ สำหรับความรู้เพิ่มเติม ช่วงหลังมานี้ดิฉันมีเวลาเข้ามาศึกษาข้อมูลใน web น้อยมาก หรือแทบจะไม่ได้เข้ามาเลย เพราะบริษัทได้นำ program ใหม่เข้ามา ทำให้ต้องใช้เวลาทั้งหมดไปกับการศึกษา program ใหม่
อย่างไรก็ตามต่อไปนี้ช่วงวันหยุด ดิฉันจะพยายามเข้ามาศึกษาหาความรู้ให้บ่อยมากขึ้น เพราะ web นี้มีแต่ความรู้ที่ดี ๆ ทั้งนั้น

ขอบคุณคะ