Chuyễn chữ thường hoặc hoa thành chữ hoa đầu của mỗi từ (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

minhhangg

Thành viên hoạt động
Tham gia
4/5/11
Bài viết
197
Được thích
61
Nếu nhập dữ liệu vùng B7: B91 là chữ Hoa Hay Chữ Thường thì đều chuyển sang chữ Hoa đầu từ.
VD: tưởng giới thạch hoặc TƯỞNG GIỚI THẠCH khi nhập dữ liệu xong Enter thì thành --> Tưởng Giới Thạch.
Em Cảm ơn nhiều ạ.
 

File đính kèm

minhhanggg thử với hàm PROPER() xem có xử lý được vấn đề của bạn không nhé, không chắc vì còn tùy dữ liệu đầu vào của bạn nữa.
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Upvote 0
Sử chỗ màu đỏ lại, xem thử code
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Application.Intersect(Target, Range("B7:B91")) Is Nothing Then
Target.Value = Application.WorksheetFunction.Proper(Target.Value)
Application.EnableEvents = True
End If
End Sub
 
Upvote 0
Sử chỗ màu đỏ lại, xem thử code
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Application.Intersect(Target, Range("B7:B91")) Is Nothing Then
Target.Value = Application.WorksheetFunction.Proper(Target.Value)
Application.EnableEvents = True
End If
End Sub
Vẫn còn bị lỗi anh à.
 

File đính kèm

Upvote 0
Thử code này xem bạn, mình test thấy ok
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Intersect(Target, [B7:B91]) Is Nothing Then
Target.Value = Application.WorksheetFunction.Proper(Target.Value)
Application.EnableEvents = True
End If
End Sub
 
Upvote 0
Thử code này xem bạn, mình test thấy ok
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Intersect(Target, [B7:B91]) Is Nothing Then
Target.Value = Application.WorksheetFunction.Proper(Target.Value)
Application.EnableEvents = True
End If
End Sub
Không ok đâu anh à. Anh bật nút Caps Lock nhập dữ liệu vào vùng B7:B91 và Enter thử xem nhé.
 
Upvote 0
Mình bật caplock và đánh chữ toàn in hoa thì nó vẫn chuyển thành chữ hoa đầu mỗi chữ đúng mà bạn. không hiểu??????
ah, Sorry, ý bạn nói là nó bị lỗi như bên dưới phải không????
NguyỄn Thanh Minh
Cái này thì bó tay, chờ các cao thủ trả lời cho bạn.
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ em muốn dùng code chị ạ. Em có dùng code này nhưng còn bị lỗi.

1. code sau là sai

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
    Application.EnableEvents = False
    If Not Application.Intersect(Target, Range("B7:B91")) Is Nothing Then
        Target.Value = Application.Proper(Application.Trim(Target.Value))
        Application.EnableEvents = True
    End If
End Sub

Bạn hãy tưởng tượng là bạn nhập dữ liệu nào đó vào ô B6. Như thế các lệnh trong block IF ... End If sẽ không được thực hiện. Như thế sau khi ra khỏi sub thì vẫn có Application.EnableEvents = False. Về mặt lập trình thì không đúng. Về tác hại thì trong code này tác hại không đáng kể nhưng bạn tưởng tượng là trong code hoàn toàn khác bạn muốn khi 1 ô thay đổi thì cập nhật dữ liệu ở nơi khác. Nếu cũng có thói quen viết code như trên thì sau khi có Application.EnableEvents = False thì mọi thay đổi tiếp theo sẽ không "gây ra" cập nhật nữa.

Phải là

Mã:
    Application.EnableEvents = False
    If ... Then
        ... 
        mot loat code  
    End If
    Application.EnableEvents = True

hoặc tốt hơn:

Mã:
    If ... Then
    Application.EnableEvents = False
    ... mot loat code  
    Application.EnableEvents = True
    End If

2. Không có những cái gọi là Application.Proper, Application.Trim vì đối tượng Application không có những phương thức Proper và Trim.
Chỉ có WorksheetFunction.Proper, WorksheetFunction.Trim và VBA.Trim

3. WorksheetFunction.Proper không dùng được với tiếng Việt có dấu. Khỏi nghĩ cho mệt óc.

Bạn thử như sau xem có được không

3a. Làm bằng 2 bước. Trước hết đổi các ký tự thành chữ thường: text = LCase(text). Tiếp theo dò và chuyển các ký tự đầu từ sang chữ hoa (UCase)

3b. Bạn Insert module tôi định kèm rồi thử xem

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("B7:B91")) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = Dautu_Hoa_Thuong(Target.Value, ma_uni, dautu_thuong)
        Application.EnableEvents = True
    End If
