Làm sao viết HOA lần lượt các ký tự trong excel (1 người xem)

Liên hệ QC

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

othanhquango

Thành viên hoạt động
Tham gia
6/3/09
Bài viết
138
Được thích
7
Chào các anh. Tình hình là em có một trường hợp thế này, mong các anh hướng dẫn em với.

Em muốn viết hoa lần lượt các ký tự của một từ. Ví dụ: từ "chó" sau khi em chạy hàm thi em sẽ có một danh sách bao gồm từ cũ và các từ sau: Chó, cHó, chÓ, CHó,cHÓ, ... nói chung là tất cả các trường hợp của từ đó và viết hoa. Mỗi từ một ô.

Rất mong các cao thủ hướng dẫn giúp em.
 
Chào các anh. Tình hình là em có một trường hợp thế này, mong các anh hướng dẫn em với.

Em muốn viết hoa lần lượt các ký tự của một từ. Ví dụ: từ "chó" sau khi em chạy hàm thi em sẽ có một danh sách bao gồm từ cũ và các từ sau: Chó, cHó, chÓ, CHó,cHÓ, ... nói chung là tất cả các trường hợp của từ đó và viết hoa. Mỗi từ một ô.

Rất mong các cao thủ hướng dẫn giúp em.

Yêu cầu cũng lạ hen!
Nhưng... chẳng biết để làm gì...
 
Upvote 0
Em đang làm một ô để cấm một số từ và không cho người khác dùng những từ đó. Nếu chỉ ghi "chó" thì người ta sẽ lách bằng cách thay đổi chữ viết hoa là được phép vì vậy em mới cần tất cả các trường hợp để người ta không thể dùng nó, rất mong các cao thủ giúp em. Ở đây không có cách khác nha (Chuyển hết sang chữ thường rồi kiểm tra, hoặc chuyển hết sang chữ hoa rồi kiểm tra, ...)
 
Upvote 0
Em đang làm một ô để cấm một số từ và không cho người khác dùng những từ đó. Nếu chỉ ghi "chó" thì người ta sẽ lách bằng cách thay đổi chữ viết hoa là được phép vì vậy em mới cần tất cả các trường hợp để người ta không thể dùng nó, rất mong các cao thủ giúp em. Ở đây không có cách khác nha (Chuyển hết sang chữ thường rồi kiểm tra, hoặc chuyển hết sang chữ hoa rồi kiểm tra, ...)

Thế thì bạn cần gì phải cực khổ vậy
Ví dụ muốn cấm từ "chó" thì vầy
Mã:
If UCase(Từ khóa) = "CHÓ" then
  'bắt giam hay gì đó tùy bạn
End If
Bảo đảm họ có viết "cHÓ" hay "Chó" gì thì cũng phải "dính chưởng" thôi
Tóm lại dùng UCase nhé
------------------------------------
Ở đây không có cách khác nha (Chuyển hết sang chữ thường rồi kiểm tra, hoặc chuyển hết sang chữ hoa rồi kiểm tra, ...)
Bạn nói vậy là sao?
 
Upvote 0
Ý mình là mình dùng một mã nguồn có sẵn, nên không thể code thành viết hoa hết hoặc viết thường hết để xưỷ lý. Nên mình mới nghĩ ra là dùng excel làm công cụ để tính ra tất cả các trường hợp, sau đó copy và paste vào code đó thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Thiết kế thuộc loại siêu đẳng.
Bạn có biết là có tất cả 2^(số ký tự) kiểu khác nhau không?
Gặp từ dài nhất của tiếng Việt (nghiêng) thì bạn có tất cả 2^7 = 128 kiểu.
Gặp tiếng Anh miễn bàn.

Tuy nhiên nếu nhất định muốn làm thì tìm hiểu về cách đổi số nhị phân. Ví dụ từ "chó" có 3 ký tự thì ứng với các vị trí bít từ số 0 đến số 7 (3 bits)
 
