Code chuyển chữ thường sang chữ hoa (2 người xem)

Liên hệ QC

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

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,328
Được thích
1,765
Em chào Thầy cô & Anh chị!
Em có đọan code chuyển chữ thường sang chữ hoa như sau:
Mã:
Sub LoUpCase()
For Each Clls In Selection
Clls.Value = UCase(Clls.Text)
Next Clls
End Sub
Trước khi chạy Code thì fải chọn khối cell để chuyển chữ thường sang chữ hoa
Nay em muốn khi chạy code thì nó tự động chuyển khối F10:F20000, chữ thường sang chữ hoa
Em cảm ơn!
 
Em chào Thầy cô & Anh chị!
Em có đọan code chuyển chữ thường sang chữ hoa như sau:
Mã:
Sub LoUpCase()
For Each Clls In Selection
Clls.Value = UCase(Clls.Text)
Next Clls
End Sub
Trước khi chạy Code thì fải chọn khối cell để chuyển chữ thường sang chữ hoa
Nay em muốn khi chạy code thì nó tự động chuyển khối F10:F20000, chữ thường sang chữ hoa
Em cảm ơn!
Xử lý trên mảng cho nhanh tí, 20000 dòng cũng nhiều đấy
PHP:
Sub LowToUp()
Dim kq(1 To 20000, 1 To 1), DL(), i
DL = [F10:F20000].Value
For i = 1 To UBound(DL)
   kq(i, 1) = UCase(DL(i, 1))
Next
[F10:F20000] = kq
End Sub
 
Upvote 0
Đơn giản là bạn hãy thay Selection bằng [F10:F20000]
 
Upvote 0
Xử lý trên mảng cho nhanh tí, 20000 dòng cũng nhiều đấy
PHP:
Sub LowToUp()
Dim kq(1 To 20000, 1 To 1), DL(), i
DL = [F10:F20000].Value
For i = 1 To UBound(DL)
   kq(i, 1) = UCase(DL(i, 1))
Next
[F10:F20000] = kq
End Sub
Mình có sử dụng code trên để chuyển từ chữ thường sang chữ hoa cho nhiều cột , ví dụ từ cột F đến cột I
Mình sửa code như sau (sửa chỗ tô đậm.)
Mã:
 Sub LowToUp()
Dim kq(1 To 20000, 1 To 1), DL(), i
DL = [F10:[B]I20000[/B]].Value
For i = 1 To UBound(DL)
   kq(i, 1) = UCase(DL(i, 1))
Next
[F10:[B]I20000[/B]] = kq
End Sub
Vậy không biết sửa như trên có đúng không?, nhờ các bạn sửa lại & hướng dẫn
Xin cảm ơn!
 
Upvote 0
Mình có sử dụng code trên để chuyển từ chữ thường sang chữ hoa cho nhiều cột , ví dụ từ cột F đến cột I
Mình sửa code như sau (sửa chỗ tô đậm.)
Mã:
 Sub LowToUp()
Dim kq(1 To 20000, 1 To 1), DL(), i
DL = [F10:[B]I20000[/B]].Value
For i = 1 To UBound(DL)
   kq(i, 1) = UCase(DL(i, 1))
Next
[F10:[B]I20000[/B]] = kq
End Sub
Vậy không biết sửa như trên có đúng không?, nhờ các bạn sửa lại & hướng dẫn
Xin cảm ơn!