End Sub

Code tôi viết nếu nói về unicode thì tôi có thể chắc là luôn đúng. Về mã Vni và TCVN3 thì tôi không nghiên cứu kỹ vì tôi không ủng hộ các mã Việt.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("B7:B91")) Is Nothing Then
Application.EnableEvents = False
Target.Value = Dautu_Hoa_Thuong(Target.Value, ma_uni, dautu_thuong)
Application.EnableEvents = True
End If
End Sub
Code tôi viết nếu nói về unicode thì tôi có thể chắc là luôn đúng. Về mã Vni và TCVN3 thì tôi không nghiên cứu kỹ vì tôi không ủng hộ các mã Việt.
Dạ em thấy code của anh thấy ổn về chữ hoa đầu từ rồi, tuy nhiên lại phát sinh ra lỗi là người dùng: Copy danh sách hoặc delete danh sách thì báo lỗi. Anh giúp tiếp em nhé. Cảm ơn anh nhiều nhiều.
 
Upvote 0
Dạ em thấy code của anh thấy ổn về chữ hoa đầu từ rồi, tuy nhiên lại phát sinh ra lỗi là người dùng: Copy danh sách hoặc delete danh sách thì báo lỗi. Anh giúp tiếp em nhé. Cảm ơn anh nhiều nhiều.

Bạn gửi tập tin có dữ liệu và hướng dẫn từng bước thao tác để đi tới "báo lỗi" nhé.
------------
À hiểu rồi. Khi Paste nhiều dòng đồng thời hoặc xóa nhiều dòng đồng thời. Vì lúc đó Target không là 1 cell đơn lẻ.

Bạn thử test lại xem sao.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, colB As Range
    Set colB = Application.Intersect(Target, Range("B7:B91"))
    If Not colB Is Nothing Then
        Application.EnableEvents = False
        For Each rng In colB
            rng.Value = Dautu_Hoa_Thuong(rng.Value, ma_uni, dautu_thuong)
        Next
        Application.EnableEvents = True
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn gửi tập tin có dữ liệu và hướng dẫn từng bước thao tác để đi tới "báo lỗi" nhé.
------------
À hiểu rồi. Khi Paste nhiều dòng đồng thời hoặc xóa nhiều dòng đồng thời. Vì lúc đó Target không là 1 cell đơn lẻ.

Bạn thử test lại xem sao.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, colB As Range
    Set colB = Application.Intersect(Target, Range("B7:B91"))
    If Not colB Is Nothing Then
        Application.EnableEvents = False
        For Each rng In colB
            rng.Value = Dautu_Hoa_Thuong(rng.Value, ma_uni, dautu_thuong)
        Next
        Application.EnableEvents = True
    End If
End Sub
Anh siwtom ơi! Code mình đang nhập là vùng B7:B91, giả sử như mình nhập nhiều vùng khác nhau thì sao anh há.
 
Upvote 0
Anh siwtom ơi! Code mình đang nhập là vùng B7:B91, giả sử như mình nhập nhiều vùng khác nhau thì sao anh há.

