2012-06-11 59 views
6

Tôi đã trawling thông qua trang sau khi trang trên Google và đây tìm kiếm một giải pháp cho yêu cầu có vẻ đơn giản, nhưng vô ích. Có ai biết một cách đáng tin cậy để chuyển đổi một chuỗi để câu trường hợp sử dụng ?Chuyển đổi viết hoa đầu câu sử dụng VBA

Lý tưởng nhất là tôi sẽ xây dựng nó thành một tiểu chứ không phải là một chức năng, vì vậy nó dễ dàng hơn để gọi từ GUI.

Để tham khảo, tôi muốn:

ĐÂY LÀ MỘT DÀI, UGLY in hoa cho câu. XIN VUI LÒNG GỬI CHO TÔI NGAY LẬP TỨC.

để trở thành:

Dưới đây là một chặng đường dài, xấu xí câu chữ hoa. Vui lòng sửa đổi tôi ngay lập tức.

Chuyển đổi thành tiêu đề Trường hợp tôi thấy cực kỳ đơn giản (vì có chức năng tích hợp sẵn) nhưng chuyển sang trường hợp câu đã chứng minh thực sự khó thực sự.

Tôi đã thử một số phương pháp sau đây nhưng đưa ra lỗi tại mỗi lần lượt:

Làm thế nào tôi có thể có được điều này để làm việc?

+1

Các liên kết đầu tiên mà bạn đã cung cấp cho các công trình như mong đợi. –

+1

Xin lỗi, nó có. Tôi đã chạy nó sai. Giải quyết với một phụ: 'ConvertToSentenceCase Sub() động vào = SentenceCase (động vào) End Sub' – seegoon

+3

Bạn nên đăng bài này như một câu trả lời (và chấp nhận nó) để những người khác có thể thấy rằng vấn đề của bạn đã được giải quyết (và cách bạn giải quyết nó), thậm chí nếu bạn tự giải quyết nó. :-) – JimmyPena

Trả lời

7

Bạn có thể sử dụng một RegExp để chạy hiệu quả hơn các phân tích

Something như thế này

Sub Tested() 
    Call ProperCaps("HERE IS A LONG, UGLY UPPERCASE SENTENCE. PLEASE AMEND ME IMMEDIATELY." & vbCrLf & "next line! now") 
End Sub 

Function ProperCaps(strIn As String) As String 
    Dim objRegex As Object 
    Dim objRegMC As Object 
    Dim objRegM As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    strIn = LCase$(strIn) 
    With objRegex 
     .Global = True 
     .ignoreCase = True 
     .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])" 
     If .test(strIn) Then 
      Set objRegMC = .Execute(strIn) 
      For Each objRegM In objRegMC 
       Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM) 
      Next 
     End If 
     MsgBox strIn 
    End With 
End Function 
+1

+ 1 Sử dụng tốt RegExp. Sẽ cần tinh chỉnh nhỏ vì nó không viết hoa chữ cái đầu tiên. –

+0

@SiddharthRout thx Sid. cập nhật được thực hiện – brettdj

+1

Điều này làm việc một giấc mơ tuyệt đối. – seegoon

1

Cảm ơn cho điều này, chút hữu ích của mã. Tại sao VB có trường hợp thích hợp và không phải là trường hợp câu rất lạ. Tôi đã tinh chỉnh nó cho mục đích của tôi, như bản gốc sẽ không viết hoa chữ đầu tiên nếu có một không gian trước mặt nó, hy vọng bạn không nhớ tôi chia sẻ vài thay đổi của tôi.

Để loại bỏ bất kỳ dấu cách không mong muốn khi bắt đầu hoặc cuối câu, tôi đã thêm một chức năng mà được gọi từ bên trên.

Public Function DblTrim(vString As String) As String 
Dim tempString As String 
tempString = vString 

Do Until Left(tempString, 1) <> " " 
    tempString = LTrim(tempString) 
Loop 
Do Until Right(tempString, 1) <> " " 
    tempString = RTrim(tempString) 
Loop 

DblTrim = tempString 

End Function 

Public Function ProperCaps(strIn As String) As String 
    Dim objRegex As Object 
    Dim objRegMC As Object 
    Dim objRegM As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    strIn = DblTrim(strIn) 

    With objRegex 
     .Global = True 
     .ignoreCase = True 
     .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])" 
     If .test(strIn) Then 
      Set objRegMC = .Execute(strIn) 
      For Each objRegM In objRegMC 
       Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM) 
      Next 
     End If 
     ProperCaps = strIn 
    End With 
End Function 

Bạn có thể gọi ProperCaps (chuỗi của bạn) để lấy lại câu với chữ cái đầu tiên là thủ đô, với tất cả các khoảng trắng bị xóa.

Bạn cũng có thể sử dụng DblTrim (Chuỗi của bạn) để xóa tất cả dấu cách ở mặt trước và sau của chuỗi (không thay đổi trường hợp câu), bất kể có bao nhiêu khoảng trắng.

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