Lần chỉnh sửa cuối:
Upvote 0
Mã nguồn có sẵn cũng là 1 ngôn ngữ nào đó, và ngôn ngữ đó cũng có hàm UCase với 1 tên khác.
 
Upvote 0
Mã:
If UCase(Từ khóa) = "CHÓ" then
  '[B][COLOR=#ff0000]bắt giam[/COLOR][/B] hay gì đó tùy bạn
End If
Bảo đảm họ có viết "cHÓ" hay "Chó" gì thì cũng phải "dính chưởng" thôi

Bắt giam? Thế thì chưa biết ai dính chưởng của ai.
Gặp ông vô gia cư đang chết đói, mùa đông giá lạnh, đang ngồi nghĩ: làm thế nào để có cơm ăn hàng ngày đây? Tối ngủ ở đâu, chăn ấm lấy đâu ra? May quá, có ông hảo tâm bắt giam vì ta dính chưởng. Có cơm ăn hàng ngày rồi. Có chỗ ấm ngủ rồi. He he.

Ý mình là mình dùng một mã nguồn có sẵn, nên không thể code thành viết hoa hết hoặc viết thường hết để xưỷ lý. Nên mình mới nghĩ ra là dùng excel làm công cụ để tính ra tất cả các trường hợp, sau đó copy và paste vào code đó thôi.

Tốt nhất là bạn gửi tập tin lên. Trong tập tin có: dữ liệu ví dụ, cái "mã nguồn" bí ẩn, miêu tả các thao tác mà bạn sẽ làm nếu dùng cái "mã nguồn" kia, kết quả phải thế nào, và kết quả ở đâu.
Không ai bói từ bã cà phê cái mà bạn dấu kín và cái chỉ tồn tại trong đầu của bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Thiết kế thuộc loại siêu đẳng.
Bạn có biết là có tất cả 2^(số ký tự) kiểu khác nhau không?
Gặp từ dài nhất của tiếng Việt (nghiêng) thì bạn có tất cả 2^7 = 128 kiểu.
Gặp tiếng Anh miễn bàn.

Tuy nhiên nếu nhất định muốn làm thì tìm hiểu về cách đổi số nhị phân. Ví dụ từ "chó" có 3 ký tự thì ứng với các vị trí bít từ số 0 đến số 7 (3 bits)

Cảm ơn anh đã góp ý, nhưng trình của em thì bó tay.

Mã nguồn có sẵn cũng là 1 ngôn ngữ nào đó, và ngôn ngữ đó cũng có hàm UCase với 1 tên khác.

Hic, nếu em pro vậy. Có thể can thiệp và chỉnh lại mã nguồn của nó thì cần gì em phải lấy excel làm trung gian anh?
 
Upvote 0
Cảm ơn anh đã góp ý, nhưng trình của em thì bó tay.



Hic, nếu em pro vậy. Có thể can thiệp và chỉnh lại mã nguồn của nó thì cần gì em phải lấy excel làm trung gian anh?

Cuối cùng là: Không thể hình dung ra được công việc của bạn là thế nào cả
 
Upvote 0
Cuối cùng là: Không thể hình dung ra được công việc của bạn là thế nào cả
Túm lại là bạn ấy muốn liệt kê xem có tất cả bao nhiêu loại "CHÓ" rồi nhốt mỗi con vào một chuồng. Hic, lấy cái ví dụ chi mà ngộ vậy không biết -+*/+-+-+-+**~**
Em muốn viết hoa lần lượt các ký tự của một từ. Ví dụ: từ "chó" sau khi em chạy hàm thi em sẽ có một danh sách bao gồm từ cũ và các từ sau: Chó, cHó, chÓ, CHó,cHÓ, ... nói chung là tất cả các trường hợp của từ đó và viết hoa. Mỗi từ một ô.
 