Giả sử cho 2 vùng là B7:B91 và D2:G10

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, colB As Range
    Set colB = Application.Intersect(Target, [COLOR=#ff0000]Union([B7:B91], [D2:G10])[/COLOR])
    If Not colB Is Nothing Then
        Application.EnableEvents = False
        For Each rng In colB
            rng.Value = Dautu_Hoa_Thuong(rng.Value, ma_uni, dautu_thuong)
        Next
        Application.EnableEvents = True
    End If
End Sub

Nếu bạn có nhiều vùng thì chỗ đỏ đỏ là

Mã:
Union(vung1, vung2, ..., vungn)
 
Upvote 0
Làm phiền anh chút nữa nhé, do có người hỏi tại đây http://www.giaiphapexcel.com/forum/...ên-sang-cột-khác-còn-họ-và-tên-đệm-giữ-nguyên
Em cũng muốn học hỏi nữa, khi mình viết tên xong thì tự tách tên sang cột C chẳng hạn và giữ lại Họ - chữ lót, mong anh giúp dùm nhé. Cảm ơn anh nhiều nhiều.

Tôi đã xem cái chủ đề mà bạn trả lời người ta và bây giờ bạn "ép" tôi phải làm tiếp thay bạn.
Người ta muốn khi gõ đầy đủ họ tên xong thì vẫn ở cột "đó" giữ lại họ và tên đệm nếu có, còn tên thì tách sang cột bên cạnh. Bạn trả lời người ta là tách hết cả họ, tên đệm và tên sang cột mới. Như thế là không đúng ý.

Tôi giả sử vùng nhập họ tên là vd. A1:A1000. Khi nhập xong thì riêng tên tách sang cột B.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, colB As Range, Text As String, pos As Long
    Set colB = Application.Intersect(Target, [A1:A1000])
    If Not colB Is Nothing Then
        Application.EnableEvents = False
        For Each rng In colB
            Text = Dautu_Hoa_Thuong(rng.Value, ma_uni, dautu_thuong)
            pos = InStrRev(Text, " ")
            If pos > 0 Then
                rng.Value = Left(Text, pos - 1)
                rng.Offset(, 1).Value = Right(Text, Len(Text) - pos)
            Else
                rng.Value = Text
            End If
        Next
        Application.EnableEvents = True
    End If
End Sub

Tôi quên không nói. Trong hàm Dautu_Hoa_Thuong ngay ở đầu bạn thay

Mã:
Text = Trim(Text)

thành

Mã:
Text = WorksheetFunction.Trim(Text)
 
Lần chỉnh sửa cuối:
Upvote 0
To anh Siwtom:Em chưa hiểu ý anh thay đoạn code sau là sao , anh giải thích giùm với

Tôi quên không nói. Trong hàm Dautu_Hoa_Thuong ngay ở đầu bạn thay

Code:
Text = Trim(Text)
thành

Code:
Text = WorksheetFunction.Trim(Text)
 
Upvote 0
Trong bài đầu tiên tôi có đính kèm module và trong đó có hàm Dautu_Hoa_Thuong mà ở đầu có dòng Text = Trim(Text)

Ý em muốn hỏi là 2 Hàm này có gì khác nhau mà anh lại bỏ Hàm của VB và thay thế bằng Hàm của WorksheetFunction cơ. Em nghĩ việc thay thế là có dụng ý của anh.
 
Upvote 0
Ý em muốn hỏi là 2 Hàm này có gì khác nhau mà anh lại bỏ Hàm của VB và thay thế bằng Hàm của WorksheetFunction cơ. Em nghĩ việc thay thế là có dụng ý của anh.

VBA.Trim loại các khoảng trắng ở 2 đầu, còn WorksheetFunction.Trim loại cả khoảng trắng thừa ở trong String. Vd. WorksheetFunction.Trim("hichic<10 khoảng trắng>he he") = "hichic he he"
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom