Xóa ký tự đặc biệt trong Excel VBA

S

Oberlander

hội đồng quản trị thường xuyên

Đã tham gia25/11/2020Messages136Phiên bản Office

  1. 365
Nền tảng
  1. các cửa sổ

  • 23 Tháng hai, 2022
  • #1

Tôi có một macro lưu tệp excel của mình và đặt tên tệp dựa trên ô đã chọn, tuy nhiên, thường có những ký tự không thể là một phần của tên tệp. Tôi chỉ muốn xóa các ký tự đó và tiến hành lưu. Có thể có dấu gạch chéo và/hoặc dấu hai chấm và các ký tự đặc biệt khác trong ô đã chọn, tuy nhiên tôi không biết vị trí của nó vì nó thay đổi.
Tôi có thể làm điều này như thế nào?

Ví dụ ngẫu nhiên.
Ô được chọn chứa "Sample 1/1/22. Sẵn sàng"
Tôi muốn tên tệp của mình chứa "Sample 1122 Ready"
hoặc có thể thay thế các ký tự đặc biệt bằng dấu gạch dưới để tôi nhận được "Sample 1_1_22_ ​​Ready".

 

Xóa ký tự đặc biệt trong Excel VBA

lrobo314

Thành viên nổi tiếng

JoinedJul 14, 2008Messages3,605Phiên bản Office

  1. 365
Nền tảng
  1. các cửa sổ

  • 23 Tháng hai, 2022
  • #2

Đây là một hàm theo mặc định sẽ thay thế các ký tự không hợp lệ bằng các chuỗi có độ dài bằng 0. Nó cũng có một đối số thứ hai tùy chọn cho phép bạn thay thế các ký tự không hợp lệ bằng bất kỳ ký tự nào bạn muốn.

Chuyến bay đến Sân bay Mexicali của OTM năm 2022 hàng tuần (phiên bản 1). xlsbAB35Mẫu 1/1/22. ReadySample 1122 Ready36Sample 1/1/22. Mẫu sẵn sàng 1_1_22_ ​​Sẵn sàng

Tờ4

Cell FormulasRangeFormulaB35B35=NoSpec(A35)B36B36=NoSpec(A36,"_")



Mã VBA

Function NoSpec(s As String, Optional r As String)
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[<>:""\/\|?*]"
    NoSpec = .Replace(s, IIf(Len(r) > 0, r, ""))
End With
End Function

 

Dung dịch

S

Oberlander

hội đồng quản trị thường xuyên

Đã tham gia25/11/2020Messages136Phiên bản Office

  1. 365
Nền tảng
  1. các cửa sổ

  • 23 Tháng hai, 2022
  • #3

Tuyệt vời.
Vì vậy, tôi đã thực hiện fn = NoSpec(ActiveCell, "_") và mã của tôi không còn dừng do tên tệp không hợp lệ nữa.

 

  • Xóa ký tự đặc biệt trong Excel VBA

Mike Wolfe

Ngày 23 tháng 12 năm 2021 3 phút đọc

Xóa ký tự đặc biệt trong Excel VBA

Hàm sau sẽ xóa các ký tự đặc biệt khỏi chuỗi trong VBA

Mật mã

Hãy xem bài viết của tôi về các bài kiểm tra tài liệu lấy cảm hứng từ Python nếu bạn quan tâm đến ký hiệu '>>> trong tiêu đề hàm bên dưới. Những tuyên bố sử dụng mẫu đó trong các nhận xét có thể được kiểm chứng bằng một cuộc gọi đến thủ tục DocTests của tôi