Upvote 0
Túm lại là bạn ấy muốn liệt kê xem có tất cả bao nhiêu loại "CHÓ" rồi nhốt mỗi con vào một chuồng. Hic, lấy cái ví dụ chi mà ngộ vậy không biết -+*/+-+-+-+**~**

Tác giả cũng nói rồi, tác giả liệt kê những từ tương tự với từ khóa cho trước để cấm, nên từ khóa nó "ngộ". Ngộ mới cấm chứ?

Tôi thấy nhiều diễn đàn cấm từ khóa nọ (mang nghĩa tục), thế là thành viên viết trệch đi tránh bị kiểm duyệt tự động. Thí dụ thành viên viết "éo", thế là lọt lưới.

Việc này kể như vô ích thôi, vì thí dụ cấm chó, Chó, cHó, .. các loại, người ta viết thêm khoảng trắng vào thành "ch ó" hoặc
"c hó" là qua phà.
 
Lần chỉnh sửa cuối:
Upvote 0
Việc này kể như vô ích thôi, vì thí dụ cấm chó, Chó, cHó, .. các loại, người ta viết thêm khoảng trắng vào thành "ch ó" hoặc
"c hó" là qua phà.

- Nếu cấm con "Chó" thì phải cấm luôn con "Cầy"
- Nếu cấm con "Cầy" thì phải cấm luôn con "Cẩu"
- vân vân...
- Và cũng có thể cấm luôn bánh "Hot dog"
Ẹc... Ẹc...
 
Upvote 0
- Nếu cấm con "Chó" thì phải cấm luôn con "Cầy"
- Nếu cấm con "Cầy" thì phải cấm luôn con "Cẩu"
- vân vân...
- Và cũng có thể cấm luôn bánh "Hot dog"
Ẹc... Ẹc...
Theo tui còn phải "cấm" thêm mấy thứ nhìn gần giống "Chó" như Cho, Chọ, Chỏ, Chõ, Chò....
Và các từ có thể hiểu là "Chó" như "Ché đỏ", "Chức mọ"....
Híc!
 
Upvote 0
Theo tui còn phải "cấm" thêm mấy thứ nhìn gần giống "Chó" như Cho, Chọ, Chỏ, Chõ, Chò....
Và các từ có thể hiểu là "Chó" như "Ché đỏ", "Chức mọ"....
Híc!

Em thấy cấm như thế hết cũng chưa hẳn là được vì các bạn hiện nay rất là thông minh trong cách dùng từ ngữ ám chỉ "bậy"... Nếu cấm thế vậy phải nghĩ luôn đến từ "dog" hay vui vui là "dog die" vậy. Nói chung hình thức cấm cũng chỉ là phương pháp tạm thời ứng phó và cái chính là ở ý thức của mỗi con người.
 
Upvote 0
Em thấy cấm như thế hết cũng chưa hẳn là được vì các bạn hiện nay rất là thông minh trong cách dùng từ ngữ ám chỉ "bậy"... Nếu cấm thế vậy phải nghĩ luôn đến từ "dog" hay vui vui là "dog die" vậy. Nói chung hình thức cấm cũng chỉ là phương pháp tạm thời ứng phó và cái chính là ở ý thức của mỗi con người.
Chỉ mỗi cái Ucase() hay Lcase() mà hổng chịu nên "lòi" ra đủ thứ thôi.
 
Upvote 0
Em thấy cấm như thế hết cũng chưa hẳn là được vì các bạn hiện nay rất là thông minh trong cách dùng từ ngữ ám chỉ "bậy"... Nếu cấm thế vậy phải nghĩ luôn đến từ "dog" hay vui vui là "dog die" vậy. Nói chung hình thức cấm cũng chỉ là phương pháp tạm thời ứng phó và cái chính là ở ý thức của mỗi con người.

Chỉ cần đội ngũ MOD/ SMOD luôn luôn túc trực ở diễn đàn như Diễn đàn Giải pháp Excel của chúng ta thì "Chó chết" hay "chó sống" cũng cho vào "cầy tơ 7 món" hết!
 
