Code chuyển chữ thường sang chữ HOA (6 người xem)

Liên hệ QC

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

truckhoa2006

Thành viên hoạt động
Tham gia
3/10/07
Bài viết
155
Được thích
16
Khi em ghi vào 1 ô excel thì em muốn trong ô này chữ thường phải chuyển thành chữ In Hoa
Vd: Nguyễn Văn A -> NGUYỄN VĂN A
Trên diễn đàn có 1 đoạn code em đã làm theo nhưng dù đã đổi 1 Union thành UPPER rồi mà nó cứ báo lỗi, xin chỉ giúp em:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(UPPER(Range("A1:A10000"), Range("C1:C10000"), Range("E1:E10000")), Target) Is Nothing Then
Application.EnableEvents = False
Target.Value = UCase$(Left$(Target.Value, 1)) & _
Mid$(Target.Value, 2, Len(Target.Value) - 1)
Application.EnableEvents = True
End If
End Sub

Vậy nó sai chỗ nào xin chỉ giúp em
 
Có thầy NDU vào là xong thui:
Đây thầy ơi, sẵn em hỏi luôn cách kẻ ô luôn như trong file em gửi.
Cám ơn thầy
Sai file rồi thầy ơi: File Text chứ không phai Text2
Xin lỗi thầy
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Khi em ghi vào 1 ô excel thì em muốn trong ô này chữ thường phải chuyển thành chữ In Hoa
Vd: Nguyễn Văn A -> NGUYỄN VĂN A
Trên diễn đàn có 1 đoạn code em đã làm theo nhưng dù đã đổi 1 Union thành UPPER rồi mà nó cứ báo lỗi, xin chỉ giúp em:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(UPPER(Range("A1:A10000"), Range("C1:C10000"), Range("E1:E10000")), Target) Is Nothing Then
Application.EnableEvents = False
Target.Value = UCase$(Left$(Target.Value, 1)) & _
Mid$(Target.Value, 2, Len(Target.Value) - 1)
Application.EnableEvents = True
End If
End Sub

Vậy nó sai chỗ nào xin chỉ giúp em
Mớit tải cái file trắng toét về coi. Giống như "Vô Tự File"
PHP:
Private Sub Worksheet_Change(ByVal Target As range)
If Not Intersect(Union([A1:A100], [C1:C100], [E1:E100]), Target) Is Nothing Then
   Application.EnableEvents = False
   Target.Value = UCase(Target)
   Application.EnableEvents = True
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mớit tải cái file trắng toét về coi. Giống như "Vô Tự File"
PHP:
Private Sub Worksheet_Change(ByVal Target As range)
If Not Intersect(Union([A1:A100], [C1:C100], [E1:E100]), Target) Is Nothing Then
   Application.EnableEvents = False
   Target.Value = UCase(Target)
   Application.EnableEvents = True
End If
End Sub

Nếu bây giờ mình muốn cột khác, thì mình sẽ sửa lại chỗ này phải không: [A1:A100], [C1:C100], [E1:E100]
Ví dụ:
[C1:C100], [F1:F100] và bỏ [E1:E100] ( vì chỉ lấy 2 cột ở sheet khác)
Mình làm vậy có đúng không.
Khi mở file nó tự auto được không bạn
Cám ơn bạn

 
Lần chỉnh sửa cuối:
Upvote 0
Chịu thua luôn. Trước khi muốn làm "tự động" (auto) này nọ. thiết tưởng các bạn cũng nên tìm hiểu sơ sơ về các cách bẫy hiện tượng (events) - tuy không cần phải thông thái, nhưng ít ra cũng phải biết event nào làm việc gì chứ.

Tại sao lại cứ mỗi lần mở file ra, nó tự "auto" chuyển đổi dữ liệu của mấy cột ấy? Nếu mỗi lần ghi vào nó đổi rồi thì cần gì phải tiếp tục làm mãi?

Vả lại, code trong #1 của bạn là code đổi Hoa ký tự đầu tiên chứ không phải đổi Hoa tất cả.
Mà đổi hoa một ký tự làm thế cũng dở bẹt. Sử một ký tự thì sửa thẳng vào nó, không cần phải sửa nguyên chuỗi.
Mid(Target.Value,1,1) = UCase(Mid(Target.Value,1,1))
 
Upvote 0
Chịu thua luôn. Trước khi muốn làm "tự động" (auto) này nọ. thiết tưởng các bạn cũng nên tìm hiểu sơ sơ về các cách bẫy hiện tượng (events) - tuy không cần phải thông thái, nhưng ít ra cũng phải biết event nào làm việc gì chứ.

Tại sao lại cứ mỗi lần mở file ra, nó tự "auto" chuyển đổi dữ liệu của mấy cột ấy? Nếu mỗi lần ghi vào nó đổi rồi thì cần gì phải tiếp tục làm mãi?

