programing

문자열에 대한 인쇄와 동등한 값을 얻습니다.Excel 형식

showcode 2023. 5. 20. 11:00
반응형

문자열에 대한 인쇄와 동등한 값을 얻습니다.Excel 형식

저는 스프레드시트에서 다음과 같은 공식을 작성하는 데 많은 시간을 할애하는 것 같습니다.

="some text '" & A1 & "', more text: '" & A2 &" etc."

String용 인쇄물을 사용하는 것이 훨씬 빠를 것입니다.문자열 형식 지정

=String.Format ("Some text '{0}', more text: '{1}'",A1,A2)

이와 같은 것이 Excel에 내장되어 있습니까? 아니면 CLR에 전화할 수 있습니까?

아니요, 그러나 다음을 VBA 모듈에 추가하여 단순하게 단순하게 생성할 수 있습니다.

Public Function printf(ByVal mask As String, ParamArray tokens()) As String
    Dim i As Long
    For i = 0 To ubound(tokens)
        mask = replace$(mask, "{" & i & "}", tokens(i))
    Next
    printf = mask
End Function

...

=printf("Some text '{0}', more text: '{1}'", A1, A2)

그렇지 않습니다. CONCATONATE 기능이 있습니다.

=CONCATENATE("some text '", A1, "', more text: '", A2, " etc.")

하지만 그것은 사용하는 것보다 나을 게 없습니다.&내 생각으로는

알렉스의 코드를 업데이트해서 당신이 사용할 수 있도록 했습니다.%s삽입할 때마다

다음 대신:

=printf("Some text '{0}', more text: '{1}'", A1, A2)

사용할 수 있는 항목:

=printf("Some text '%s', more text: '%s'", A1, A2) 

원작 그대로sprintf.

업데이트된 코드:

Public Function Printf(ByVal mask As String, ParamArray tokens()) As String
   Dim i As Long

   For i = 0 To UBound(tokens)          
      mask = Replace$(mask, "%s", tokens(i), , 1)
   Next

   Printf = mask

End Function

TEXT 기능을 사용할 수 있습니다.

포맷 문자열은 저처럼 셀 어딘가에 저장할 수 있습니다.

는 의가가있다의 ."BUY "#" CREDITS"내 D1 감방에서.내 A5 셀의 값은 5000입니다.하려면 사하는형된문자을표시경는우려하열용을 사용합니다.=TEXT(A5, $D$1).

셀 값을 5000 크레딧 구매로 설정합니다.

@AlexK에서 제공하는 "총알 증명" 버전은 다음을 허용합니다.

  • 토큰 이케이토printf("{0}{1}", "test {1}", 2) -> "test {1}2" (NOT "test 22")
  • 구문 위치 문printf("{}{}", "a", "b") -> "ab"
Public Function printf(ByVal mask As String, ParamArray tokens() As Variant) As String
    Dim i As Long
    For i = 0 To UBound(tokens)
        Dim escapedToken As String
        escapedToken = Replace$(tokens(i), "}", "\}") 'only need to replace closing bracket since {i\} is already invalid
        If InStr(1, mask, "{}") <> 0 Then
            'use positional mode {}
            mask = Replace$(mask, "{}", escapedToken, Count:=1)
         
        Else
            'use indexed mode {i}
            mask = Replace$(mask, "{" & i & "}", escapedToken)
        
        End If
    Next
    mask = Replace$(mask, "\}", "}")
    printf = mask
End Function

이전과 같은 사용량:

=printf("Some text '{0}', more text: '{1}'", A1, A2)

OR 위치(왼쪽에서 오른쪽)

=printf("Some text '{}', more text: '{}'", A1, A2)

@CristianBusse가 코멘트에서 지적했듯이, 이 구현은 여전히 다음과 같은 마스크에 의해 중단될 것입니다.{0\}{1}결과적으로{0}{foo}것은 아니다.{0\}{foo}해결 방법은 사용하지 않는 것입니다.\}당신의 가면 속에.


*혼합 구문 '=printf("일부 텍스트 '{}, 더 많은 텍스트: '{1}', A1, A2)'를 사용하는 경우 정의되지 않았지만 대체 항목이 왼쪽으로 이동하므로 '{2}{1}'은(는) '{0}{2}{1}'과(와) 동일하며 '{1}{1}'은(는) 원하는 작업을 수행하지 않습니다.

흥미로운 질문입니다...저도 같은 생각을 하고 있었습니다.숫자 사이의 일부 단일 부분에서 긴 문장을 잘라내지 않고 문자열을 만드는 방법.

그리고 VBA 기능을 만들고 싶지 않기 때문에(이 기능은 훨씬 더 스마트해질 것입니다), 여기 제 솔루션이 있습니다.

SUBSTITUTE(P253;O252;"A1A";1)

어디에

  • P253은 #1 레이블에 "A1A"가 있는 긴 문자열입니다.
  • O252는 #1 라벨의 값입니다.

등등...(내가 필요로 하지 않더라도) 만약 다른 가치들이...

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(P253;O251;"A1A";1);O252;"A2A";1);O253;"A2A";1)