Upvote 0
Cảm ơn anh đã góp ý, nhưng trình của em thì bó tay.

Hic, nếu em pro vậy. Có thể can thiệp và chỉnh lại mã nguồn của nó thì cần gì em phải lấy excel làm trung gian anh?

Đối với tôi, Excel là công cụ làm việc chứ không phải trò chơi cho nên tôi chỉ code những bài có thể để giành dùng sau này. Những trường hợp có thể thiết kế hiệu quả hơn thì tôi không phí công code. Vì vậy trước đây tôi chỉ gợi ý về kỹ thuật cho bạn từ tìm giải thuật lấy.

Tuy nhiên, xét lại kỹ thuật nhị phân ở trình độ toán cho nên tôi diễn thêm cho bạn rõ:

- Chữ hoa ra thường ứng với 2 trạng thái, trạng thái hoa (0) và thường (1) của hệ nhị phân
- Vậy một chuỗi bit có thể dùng để diễn tả trạng thái hoa và thường của từng ký tự trong một từ. Ví dụ trạng thái của từ "cHó" có thể diễn tả là 101. Trị thập phân của 101 là 5.
- Long integer dài 32 bit. Nếu dùng một số long thì ta có thể sử lý được chuỗi 31 ký tự (bit đầu tiên dùng diễn tả dấu, không nên đụng vào)
- Như vậy nếu bạn xét bit của các số từ 0 đến 2^(độ dài từ)-1 thì có thể tìm được các kiểu viết hoa/thường của từ.

Bài toán này viết bằng C rất hiệu quả vì C có phép toán dịch bit, nhưng tôi không chắc trong VBA

Nếu bạn cho rằng trình của bạn không đủ để viết code này thì nên quên đi. Bản thân thuật toán vét cạn rắc rối như vậy đó!
 
Upvote 0
Dựa vào thuật toán xét dãy bit của anh VetMini, em xây dựng code như sau (với ô A1 của Sheet1 là ô chứa chuỗi gốc):
[GPECODE=vb]Sub Test()
Dim i As Long, j As Long, S As String, Tem As String, S1 As String
Sheet1.[A2:A65536].Clear
S = Sheet1.[A1]
For i = 0 To 2 ^ Len(S) - 1
Tem = WorksheetFunction.Dec2Bin(i, Len(S))
S1 = ""
For j = 1 To Len(S)
S1 = S1 & IIf(Mid(Tem, j, 1) = 1, UCase(Mid(S, j, 1)), LCase(Mid(S, j, 1)))
Next
Sheet1.[A65536].End(xlUp).Offset(1) = S1
Next
End Sub[/GPECODE]
Do hạn chế của hàm Dec2Bin nên code trên chỉ đáp ứng với chiều dài chuỗi không vượt quá 9 ký tự.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh đã góp ý, nhưng trình của em thì bó tay.

Hic, nếu em pro vậy. Có thể can thiệp và chỉnh lại mã nguồn của nó thì cần gì em phải lấy excel làm trung gian anh?

Vậy thì phải trị tận gốc, đó là bạn gửi mã nguồn đó lên đây hoặc đến đúng diễn đàn chuyên về ngôn ngữ của code đó để hỏi - Không ai list như bạn thế thì bao nhiêu tổ hợp cho hết với chuỗi ký tự dài.

Theo tui được biết, thì mọi xử lý văn bản trong các code chuyên thì đều xét đến việc ký tự HOA / thường rùi --> nên check lại đi có khi nó đã có tính năng đó rùi.
 
Upvote 0
Do hạn chế của hàm Dec2Bin nên code trên chỉ đáp ứng với chiều dài chuỗi không vượt quá 9 ký tự.