Vả lại, code trong #1 của bạn là code đổi Hoa ký tự đầu tiên chứ không phải đổi Hoa tất cả.
Mà đổi hoa một ký tự làm thế cũng dở bẹt. Sử một ký tự thì sửa thẳng vào nó, không cần phải sửa nguyên chuỗi.
Mid(Target.Value,1,1) = UCase(Mid(Target.Value,1,1))

Thức tế là thế này, em có 1 file lương, rất nhiều sheet, em đã tạo 1 lệnh ( button) In phiếu lương, khi click nút này thì bên 1 sheet khác sẽ xuất hiện những phiếu lương tương ứng cho mỗi người , em nói auto là em muốn khi click nút Print thì dữ liệu sẽ đổ sang 1 sheet mới và các cột yêu cầu sẽ có chữ thường thành chữ in hoa.

Code nút in được các thầy và các bạn cho em như sau:

Sub INPHIEULUONGQC1() 'Sub MAKEPL1()
Dim Dc As Long, Cl(), i, j, k
Dim Tm, Td, Kq()
Dc = Sheet8.Range("A65536").End(xlUp).Row
If Dc < 5 Then Exit Sub
ReDim Kq(Int(Dc / 2) * 12 + 12, 1 To 6)
Tm = Sheet8.Range("A11:P" & Dc)
Td = Sheet8.[A9:P9]
k = 1
Cl = Array(2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15)
For i = 1 To UBound(Tm, 1) Step 2
For j = 0 To 10 '
Kq(k + j, 2) = Td(1, Cl(j))
Kq(k + j, 3) = Tm(i, Cl(j))
Kq(k + j, 5) = Td(1, Cl(j))
Kq(k + j, 6) = Tm(i + 1, Cl(j))
Next j
k = k + 12
Next i
Sheet4.[A1:F65000].ClearContents
Sheet4.[A1].Resize(UBound(Kq, 1), UBound(Kq, 2)) = Kq
Sheet4.Select
End Sub


Chỉ vậy thôi.
Ban đầu em dưa code in hoa lồng vào :Kq(k + j, 3) = Tm(i, Cl(j)) và Kq(k + j, 6) = Tm(i + 1, Cl(j))
Nhưng đều không thành công.
Do đó em cần hỏi cho chắc chắn lại code em bắt chước theo , làm theo mọi người , để xem phương thức hoạt động của nó.
Và có thêm câu hỏi là khi ô đó có dữ liệu thì tự kẻ ô, em làm được rồi bằng Con ditionnal fỏmatting
Nhưng bây giờ sếp lại nói Xung quanh mỗi phiếu lương và giữa 2 cột là nét liền, còn dòng trên và dòng dưới là nét đứt.
Chỉ có vậy thui.
Nếu em gây khó cho mọi người mong mọi người thông cảm vì cấp trên không bao giờ muốn ít hơn , mà họ luôn muốn nhiều hơn, nhiều hơn nữa. Mong mọi người thông cảm cho em.
 
Upvote 0
Khi em ghi vào 1 ô excel thì em muốn trong ô này chữ thường phải chuyển thành chữ In Hoa
Vd: Nguyễn Văn A -> NGUYỄN VĂN A
Trên diễn đàn có 1 đoạn code em đã làm theo nhưng dù đã đổi 1 Union thành UPPER rồi mà nó cứ báo lỗi, xin chỉ giúp em:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(UPPER(Range("A1:A10000"), Range("C1:C10000"), Range("E1:E10000")), Target) Is Nothing Then
Application.EnableEvents = False
Target.Value = UCase$(Left$(Target.Value, 1)) & _
Mid$(Target.Value, 2, Len(Target.Value) - 1)
Application.EnableEvents = True
End If
End Sub

Vậy nó sai chỗ nào xin chỉ giúp em

Bạn vào bài này tham khảo thêm nhé:
http://www.giaiphapexcel.com/forum/...ữ-liệu-theo-điều-kiện&p=519601#post519601
 
Upvote 0
Và có thêm câu hỏi là khi ô đó có dữ liệu thì tự kẻ ô, em làm được rồi bằng Con ditionnal fỏmatting
Nhưng bây giờ sếp lại nói Xung quanh mỗi phiếu lương và giữa 2 cột là nét liền, còn dòng trên và dòng dưới là nét đứt.
Chỉ có vậy thui.
Nếu em gây khó cho mọi người mong mọi người thông cảm vì cấp trên không bao giờ muốn ít hơn , mà họ luôn muốn nhiều hơn, nhiều hơn nữa. Mong mọi người thông cảm cho em.
Thường code cho định dạng kẻ khung rất dài dòng. Đây là 1 cách khá ngắn để làm điều bạn cần.
Code này kẻ khung cho sheet hiện hành, dữ liệu bắt đầu từ dòng 2 cột A, B, và D,E. Code theo file mẫu bạn gởi. Nếu không trúng thì tự sửa lại cho đúng file thật. Không chơi đưa file thật lên nhờ code lại. Không khoái làm lần 2 vì lý do này
PHP:
Sub KeKhung()
Application.ScreenUpdating = False
Dim J As Long, I As Long, n As Long
For J = 2 To [A65536].End(3).Row + 1
   If Cells(J, 1) = "" Then
         For I = 7 To 12
            n = IIf(I = 12, 2, 1)
            Cells(J, 1).Offset(-3).Resize(3, 2).Borders(I).LineStyle = n
            Cells(J, 1).Offset(-3, 3).Resize(3, 2).Borders(I).LineStyle = n
         Next
   End If