글쎄요, #C에서도 sprintf(...%s, %s, %d...)에 대한 다중 대체 원시 함수가 있어야 한다고 생각합니다.

네, VBA 솔루션을 제공했지만 여기 비교적 새로운 람다 함수를 사용한 순수 엑셀 버전이 있습니다. VBA는 없습니다.


참고 쉼표로 구분된 인수가 있는 대체 버전을 게시했습니다.PRINTF(mask, arg1, arg2, ...)코드 리뷰에서 넘어갔지만, 저는 더 나은 새로운 옵션이 사용 가능해짐에 따라 이것을 표준적이고 최신 상태로 유지하려고 노력할 것입니다.


이를 위해 서명이 있는 명명된 함수를 만들었습니다.printf(mask, tokensArray)위치:

  • mask위치를 포함하는 형식을 지정할 문자열입니다.{}또는 색인된{i}보간 위치.
  • tokensArray1D 범위(행 또는 열), 배열(하드코딩 또는 함수에서 반환) 또는 단일 값으로 제공되는 대체할 값 집합입니다.

형식화된 문자열을 반환합니다.다음과 같은 셀에서 호출됩니다.

도구 설명

사용.

=printf("Some text '{1}', more text: '{2}'", A1:A2) //continuous 1D row/col
=printf("Some text '{1}', more text: '{2}'", {"foo","bar"}) //hardcoded array
=printf("Single Value {1}", "foo")

또는 위치 알람이 있는 경우(왼쪽에서 오른쪽

=printf("Some text '{}', more text: '{}'", A1:A2)

이름 관리자에 두 기능을 입력하여 다음과 같이 정의합니다(자세한 지침은 LAMDA 함수 MSDN 문서를 참조하십시오. 이 링크는 비활성화되지만...).

PARAM. 가치
이름. 반복형 바꾸기
범위 워크북
댓글 토큰 목록에서 {} 또는 {i}을(를) 토큰으로 재귀적으로 대체하고, 결과 문자열에 }을(를) 하나씩 남깁니다.
참조 대상 =LAMBDA(mask,tokens,i,tokenCount, IF(i >tokenCount, mask, LET(token, INDEX(tokens,i),escapedToken,SUBSTITUTE(token,"}", "\}"),inIndexedMode,ISERROR(FIND("{}",mask,1)),substituted, IF(inIndexedMode, SUBSTITUTE(mask,"{"&i&"}", escapedToken),SUBSTITUTE(mask, "{}", escapedToken,1) ),ReplaceRecursive(substituted,tokens,i+1,tokenCount))))
=LAMBDA(
    mask,
    tokens,
    i,
    tokenCount,
    IF(
        i > tokenCount,
        mask,
        LET(
            token,
            INDEX(
                tokens,
                i
            ),
            escapedToken,
            SUBSTITUTE(
                token,
                "}",
                "\}"
            ),
            inIndexedMode,
            ISERROR(
                FIND(
                    "{}",
                    mask,
                    1
                )
            ),
            substituted,
            IF(
                inIndexedMode,
                SUBSTITUTE(
                    mask,
                    "{" & i & "}",
                    escapedToken
                ),
                SUBSTITUTE(
                    mask,
                    "{}",
                    escapedToken,
                    1
                )
            ),
            ReplaceRecursive(
                substituted,
                tokens,
                i + 1,
                tokenCount
            )
        )
    )
)
PARAM. 가치
이름. printf
범위 워크북
댓글 printf(mask: str, tokensArray: {array,} | range | str ) -> str | mask: 토큰을 "Hello {}" 또는 "Hello {2}, {1}"(1-indexed)로 대체할 문자열 | 토큰 배열: 1D 범위 또는 토큰 배열(예: "world" 또는 "fo", "bar" 또는 A1: A1:A5
참조 대상 =LAMBDA(mask,tokensArray,LET(r,ROWS(tokensArray), c, COLUMNS(tokensArray), length, MAX(r,c), IF(AND(r>1, c>1), "tokensArray must be 1 dimensional", SUBSTITUTE(ReplaceRecursive(mask, tokensArray, 1, length), "\}","}"))))
=LAMBDA(
    mask,
    tokensArray,
    LET(
        r,
        ROWS(
            tokensArray
        ),
        c,
        COLUMNS(
            tokensArray
        ),
        length,
        MAX(
            r,
            c
        ),
        IF(
            AND(
                r > 1,
                c > 1
            ),
            "tokensArray must be 1 dimensional",
            SUBSTITUTE(
                ReplaceRecursive(
                    mask,
                    tokensArray,
                    1,
                    length
                ),
                "\}",
                "}"
            )
        )
    )
)

엑셀의 람다 함수를 더 쉽게 작성할 수 있도록 개선될 것입니다. 하지만 저는 이 재귀적인 접근법이 좋다고 생각합니다.

언급URL : https://stackoverflow.com/questions/17233701/obtaining-the-equivalent-to-printf-or-string-format-in-excel

반응형