2012-04-17 41 views
15

Tôi muốn chia tất cả các từ trong phòng giam của tôi bằng chữ hoa, một ví dụ:Chia viết hoa chữ trong Excel

giá trị gốc:

MikeJones 
RinaJonesJunior 
MichealSamuelsLurth 

sản lượng dự kiến:

Mike Jones 
Rina Jones Junior 
Micheal Samuels Lurth 

Can này được thực hiện mà không cần sử dụng VBA?

+1

Tôi không nghĩ rằng có thể mà không sử dụng VBA. – assylias

+2

Có thể; nó chỉ là không thực tế (xem bên dưới). – Excellll

Trả lời

18

Đã thừa nhận công thức vượt trội của Excellll, giải pháp mã hiệu quả nhất sẽ là RegExp. Điều này tránh được các vòng lặp dài.

enter image description here

Function SplitCaps(strIn As String) As String 
Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
With objRegex 
    .Global = True 
    .Pattern = "([a-z])([A-Z])" 
    SplitCaps = .Replace(strIn, "$1 $2") 
End With 
End Function 
+2

Tôi đã hy vọng bạn sẽ đi cùng với một giải pháp RegEx! Nó có vẻ giống như con đường để đi. –

+1

Hiệu quả hơn nhiều! – playercharlie

+1

+ 1 :-D Tôi đồng ý với Doug. –

1

bạn phải làm điều này với VBA.

Sub insertspaces() 
Range("A1").Select 
Do 
    Row = ActiveCell.Row 
    Column = ActiveCell.Column 
    vlaue = ActiveCell.Value 
    If vlaue = "" Then Exit Do 
     Length = Len(vlaue) 
     If Length > 1 Then 
      For x = Length To 2 Step -1 
      par = Mid(vlaue, x, 1) 
      cod = Asc(par) 
      If (cod > 64 And cod < 91) Or (cod > 191 And cod < 222) Then 
      vlaue = Left(vlaue, x - 1) + " " + Mid(vlaue, x) 
      End If 
     Next 
     ActiveCell.Value = vlaue 
     End If 
    Row = Row + 1 
    Cells(Row, Column).Select 
Loop 
End Sub 
3

Vì bạn nói bạn không muốn sử dụng macro VBA nhưng vấn đề yêu cầu VBA, tôi nghĩ UDF sẽ là giải pháp tốt cho bạn. Đây là một UDF (User defined Function) mà bạn có thể sử dụng. Đặt mã này trong một mô-đun chung của cùng một tệp mà bạn có dữ liệu.

Function splitbycaps(inputstr As String) As String 

Dim i As Long 
Dim temp As String 

If inputstr = vbNullString Then 
    splitbycaps = temp 
    Exit Function 
Else 
    temp = inputstr 
    For i = 1 To Len(temp) 
     If Mid(temp, i, 1) = UCase(Mid(temp, i, 1)) Then 
      If i <> 1 Then 
       temp = Left(temp, i - 1) + " " + Right(temp, Len(temp) - i + 1) 
       i = i + 1 
      End If 
     End If 
    Next i 
    splitbycaps = temp 

End If 
End Function 

Bây giờ bạn có thể sử dụng hàm trực tiếp trong ô. Giả sử bạn có dữ liệu trong A1 -> "MikeJones" Và bạn muốn trả lời trong ô A2. Vì vậy, trong A2, bạn nhập

=splitbycaps(A1) 

Và bạn sẽ nhận được kết quả của mình. HTH.

+1

UDF chắc chắn là con đường để đi, nhưng ví dụ regexp của @brettdj dưới đây là prob hiệu quả hơn. ít nhất cái này nên bắt đầu tại char 2 –

17

Đây là giải pháp chức năng bảng tính. Nó không đẹp, nhưng nếu bạn hoàn toàn không thích sử dụng VBA, thì tôi nghĩ bạn đang mắc kẹt với những lựa chọn xấu xí mà thôi. Đối với văn bản trong A1, dán đoạn mã sau vào B1 và nhấn Ctrl + phím Shift +Nhập để nhập công thức như một công thức mảng:

=IFERROR(INDEX(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",REPLACE(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1," "&MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1)),D1),D1),D1),MIN(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",ROW(INDIRECT("A1:A"&LEN(D1)-1)),2000000),2000000),2000000))),D1) 

Tôi đã nói với bạn rằng nó xấu òm!

Và đối với tất cả nỗ lực đó, điều đó sẽ chỉ tách tên thứ nhất và thứ hai. Để chia tách nhiều hơn, hãy điền công thức sang bên phải. Ví dụ: nếu bạn có danh sách tên trong A1:A10 và bạn cho rằng hầu hết các từ trong bất kỳ tên nào là bốn, bạn có thể nhập công thức trong B1 (dưới dạng công thức mảng!), Điền vào B10, sau đó điền vào bên phải E10. Danh sách các tên phân tách của bạn sẽ là E1:E10.

sample use of formula

Nếu bạn có khuynh hướng nhảy xuống hang thỏ, sau đây là một lời giải thích ngắn gọn về những gì các công thức làm:

  1. Kiểm tra từng nhân vật để xem nếu nó nằm trong phạm vi ASCII cho chữ in hoa và không có dấu cách trước. Ký tự đầu tiên của tên bị bỏ qua.
  2. Một mảng có kích thước bằng với chiều dài của chuỗi (trừ 1) được điền như sau: Nếu tìm thấy kết quả phù hợp, chuỗi được lưu trữ với ký tự khớp được thay thế bằng dấu cách trước chính nó. Nếu không tìm thấy kết quả phù hợp, chuỗi gốc sẽ được lưu trữ.
  3. Phần tử đầu tiên từ mảng này tương ứng với một kết quả khớp được trả về. Nếu không tìm thấy kết quả phù hợp, chuỗi gốc sẽ được trả về.
+1

@DougGlancy haha ​​cảm ơn – Excellll

+0

+1 cho việc sử dụng tuyệt vời các hàm excel gốc. Không biết làm thế nào bạn đã làm nó! –

+0

@Remnant, tôi đã đăng một bài viết vào một ngày khác đã đề cập đến số tiền hợp lý của các chức năng này, được sử dụng cho một vấn đề tương tự. Nếu bạn quan tâm đến nó tại: http://yoursumbuddy.com/solving-the-npr-sunday-puzzle-3/. Tôi đã cố gắng để đặt cùng một câu trả lời cho điều này khi tôi thấy rằng Excellll đã cho tôi đánh bại bởi một dặm :). –

0

Điều này sẽ hoạt động như một hàm do người dùng xác định.

Function SplitOnCapital(str As String) As String 
    Dim letter As Byte, result As String 

    For letter = 2 To Len(str) 
     If Asc(VBA.Mid$(str, letter, 1)) < 90 Then //65 to 90 are char codes for A to Z 
      result = WorksheetFunction.Replace(str, letter, 0, " ") 
      letter = letter + 1 
     End If 
    Next letter 

    SplitOnCapital = result 
End Function 
-1
Sub caps_small() 

strIn = InputBox("Enter a string:") 

For i = 1 To Len(strIn) 

    If Mid(strIn, i, 1) Like "[A-Z]" Then 
     cap = Mid(strIn, i, 1) 
     capstr = capstr & cap 

    ElseIf Mid(strIn, i, 1) Like "[a-z]" Then 
     sml = Mid(strIn, i, 1) 
     smlstr = smlstr & sml 
    End If 
Next 

MsgBox capstr 

MsgBox smlstr 


End Sub 
Các vấn đề liên quan