Next
Application.ScreenUpdating = True
End Sub
Và cũng xin miễn giải thích vì code này mình copy của ai đó trên diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi em ghi vào 1 ô excel thì em muốn trong ô này chữ thường phải chuyển thành chữ In Hoa
Vd: Nguyễn Văn A -> NGUYỄN VĂN A
Trên diễn đàn có 1 đoạn code em đã làm theo nhưng dù đã đổi 1 Union thành UPPER rồi mà nó cứ báo lỗi, xin chỉ giúp em:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(UPPER(Range("A1:A10000"), Range("C1:C10000"), Range("E1:E10000")), Target) Is Nothing Then
Application.EnableEvents = False
Target.Value = UCase$(Left$(Target.Value, 1)) & _
Mid$(Target.Value, 2, Len(Target.Value) - 1)
Application.EnableEvents = True
End If
End Sub

Vậy nó sai chỗ nào xin chỉ giúp em

Chỉ riêng đoạn code ngắn này thôi đã có những chỗ chưa chuẩn.
Chuyện bạn dùng UCase kiểu đó thì nếu xét về mặt nhu cầu của bạn thì chưa đạt nhưng không phải là lỗi.
Mã:
text2 = UCase$(Left$(text1, 1)) & Mid$(text1, 2, Len(text1) - 1)

không là code lỗi.

Nhưng code
Mã:
Target.Value = UCase$(Left$(Target.Value, 1)) & Mid$(Target.Value, 2, Len(Target.Value) - 1)

là code chưa chuẩn nếu xét về phương diện code. Sẽ phát sinh lỗi khi "người ta" Paste nhiều dòng từ 1 danh sách ngoài nào đó, vì khi đó Target là Range của nhiều cell.

Vấn đề thứ 2 là Union/UPPER.
Bạn tự viết code hay sửa code của người khác thì bạn vẫn phải hiểu công cụ mình định dùng. Bạn biết Union và UPPER làm gì không mà thay thế? Riêng hàm Excel bạn có thể đọc trong help để biết chúng làm gì nhưng nếu bạn dùng module của ai đó thì để biết hàm làm gì thì bạn phải đọc code. Nhưng thậm chí không cần đọc code mà tôi thấy hàm abc trả về kết quả là chuỗi còn hàm xyz trả về Range thì tôi biết chắc chắn không thể thay thế chúng với nhau được. Chuyện thay thế có trả về kết quả y hệt nhau hay không chưa quan trọng vì cùng lắm chỉ cho kết quả sai so với nhu cầu cụ thể. Còn thay thế khi 2 hàm trả về 2 kiểu dữ liệu khác nhau là LỖI về mặt code. Là lỗi mà sẽ có 1 cửa sổ nào đó nhẩy ra, hoặc treo máy, hoặc Excel bị "giết đột ngột". Trước khi code làm đúng ý thì code phải không có lỗi thực thi đã.

Tôi chỉ góp ý về đoạn code trong bài trích để bạn lưu ý khi viết code. Tôi không xem tập tin đính kèm và cũng không tìm hiểu bạn làm gì trong tập tin.
-------------
À mà nếu bạn dùng hàm của Excel thì trong VBA đâu có hàm UPPER?
 
Lần chỉnh sửa cuối:
Upvote 0
Thường code cho định dạng kẻ khung rất dài dòng.
........

Tôi thì không nghĩ như Hải và đây là lệnh (màu đỏ) cho yêu cầu trên.
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = 0
    On Error Resume Next
    If Selection.Cells.Count = 1 Then Exit Sub
    With Selection.SpecialCells(2)
[COLOR=#ff0000]        .Borders.LineStyle = 1
        .Borders(12).LineStyle = 2[/COLOR]
    End With
End Sub
 
Upvote 0
Tôi thì không nghĩ như Hải và đây là lệnh (màu đỏ) cho yêu cầu trên.
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = 0
    On Error Resume Next
    If Selection.Cells.Count = 1 Then Exit Sub
    With Selection.SpecialCells(2)
[COLOR=#ff0000]        .Borders.LineStyle = 1
        .Borders(12).LineStyle = 2[/COLOR]
    End With
End Sub

Anh nói thế là do anh chưa có thấy cái file thật của tác giả. Mình đã từng code cho cái file chuyển dữ liệu từ 1 sheet sang 1 sheet khác để in nên mình biết tác giả muốn gì rồi. Chứ nếu có 1 vùng dữ liệu thì dùng vòng lặp chi cho tốn kém code chứ anh.
 
Upvote 0
Web KT

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

Back
Top Bottom