Luôn mặc định chữ in hoa khi nhập dữ liệu vào bảng tính (1 người xem)

Liên hệ QC

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

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,210
Được thích
24,721
Khi sử dụng kiểu gõ Unicode, để nhập chữ in hoa, thông thường phải sử dụng phím Caps Lock. Nhưng tôi có 1 cách chuyển tự động chuyển chữ thường thành chữ hoa bằng cách sử dụng VBA. Đầu tiên ấn Alt+F11, cửa sổ MVB hiện ra, sau đó chọn Sheet nào bạn muốn rồi bấm đúp để hiện cửa sổ code, sau đó copy dòng này vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub

Range("A1:O30") là vùng tuỳ chọn, hãy thử xem sao!
 
Nhờ anh Hướng giải thích thêm về câu sau, tôi chỉ hiểu lờ mờ.
Và thuật ngữ recordset, thấy đâu đó mà không hiểu.
Cám ơn nhiều!
If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing
 
Upvote 0
Nếu được thì bác Hướng có thể giải thích thêm đoạn code này không? &&&%$R
PhanTuHuong đã viết:
Mã:
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
[/quote] 
 - [COLOR=Red]Byval Target [COLOR=Black]ý nghĩa là gì? Có phải là mình khai báo biến [COLOR=Red]Target[/COLOR] là range ko?
