셀에서 특수 문자를 식별하는 Excel 수식이 있습니까?


13

대괄호, 콜론, 세미콜론, 쉼표 등의 특수 문자를 제거하기 위해 파일 이름을 수동으로 제거해야하는 약 3500 개의 문서가 있습니다.

Excel에 덤프 한 텍스트 파일이 있으며 특수 문자가 포함 된 경우 파일 이름을 수정하도록 플래그를 지정하는 열을 만들려고합니다. 의사 코드 수식은

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

대소 문자에 관계없이 AZ, 0-9,-또는 _ 이외의 문자가 포함 된 경우 행에 플래그를 지정합니다.

누구든지 나를 위해 일할 수있는 것을 알고 있습니까? if빠르고 쉬운 것이 있다면 코드 작성과 대규모 진술에 주저합니다 .


Excel에서이 텍스트 처리 작업을 수행하는 특별한 이유가 있습니까? 자신을 Microsoft Office 도구로 제한하더라도 Word에서 검색 및 바꾸기가 매우 간단합니다. 원래 파일 이름과 처리 된 파일 이름이라는 두 개의 열이있는 테이블입니다.
mpez0

타사 소프트웨어의 색인 항목입니다. 이 소프트웨어는 콜론, 괄호, 앰퍼샌드 등을 포함하는 파일 이름을 출력하므로 변환 프로그램에서 예외가 발생합니다. 변환하기 전에 타사 소프트웨어의 데이터를 삭제해야합니다. 공급 업체는 해당 작업을 자동화하기위한 API를 제공하지 않습니다. 텍스트 파일에 파일 이름 목록이 있습니다. Excel을 사용하여 파일 이름에 특수 문자가 있는지에 따라 플래그를 만듭니다. 특수 문자가 연산자로 해석되므로 Powershell, c # 및 Java가 부정확 한 결과를 반환합니다.
dwwilson66

1
아마 당신이 이것에 대해 잘못된 도구를 사용하고 있다고 지적하고 싶습니다. 예를 들어 메모장 ++ 에서이 작업을 매우 빠르게 수행하는 몇 가지 방법을 생각할 수 있습니다. 마지막에 결과를 Excel로 가져올 수도 있고 1과 0의 열을 가질 수도 있습니다.
Dane

@Dane NP ++에 대해 잘 알고 있습니다. 나는 그것을 탐구해야 할 것이다. 도구가 설치되어 있지만 경험이 많지 않습니다. 팁 고마워.
dwwilson66

답변:


19

코드가 없습니까? 그러나 너무 짧고 쉽고 아름답고 ... :(

RegEx 패턴 [^A-Za-z0-9_-]은 모든 셀에서 모든 특수 문자를 제거하는 데 사용됩니다.

Sub RegExReplace()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True

    RegEx.Pattern = "[^A-Za-z0-9_-]"
    For Each objCell In ActiveSheet.UsedRange.Cells
        objCell.Value = RegEx.Replace(objCell.Value, "")
    Next

End Sub

편집하다

이것은 내가 당신의 원래 질문에 도달 할 수있는 한 가깝습니다.

여기에 이미지 설명을 입력하십시오

두 번째 코드는 =RegExCheck(A1,"[^A-Za-z0-9_-]")2 개의 인수가 있는 사용자 정의 함수 입니다. 첫 번째는 확인할 셀입니다. 두 번째는 확인할 RegEx 패턴입니다. 패턴이 셀의 문자와 일치하면 1을 리턴하고 그렇지 않으면 0을 리턴합니다.

먼저 ALT+로 VBA 편집기를 열고 F11모듈 (!)을 삽입하고 아래 코드를 붙여 넣으면 다른 일반 Excel 수식과 같이 사용할 수 있습니다 .

Function RegExCheck(objCell As Range, strPattern As String)

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True
    RegEx.Pattern = strPattern

    If RegEx.Replace(objCell.Value, "") = objCell.Value Then
        RegExCheck = 0
    Else
        RegExCheck = 1
    End If

End Function

RegEx를 처음 사용하는 사용자의 경우 패턴을 설명하겠습니다. [^A-Za-z0-9_-]

[] stands for a group of expressions
^ is a logical NOT
[^ ] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)

