hungdiep85
Thành viên thường trực




			
		- Tham gia
- 1/6/09
- Bài viết
- 218
- Được thích
- 23
- Giới tính
- Nam





Sub ToMau()
Dim Cll As Range, Val As String, Pos1 As Long, Pos2 As Long
For Each Cll In Selection
    Val = Cll.Value
    Pos1 = InStr(Val, "(")
    Do While Pos1 > 0
        Pos2 = InStr(Pos1, Val, ")")
        If Pos2 = 0 Then Exit Do
        Cll.Characters(Pos1 + 1, Pos2 - Pos1 - 1).Font.Color = vbRed
        Pos1 = InStr(Pos2, Val, "(")
    Loop
Next
End SubNhìn code của Bác xong quay qua nhìn cái code của em. thấy code em củ chuối quáChọn vùng muốn áp dụng và chạy code.
Mã:Sub ToMau() Dim Cll As Range, Val As String, Pos1 As Long, Pos2 As Long For Each Cll In Selection Val = Cll.Value Pos1 = InStr(Val, "(") Do While Pos1 > 0 Pos2 = InStr(Pos1, Val, ")") If Pos2 = 0 Then Exit Do Cll.Characters(Pos1 + 1, Pos2 - Pos1 - 1).Font.Color = vbRed Pos1 = InStr(Pos2, Val, "(") Loop Next End Sub



Ai cũng có thuở ban đầu thôiNhìn code của Bác xong quay qua nhìn cái code của em. thấy code em củ chuối quá




Bác có thể giúp em cái pattern được không? em xài cái này "(?<=\()(.*?)(?=\))" mà sao không lúc .execute(..) thì nó bị lỗiAi cũng có thuở ban đầu thôi
Trong mỗi ngôn ngữ hơi khác nhau.Bác có thể giúp em cái pattern được không? em xài cái này "(?<=\()(.*?)(?=\))" mà sao không lúc .execute(..) thì nó bị lỗi



Cảm ơn bác đã phản hồi!Trong mỗi ngôn ngữ hơi khác nhau.
Cái "VBScript.RegExp" mà bạn sử dụng chỉ phục vụ:
1. (?: pattern) - không có dấu cách trước p
2. Zero-width positive lookahead assertion: (?=pattern)
3. Zero-width negative lookahead assertion: (?!pattern)
Cái "VBScript.RegExp" mà bạn sử dụng KHÔNG phục vụ Positive and Negative Lookbehind: (?<=pattern) và (?<!pattern)
Bạn đang dùng dạng (?<=pattern) <- (?<=\()
Tôi cũng thấy buồn là không được dùng (?<=pattern) và (?<!pattern)
Thì dùng như HeSanbi giới thiệu thôi chứ xoay xở làm gì nữa? Tức "\((.*?)\)"Cảm ơn bác đã phản hồi!
Em thấy regexp rất thú ví, nhưng "khó" quá
Đối với bài trên, bác có pattern nào xử lý được vấn đề này không chia sẻ cho em học hỏi với ạ
Sub ToMau(ByVal vung As Range, Optional ByVal mau As Long = 255)
'    Vung: 1 hoặc nhiều cell
'    macro To Mau cac doan trong ngoac. Vd. o co gia tri "Ngay mai (em di). Bien nho (ten em) goi ve" thì 2 doan "Em di" va "ten em" se duoc to mau
Dim s As String, cell_ As Range, match As Object, re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .Pattern = "\((.*?)\)"
    End With
    For Each cell_ In vung
        s = cell_.Value
        For Each match In re.Execute(s)
            cell_.Characters(match.FirstIndex + 2, match.Length - 2).Font.Color = mau
        Next match
    Next cell_
    Set re = Nothing
End Sub
Sub test()
    ToMau ThisWorkbook.Worksheets("Sheet1").Range("A1:A2"), RGB(0, 0, 255)
End Sub