Ai biểu xài WorksheetFunction làm chi. Tự xây dựng hàm Dec2Bin cũng được vậy:
Mã:
Function D2B(ByVal Num As Long, Optional ByVal Places As Long = 1) As String
  Dim qt As Long, rd As Long, Tmp As String
  qt = Num
  Do
    rd = qt Mod 2
    qt = Int(qt / 2)
    Tmp = rd & Tmp
  Loop Until qt = 0
  D2B = Format(Val(Tmp), String(Places, "0"))
End Function
 
Upvote 0
Có khi chỉ cần copy 1 đoạn code lên đây, người nào biết sẽ cho biết nó viết bằng ngôn ngữ gì, sử dụng hàm nào tương tự UCase là giải quyết xong từ đời nào.
 
Upvote 0
Có khi chỉ cần copy 1 đoạn code lên đây, người nào biết sẽ cho biết nó viết bằng ngôn ngữ gì, sử dụng hàm nào tương tự UCase là giải quyết xong từ đời nào.
Đúng vậy, ví dụ như giải quyết trên VBA thì thay vì liệt kê tất cả các tổ hợp ký tự đó thì chỉ cần 1 hàm UCase hoặc LCase.
Theo như ý tưởng của tác giả:
Ý mình là mình dùng một mã nguồn có sẵn, nên không thể code thành viết hoa hết hoặc viết thường hết để xưỷ lý. Nên mình mới nghĩ ra là dùng excel làm công cụ để tính ra tất cả các trường hợp, sau đó copy và paste vào code đó thôi.
Chẳng hạn chuỗi gốc có 10 ký tự thì đã có tới 2^10=1024 kết quả có thể có, lấy 1024 tổ hợp ấy mà dán vào code của ngôn ngữ kia thì không biết code ấy nó dài tới cỡ nào nhỉ?!
 
Upvote 0
Dựa vào thuật toán xét dãy bit của anh VetMini, em xây dựng code như sau (với ô A1 của Sheet1 là ô chứa chuỗi gốc):
[GPECODE=vb]Sub Test()
Dim i As Long, j As Long, S As String, Tem As String, S1 As String
Sheet1.[A2:A65536].Clear
S = Sheet1.[A1]
For i = 0 To 2 ^ Len(S) - 1
Tem = WorksheetFunction.Dec2Bin(i, Len(S))
S1 = ""
For j = 1 To Len(S)
S1 = S1 & IIf(Mid(Tem, j, 1) = 1, UCase(Mid(S, j, 1)), LCase(Mid(S, j, 1)))
Next
Sheet1.[A65536].End(xlUp).Offset(1) = S1
Next
End Sub[/GPECODE]
Do hạn chế của hàm Dec2Bin nên code trên chỉ đáp ứng với chiều dài chuỗi không vượt quá 9 ký tự.

Sẵn code chơi cho vui. Thực ra phép duyệt bit của số integer giản dị hơn, không cần phải dùng hàm chuyển

Mã:
S = Ucase([A1].Text) ' chuỗi ký tự, dạng hoa tất cả
L = Len(S) ' độ dài chuỗi
for i = 0 to 2^L - 1 ' lần lượt tìm tổ hợp hoa và thường
  kieu(i) = S ' kiểu thứ i
  for j = 1 to L
    if (i and 2^(j-1)) then MID(kieu(i),j,1) = Lcase(MID(S,j,1)) ' nếu bit set thì đổi ra ký tự thường
  next J
next i
' lưu ý là trong đoạn code trên, con toán 2^(j-1) bị lặp lại nhiều lần. Nếu muốn nhanh thì tinh trước thành 1 mảng.
 
Lần chỉnh sửa cuối:
Upvote 0
Sẵn code chơi cho vui. Thực ra phép duyệt bit của số integer giản dị hơn, không cần phải dùng hàm chuyển

Mã:
S = Ucase([A1].Text) ' chuỗi ký tự, dạng hoa tất cả
L = Len(S) ' độ dài chuỗi
for i = 0 to 2^L - 1 ' lần lượt tìm tổ hợp hoa và thường
  kieu(i) = S ' kiểu thứ i
  for j = 1 to L
    if (i and 2^(j-1)) then MID(kieu(i),j,1) = Lcase(MID(S,j,1)) ' nếu bit set thì đổi ra ký tự thường
  next J