문제는 문자를 교체하고 싶지 않고 목록에 문자를 표시하여 다른 사람에게 전달할 수 있다는 것입니다. 파일 이름은 타사 소프트웨어에 의해 생성되며 해당 프로그램 내에서 수동으로 변경해야합니다 ... 예 또는 아니오로 플래그를 지정하면됩니다. 즉, 대체 코드를 수정하여 열에 플래그를 지정할 수 있다고 생각합니다. :)
dwwilson66

이것을 구현하기 위해 ... 새로운 모듈로 잘라 붙여 넣는 것만으로도 절약됩니다. 아니면 다른 것을해야합니까? 공식 =RegExReplace(cell)이 인식되지 않습니다 .... 나는 새로운 기능을 만드는 데 약간 녹슨입니다.
dwwilson66

@ dwwilson66 업데이트!
nixda

정규식 내부 하이픈에 대한 강조 (이것은 잘못된 위치에 있다면이 기호는 패턴을 나누기)
레드 완두콩

7

nixda의 코드와 유사한 것을 사용하여 셀에 특수 문자가있는 경우 1을 반환하는 사용자 정의 함수가 있습니다.

Public Function IsSpecial(s As String) As Long
    Dim L As Long, LL As Long
    Dim sCh As String
    IsSpecial = 0
    For L = 1 To Len(s)
        sCh = Mid(s, L, 1)
        If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
        Else
            IsSpecial = 1
            Exit Function
        End If
    Next L
End Function

UDF (사용자 정의 함수)는 설치 및 사용이 매우 쉽습니다.

  1. ALT-F11은 VBE 창을 엽니 다
  2. ALT-I ALT-M은 새로운 모듈을 엽니 다
  3. 내용을 붙여 넣고 VBE 창을 닫습니다.

통합 문서를 저장하면 UDF도 함께 저장됩니다. 2003 년 이후 Excel 버전을 사용하는 경우 파일을 .xlsx가 아닌 .xlsm으로 저장해야합니다.

UDF를 제거하려면 다음을 수행하십시오.

  1. 위와 같이 VBE 창을 엽니 다
  2. 코드를 지우다
  3. VBE 창을 닫습니다

Excel에서 UDF를 사용하려면

= 특별 (A1)

일반적으로 매크로에 대한 자세한 내용은 다음을 참조하십시오.

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

UDF 관련 사항

이 기능을 사용하려면 매크로를 활성화해야합니다 !


"_"를 별도의 Or 품목으로 사용한 이유는 무엇입니까? 같은 [] 그룹에 포함될 수 있습니다
jstuardo

@jstuardo 밑줄 이 유효한 문자 임을 분명히하기 위해서만 .
게리의 학생

If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Then매크로가 공백이 유효한 문자라고 가정하도록 코드를 업데이트해서는 안 됩니까?
난소 랩터

@Ovaryraptor 당신이 맞습니다! 내일 업데이트하겠습니다.
게리의 학생

2

다음은 레코드에 특수 문자를 표시하는 조건부 서식 솔루션입니다.

아래의 (매우 긴) 수식을 사용하는 데이터에 새로운 조건부 서식 규칙을 적용하면됩니다. 여기서 A1파일 이름 열의 첫 번째 레코드는 다음과 같습니다.

=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)

이 수식은 각 파일 이름의 각 문자를 확인하고 해당 ASCII 코드가 허용되는 문자 값을 벗어나는지 확인합니다. 불행히도, 허용되는 문자 코드가 모두 연속적이지는 않기 때문에 수식에서 SUMPRODUCTs의 합을 사용해야 합니다. 수식은 잘못된 문자 수를 반환합니다. 0보다 큰 값을 반환하는 모든 셀에 플래그가 지정됩니다.

예: 여기에 이미지 설명을 입력하십시오


1

특수 문자를 찾기 위해 다른 접근법을 사용했습니다. 허용되는 각 문자에 대해 새 열을 만든 다음 다음과 같은 수식을 사용하여 허용 된 문자가 각 행 항목 (Z2)에 몇 번 있었는지 계산했습니다.

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

그런 다음 각 행에서 허용되는 문자 수를 합한 다음 행 항목의 총 길이와 비교했습니다.

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

마지막으로 마지막 열 (BF2)을 기준으로 음수 값을 찾아서 수정이 필요한 열로 연결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.