Và đoạn code trên có phải là: "nếu Ô target mà mình chọn có giao (intersect) với khối ô đã chọn thì..."?
Thanks bác trước!!!
[/COLOR][/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
PhanTuHuong đã viết:
Khi sử dụng kiểu gõ Unicode, để nhập chữ in hoa, thông thường phải sử dụng phím Caps Lock. Nhưng tôi có 1 cách chuyển tự động chuyển chữ thường thành chữ hoa bằng cách sử dụng VBA. Đầu tiên ấn Alt+F11, cửa sổ MVB hiện ra, sau đó chọn Sheet nào bạn muốn rồi bấm đúp để hiện cửa sổ code, sau đó copy dòng này vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub

Range("A1:O30") là vùng tuỳ chọn, hãy thử xem sao!

Anh Hướng cho mình hỏi: Nếu muốn chuyển chữ thường sang chữa Hoa (các chữ đầu từ) thì sửa code như thế nào ?

Cảm ơn anh !
 
Upvote 0
ThuNghi đã viết:
Nhờ anh Hướng giải thích thêm về câu sau, tôi chỉ hiểu lờ mờ.
Và thuật ngữ recordset, thấy đâu đó mà không hiểu.
Cám ơn nhiều!
Gởi anh ThuNghi,
Intersect trong đoạn code của bác hướng nghĩa là phép giao (phép tính logic). Chứ không liên quan đến recordset. Để tìm hiểu về recordset bác hãy thử tìm các topic về ADO nhé.

Em nói thêm về ý nghĩa đoạn code:
Mã:
Not Application.Intersect(Target, Range("A1:O30")) Is Nothing
Đoạn này có ý nghĩa xem xét khu vực nhập liệu. Nếu vược ra ngoài vùng A1:O30 thì không sét. Chỉ có vậy thôi àh.
 
Upvote 0
Hàm UPPER trong Excel có sẳn sao phải dùng đến VBA nhỉ?
 
Upvote 0
anhtuan1066 đã viết:
Hàm UPPER trong Excel có sẳn sao phải dùng đến VBA nhỉ?
Nếu bảng tính của bạn có nhiều Text thì chỉ gõ tên hàm cũng ốm!

Not Application.Intersect(Target, Range("A1:O30")) Is Nothing

Intersect lấy giao của Target với vùng ta đặt, hai lần của phủ định có nghĩa là khẳng định (có giao nhau), khi đó lệnh mới có tác dụng. Ngoài vùng giao nhau thì vô tác dụng. Bác SD_AQ đã đề cập đến phương thức Intersect rồi đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Hướng cho mình hỏi: Nếu muốn chuyển chữ thường sang chữa Hoa (các chữ đầu từ) thì sửa code như thế nào ?
Tôi xào nấu các code của các bạn tạo ra code này cho Vũ Ngọc.
Nhờ các Mod trau chuốt hộ để tôi có thể làm tốt hơn.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim FirstText As String, LastText As String, Text As String
Dim Txt As String
If Not Application.Intersect(Target, Range("A1:A30")) Is Nothing Then
'On Error GoTo bien:
Txt = Target.Value
Txt = Application.WorksheetFunction.Trim(Txt)
FirstText = ""
Text = ""
LastText = Right(Txt, Len(Txt) - InStrRev(Txt, " "))
LastText = UCase(Left(LastText, 1)) & Right(LastText, Len(LastText) - 1)
i = 1
Do While i > 0 And InStr(1, Txt, " ") > 0
FirstText = Application.WorksheetFunction.Trim(Left(Txt, InStr(1, Txt, " ")))
FirstText = UCase(Left(FirstText, 1)) & Right(FirstText, Len(FirstText) - 1)
Text = Text & " " & FirstText
i = Len(FirstText)
Txt = Application.WorksheetFunction.Trim(Right(Txt, Len(Txt) - i))
Loop
Text = Text & " " & LastText
Target.Value = Application.WorksheetFunction.Trim(Text)
'bien:
End If
End Sub
 
Upvote 0
vungoc đã viết:
Anh Hướng cho mình hỏi: Nếu muốn chuyển chữ thường sang chữa Hoa (các chữ đầu từ) thì sửa code như thế nào ?
Chào Anh
Anh dùng thử code này xem sao nhé
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = Application.Proper(Application.Trim(Target.Value))
  End If
End Sub
Thân !
 
Upvote 0
Công nhận mình máy móc thiệt, có hàm proper mà làm lung tung. Cám ơn tedaynui nhiều.
Thôi kệ, cũng là cơ hội học viết hàm. Nguyên liệu như trên, thêm mắm muối -> other code.
 
Upvote 0
Chân thành cảm ơn tất cả các bạn !
 
Upvote 0
Khi sử dụng kiểu gõ Unicode, để nhập chữ in hoa, thông thường phải sử dụng phím Caps Lock. Nhưng tôi có 1 cách chuyển tự động chuyển chữ thường thành chữ hoa bằng cách sử dụng VBA. Đầu tiên ấn Alt+F11, cửa sổ MVB hiện ra, sau đó chọn Sheet nào bạn muốn rồi bấm đúp để hiện cửa sổ code, sau đó copy dòng này vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub

Range("A1:O30") là vùng tuỳ chọn, hãy thử xem sao!

Vậy luôn mặc định chữ hoa đầu từ thì sao nhỉ!
đây là code cho mặc định chữ thường
PHP:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = LCase(Target.Value)
  End If
End Sub
 
Upvote 0
Vậy luôn mặc định chữ hoa đầu từ thì sao nhỉ!
đây là code cho mặc định chữ thường
PHP:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = LCase(Target.Value)
  End If
End Sub
Thì bài #10 nói rồi đó bác. Biến Sh khai báo làm gì vậy bác? Code của bác khác code của bác Hướng chữ U và chữ L --=0
 
Upvote 0
Hãy cẩn thận khi xóa dữ liệu trong vùng ("A1:O30")

Khi sử dụng kiểu gõ Unicode, để nhập chữ in hoa, thông thường phải sử dụng phím Caps Lock. Nhưng tôi có 1 cách chuyển tự động chuyển chữ thường thành chữ hoa bằng cách sử dụng VBA. Đầu tiên ấn Alt+F11, cửa sổ MVB hiện ra, sau đó chọn Sheet nào bạn muốn rồi bấm đúp để hiện cửa sổ code, sau đó copy dòng này vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub

Range("A1:O30") là vùng tuỳ chọn, hãy thử xem sao!

Hãy cẩn thận khi xóa dữ liệu trong vùng ("A1:O30")
Nếu muốn xóa thì chọn và xóa từng cell. Nếu chọn cả vùng ("A1:O30") rồi nhấn nút Delete thì ... --=-- --=----=--
 
Upvote 0
Hãy cẩn thận khi xóa dữ liệu trong vùng ("A1:O30")
Nếu muốn xóa thì chọn và xóa từng cell. Nếu chọn cả vùng ("A1:O30") rồi nhấn nút Delete thì ... --=-- --=----=--
Thêm vào đầu thủ tục On error resume next là OK bác Boyxin à, cái này Dosnet được Hoangdanh mách cho -=.,,
 
Upvote 0
Có một vấn đề nữa là nếu làm theo cách này thì khi em link dữ liệu từ ô khác sang thì ô mình mặc định viết hoa sẽ không cập nhật dữ liệu khi dữ liệu nguồn thay đổi. Các bác xem lại giúp em.
 
Upvote 0
Có cách nào khắc phục lỗi khi xóa trên cột cần chuyển đổi chữ thường thành hoa không nhỉ?
 
Upvote 0
Kg biết bạn làm ntn?
Chép code này vào Sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub
Quái lạ. Làm y chang trên Office 2010 thì lỗi khởi động lại office. Còn đem qua 2003 thì không sao. Chả hiểu nổi.
 
Upvote 0
Mở phím CAPLOCK lên cho khoẻ khỏi phải nhức đầu

Vì anh kg fải là dân kế toán nên chưa thấy sự cần thiết của code trên, trong kế toán có những cột fải yêu cầu nhập toàn bộ là chữ HOA (Ví dụ: ký hiệu hóa đơn) , nếu cứ bấm Caplock hoài mõi tay & kg tập trung!
Em thấy code trên chạy trên Ex 2010 thì bị lỗi thật. Anh đã là chuyên gia về code thì cho biết tại sao nó bị lỗi như vậy?
Em cảm ơn!
 
Upvote 0
Vì anh kg fải là dân kế toán nên chưa thấy sự cần thiết của code trên, trong kế toán có những cột fải yêu cầu nhập toàn bộ là chữ HOA (Ví cứ bấm Caplock hoài mõi tay & kg tập trung!
Em thấy code trên chạy trên Ex 2010 thì bị lỗi thật. Anh đã là chuyên gia về code thì cho biết tại sao nó bị lỗi như vậy?
Em cảm ơn!
Khi sử dụng sự kiện Sheet_Change thì phải lưu ý câu lệnh Application.EnableEvents = False và Application.EnableEvents = True trước khi thoát sub
Vì khi Target= Ucase(Target) đã tạo ra 1 sự kiện mới
Mình chỉ đoán thế thôi nhưng chưa test đoạn code trên vì mình xài 2007
 
Upvote 0
Khi sử dụng sự kiện Sheet_Change thì phải lưu ý câu lệnh Application.EnableEvents = False và Application.EnableEvents = True trước khi thoát sub
Vì khi Target= Ucase(Target) đã tạo ra 1 sự kiện mới
Mình chỉ đoán thế thôi nhưng chưa test đoạn code trên vì mình xài 2007
Em đã text trên 2010, kết quả tốt
Cảm ơn anh vì học thêm 1 chiêu mới
--------
P/s: mà sao anh kg chuyển Ex 2007 lên 2010 nhỉ? nghe đồn Ex 2007 dễ phát sinh lỗi so với 2003 hay 2010?
 
Upvote 0
Bạn chỉnh thế nào mà hết lỗi nhỉ

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
  Application.EnableEvents = True
End Sub
 
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
  If Not Application.Intersect(Target, Range("A1:O30")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
  Application.EnableEvents = True
End Sub

Thế nếu người ta không gõ mà copy nhiều cell rồi paste thì code nó.. tèo à?
Đã nói đến ChangeCase thường người ta sẽ viết luôn code cho 3 trường hợp: UPPER, LOWER và Proper luôn (tôi đã từng viết và post lên diễn đàn rồi)
 
Upvote 0
Thế nếu người ta không gõ mà copy nhiều cell rồi paste thì code nó.. tèo à?
Đã nói đến ChangeCase thường người ta sẽ viết luôn code cho 3 trường hợp: UPPER, LOWER và Proper luôn (tôi đã từng viết và post lên diễn đàn rồi)

Nếu được, Thầy cho em đường Link!
Em cảm ơn
 
Upvote 0
Nếu được, Thầy cho em đường Link!
Em cảm ơn
Tôi gửi code luôn đây:
1> Hàm ChangeCase cho 1 chuổi:
PHP:
Function ChangeCaseFromString(ByVal Text As String, ByVal CaseType As Long) As String
  ''CaseType = 1 ---> lower
  ''CaseType = 2 ---> UPPER
  ''CaseType = 3 ---> Proper
  Dim i As Long, tmp As String
  On Error Resume Next
  If Trim(Text) <> "" And Not (IsNumeric(Text)) Then
    Select Case CaseType
      Case 1: ChangeCaseFromString = LCase(Text)
      Case 2: ChangeCaseFromString = UCase(Text)
      Case 3
        tmp = Trim(Text)
        If Len(tmp) = 1 Then
          ChangeCaseFromString = UCase(tmp)
        Else
          tmp = UCase(Left(tmp, 1)) & LCase(Mid(tmp, 2, Len(tmp)))
          For i = 2 To Len(tmp)
            If UCase(Mid(tmp, i, 1)) <> LCase(Mid(tmp, i, 1)) Then
              If UCase(Mid(tmp, i - 1, 1)) = LCase(Mid(tmp, i - 1, 1)) Then
                tmp = Left(tmp, i - 1) & Replace(tmp, Mid(tmp, i, 1), UCase(Mid(tmp, i, 1)), i, 1)
              End If
            End If
          Next
          ChangeCaseFromString = tmp
        End If
    End Select
  Else
    ChangeCaseFromString = Text
  End If
End Function
2> Hàm ChangeCase cho 1 Array hoặc 1 Range:
PHP:
Function ChangeCase(ByVal sArray, ByVal CaseType As Long)
  Dim tmpArr, TmpStr As String, i As Long, j As Long
  On Error Resume Next
  tmpArr = sArray
  If TypeName(tmpArr) <> "Variant()" Then
    tmpArr = ChangeCaseFromString(tmpArr, CaseType)
  Else
    TmpStr = Join(tmpArr, " ")
    If TmpStr <> "" Then
      For i = LBound(tmpArr) To UBound(tmpArr)
        tmpArr(i) = ChangeCaseFromString(tmpArr(i), CaseType)
      Next
    Else
      For i = LBound(tmpArr, 1) To UBound(tmpArr, 1)
        For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
          tmpArr(i, j) = ChangeCaseFromString(tmpArr(i, j), CaseType)
        Next
      Next
    End If
  End If
  ChangeCase = tmpArr
End Function
3> Thủ tục để kích hoạt ChangeCase trên 1 vùng
PHP:
Sub ChangeCaseFormRange(ByVal SrcRng As Range, ByVal CaseType As Long)
  Dim sArray, Area As Range, i As Long, j As Long
  On Error Resume Next
  With SrcRng
    If .Count = 1 Then
      .Formula = ChangeCase(.Formula, CaseType)
    Else
      For Each Area In .Areas
        sArray = Area.Formula
        sArray = ChangeCase(sArray, CaseType)
        Area.Formula = sArray
      Next
    End If
  End With
End Sub
4> Áp dụng vào sự kiện Worksheet_Change:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rng As Range
  On Error Resume Next
  If Not Intersect(Target, [E2:E5000]) Is Nothing Then
    Set Rng = Intersect(Target, [E2:E5000])
    Application.EnableEvents = False
    ChangeCaseFormRange Rng, 2 
  End If
  Application.EnableEvents = True
End Sub
Bộ công cụ ChangeCase này có thể hoạt động trên Range, Array hoặc 1 chuổi. Nó cho phép ChangeCase ngay cả chuổi nằm trong công thức luôn
 

File đính kèm

Upvote 0

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

Back
Top Bottom