next i
' lưu ý là trong đoạn code trên, con toán 2^(j-1) bị lặp lại nhiều lần. Nếu muốn nhanh thì tinh trước thành 1 mảng.

Code này còn phải chỉnh lại rất nhiều
Ví dụ trường hợp cell A1 = "tá tràng", code chạy chính xác phải ra 128 trường hợp nhưng code trên lại ra 256 trường hợp
-------------------------------------------
Nói chung, trường hợp mà UCase(ký tự) = LCase(Ký tự) (ký tự number chẳng hạn) thì phải bỏ qua, nếu không sẽ bị thừa rất nhiều
 
Upvote 0
Code này còn phải chỉnh lại rất nhiều
Ví dụ trường hợp cell A1 = "tá tràng", code chạy chính xác phải ra 128 trường hợp nhưng code trên lại ra 256 trường hợp
-------------------------------------------
Nói chung, trường hợp mà UCase(ký tự) = LCase(Ký tự) (ký tự number chẳng hạn) thì phải bỏ qua, nếu không sẽ bị thừa rất nhiều

Tuấn chỉ có kết quả "khiêm tốn" 256 vì "tá tràng" của Tuấn là unicode dựng sẵn. Kết quả được nhân đôi vì có 1 ký tự dấu cách. Vì mỗi kết quả được nhân đôi. Vd. "tá trànG" có lần 1 với bit 0 ở vị trí dấu cách, ở lần 2 với bít 1 ở vị trí dấu cách. Ví dụ "11110010" và "11010010" là 2 "tá tràng" y hệt nhau.

Nếu Tuấn có "tá tràng" unicode tổ hợp thì Len(s) = 10, tức kết quả sẽ là 1024 chứ không khiêm tốn như 256

Bây giờ nếu ai có chuỗi unicode tổ hợp mà nó lại có nhiều dấu cách thì kết quả được nhân lên gấp bội.
 
Upvote 0
Code này còn phải chỉnh lại rất nhiều
Ví dụ trường hợp cell A1 = "tá tràng", code chạy chính xác phải ra 128 trường hợp nhưng code trên lại ra 256 trường hợp
-------------------------------------------
Nói chung, trường hợp mà UCase(ký tự) = LCase(Ký tự) (ký tự number chẳng hạn) thì phải bỏ qua, nếu không sẽ bị thừa rất nhiều

Đúng vậy, code trên rất thô. Tôi chỉ dùng làm ví dụ giải thích cách duyệt bit thôi.
Cách duyệt dựa trên lý thuyết đại số tổ hợp luỡng nghi (0/1). Lý thuyết này đặt điều kiện là các phần tử trong tập hợp (không gian vec tơ) có tính chất 0/1. Nếu trong tập hợp có phần tử trung tính (không phân biệt 0-1) thì phần tử này được coi là ngoại lệ và tập hợp không còn là tập hợp đóng. Khi môi trường có chứa nhiều phần tử ngoại lệ thì bài toán áp dụng cho tập hợp kín không còn hiệu quả.
Tóm lại, nếu chuỗi chứa nhiều ký tự trung tính thì giải thuật bit mapping không áp dụng hữu hiệu.
 
Upvote 0
Tuấn chỉ có kết quả "khiêm tốn" 256 vì "tá tràng" của Tuấn là unicode dựng sẵn.=.
Thì ai mà chẳng có TÁ TRÀNG hả anh?
Đúng là em mới liếc sơ qua cái "tá tràng" đó thôi, anh nhắc mới nhớ còn có loại TÁ TRÀNG TỔ HỢP nữa
Kiết thật!
Ẹc... Ẹc...
 
Upvote 0

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

Back
Top Bottom