Đã là nhiều cột thì phải vòng lập For duyệt thêm chiều ngang nữa chứ ( bạn mới chỉ For.. Next có chiều dọc thôi)
Sửa lại:
Mã:
Sub LowToUp()
  Dim DL()
  Dim i As Long,[COLOR=#ff0000] j As Long[/COLOR]
  On Error Resume Next  ''<--- Thêm bẫy lỗi cũng không thừa
  DL = Range("F10:I20000").Value
  For i = 1 To UBound(DL, [COLOR=#ff0000]1[/COLOR])
    [COLOR=#ff0000]For j = 1 To UBound(DL, 2)[/COLOR]
      DL(i,[COLOR=#ff0000] j[/COLOR]) = UCase(DL(i,[COLOR=#ff0000] j[/COLOR]))
    Next
  Next
  Range("F10:I20000") = DL
End Sub
 
Upvote 0
Đã là nhiều cột thì phải vòng lập For duyệt thêm chiều ngang nữa chứ ( bạn mới chỉ For.. Next có chiều dọc thôi)
Sửa lại:
Mã:
Sub LowToUp()
  Dim DL()
  Dim i As Long,[COLOR=#ff0000] j As Long[/COLOR]
  On Error Resume Next  ''<--- Thêm bẫy lỗi cũng không thừa
  DL = Range("F10:I20000").Value
  For i = 1 To UBound(DL, [COLOR=#ff0000]1[/COLOR])
    [COLOR=#ff0000]For j = 1 To UBound(DL, 2)[/COLOR]
      DL(i,[COLOR=#ff0000] j[/COLOR]) = UCase(DL(i,[COLOR=#ff0000] j[/COLOR]))
    Next
  Next
  Range("F10:I20000") = DL
End Sub

cách làm trên đòi hỏi range hình chữ nhật, chứ range kiểu ("A1:C10,B9:F13") chẳng hạn là thua.
có thể xài vòng lặp dưới đây cho mọi kiểu range, không chỉ với range chữ nhật.

Dim i As Long, Rng As Range
Set Rng= Range("F10:I20000")
For i = 1 to Rng.Count
Rng(i) = Ucase(Rng(i))
Next

để giảm số lần lặp có thể dùng Rng.SpecialCells(xlCellTypeConstants) thay cho Rng
 
Lần chỉnh sửa cuối:
Upvote 0
cách làm trên đòi hỏi range hình chữ nhật, chứ range kiểu ("A1:C10,B9:F13") chẳng hạn là thua.
có thể xài vòng lặp dưới đây cho mọi kiểu range, không chỉ với range chữ nhật.

Dim i As Long, Rng As Range
Set Rng= Range("F10:I20000")
For i = 1 to Rng.Count
Rng(i) = Ucase(Rng(i))
Next

để giảm số lần lặp có thể dùng Rng.SpecialCells(xlCellTypeConstants) thay cho Rng

Với vùng dữ liệu không liên tục, ta sẽ thao tác nhiều lần (mỗi Area chạy 1 lần Sub) ---> Như vậy vẫn sẽ nhanh hơn là điều khiển trực tiếp trên Range
 
Upvote 0
Với vùng dữ liệu không liên tục, ta sẽ thao tác nhiều lần (mỗi Area chạy 1 lần Sub) ---> Như vậy vẫn sẽ nhanh hơn là điều khiển trực tiếp trên Range

@ndu:

- trong range ví dụ "a1:c10,b9:f13", 2 areas: "a1:c10" và "b9:f13" có intersect là "b9:c10", khi duyệt trên từng area một cách riêng rẽ, nếu không để ý sẽ thực hiện phép toán trên vùng này 2 lần. là ucase thì không sao, nếu là đếm hay tính tổng chẳng hạn sẽ dẫn đến kết quả sai.
- khi duyệt qua index bảo đảm không phát sinh phần dư. mỗi phần tử của range được (tự động) cấp index và việc duyệt qua index không phát sinh thêm thời gian.
- việc tách các areas có thể dùng hàm split(s, ",") nhưng khó phát hiện các vùng chồng lấn dẫn đến lỗi đã nêu. làm trực tiếp cũng dễ nhầm khi range bao gồm rất nhiều areas.
- để hạn chế số lần lặp, ngoài việc sử dụng xlspecialcells, có thể thêm vài cái if nữa như if not isnull(), not isnumeric, ...
- rồi phải thêm vào application.screenupdating = false, rồi bẫy lỗi on error resume next ... kể sao cho hết. vào thực tế mới thấy quá nhiều điều cần làm. nhìn vô lệnh thấy đúng lắm rồi mà khi run cứ lỗi hoài.

vài lời góp ý.

jack nt

p/s: bác ndu thức khuya nhỉ, chú ý giữ gìn sức khỏe bác ạ.
 
Upvote 0
Đại số học:
A Union B = A + B - (A Intersect B)

Muốn dùng tự nhiên có cách. Muốn dèm tự nhiên có cớ.
 
Upvote 0
Web KT

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

Back
Top Bottom