'---------------------------------------------------------------------------------------
' Procedure : StripSpecChars
' DateTime  : 9/28/2007 - 12/23/2021
' Author    : Mike Wolfe
' Source    : https://nolongerset.com/stripspecchars/
' Purpose   : This function strips special characters from a string.
'---------------------------------------------------------------------------------------
'>>> StripSpecChars("Some Text to strip: Numbers 1-42!")
'Some Text to strip Numbers 142
'>>> StripSpecChars("Some Text to strip: Numbers 1-42!", False, False, "-:")
'SomeTexttostrip:Numbers-
'>>> StripSpecChars("Some Text to strip: Numbers 1-42!", False, True, "!", "_")
'Some_Text_to_strip__Numbers_1_42!
'>>> StripSpecChars("Some Text to strip: Numbers 1-42!", False, True, "", ".^.")
'Some.^.Text.^.to.^.strip.^..^.Numbers.^.1.^.42.^.
'
Function StripSpecChars(TextToStrip As String, _
                        Optional AllowSpaces As Boolean = True, _
                        Optional AllowNums As Boolean = True, _
                        Optional WhiteList As String = vbNullString, _
                        Optional ReplacementText As String = vbNullString) As String

    StripSpecChars = TextToStrip
    
    Dim TextLength As Long
    TextLength = Len(TextToStrip)
    
    Dim i As Long
    i = 1
    Do While i <= TextLength
        Dim CurrChar As String
        CurrChar = Mid(StripSpecChars, i, 1)
        If (CurrChar < "A" Or CurrChar > "z") And _
           (Not IsNumeric(CurrChar) Or Not AllowNums) And _
           (CurrChar <> " " Or Not AllowSpaces) And _
           (Not CurrChar Like "[" & WhiteList & "]") Then
            StripSpecChars = Left(StripSpecChars, i - 1) & ReplacementText & Right(StripSpecChars, TextLength - i)
            TextLength = TextLength - 1 + Len(ReplacementText)
            i = i + Len(ReplacementText)
        Else
            i = i + 1
        End If
    Loop

End Function

Cách sử dụng

Sử dụng cơ bản

Ở mức cơ bản nhất, bạn chỉ cần truyền vào hàm một chuỗi và nó sẽ trả về cùng một chuỗi với bất kỳ ký tự đặc biệt nào bị loại bỏ

Xóa ký tự đặc biệt trong Excel VBA

Thay thế khoảng trắng bằng dấu gạch dưới

Thông thường, bạn sẽ muốn giữ lại khoảng cách chữ cái để dễ đọc nhưng loại bỏ khoảng trắng. Điều đó rất dễ thực hiện bằng cách đặt tham số AllowSpaces tùy chọn thành Sai và tham số Văn bản thay thế thành ký tự gạch dưới

Xóa ký tự đặc biệt trong Excel VBA

Thay thế TẤT CẢ các ký tự đặc biệt

Nếu bạn muốn giới hạn đầu ra chỉ ở các chữ cái (không có dấu cách hoặc số), bạn cũng có thể làm điều đó

Xóa ký tự đặc biệt trong Excel VBA

Cho phép một số ký tự đặc biệt

Nếu có một vài ký tự đặc biệt mà bạn muốn cho phép đi qua thì sao?

Xóa ký tự đặc biệt trong Excel VBA

cân nhắc địa phương

Tôi chỉ từng sử dụng điều này với cài đặt ngôn ngữ tiếng Anh Mỹ. Điều đó nói rằng, nó nên Just Work™ trong hầu hết các trường hợp vì nó dựa trên cài đặt So sánh tùy chọn mà bạn đang sử dụng trong mã của mình. Bản thân các cài đặt đó dựa trên trang mã hiệu quả của hệ thống hoặc cài đặt ngôn ngữ.  

Kiểm tra liên kết So sánh cài đặt tùy chọn ở trên để biết chi tiết

Cân nhắc hiệu suất

Mã này không dành cho sử dụng với các chuỗi rất lớn (100 nghìn ký tự trở lên).  

Đoạn mã lặp qua chuỗi từng ký tự một và cũng tạo lại chuỗi mới từng ký tự một. Thời gian xử lý không đáng kể đối với các chuỗi lên tới vài nghìn ký tự. Tuy nhiên, nó bắt đầu chậm lại với hơn 100 nghìn chuỗi ký tự

Bài viết tham khảo

Các bài kiểm tra tài liệu lấy cảm hứng từ Python trong VBA

Kiểm tra tài liệu không phải là sự thay thế cho kiểm tra đơn vị hoặc tích hợp. Nhưng chúng mang lại lợi tức đầu tư (ROI) tốt nhất so với bất kỳ loại thử nghiệm nào, chủ yếu là do nỗ lực viết chúng gần như bằng không