한컴 스크립트 매크로 관련 문의 드립니다.

안녕하세요. 현재 아래와 같은 매크로를 만들려고 합니다만 처음이기도 하고 어디서 배울지도 잘 모르겠는 차에 이 곳을 알게되어 질문글 남겨봅니다.

현재 만드려는 스크립트는

A라는 텍스트가 있을 경우 A가 있는 마지막 페이지(여러개 있을 경우 마지막)를 찾아 그 위에 존재하는 모든 페이지 삭제
A가 존재하지 않을 경우 B를 찾아 위와 같은 작업을 처리
이후 C를 찾아 C가 있는 페이지 아래 페이지를 모두 삭제

이것을 하려합니다. 즉 문서를 위 아래로 잘라서 문서의 원하는 부분만 남기고 싶습니다.
API가 있다고 하여 사용해보려 하였으나 환경상 사용이 어려워
매크로 파일로 만들어서 문서 자체에 사용하는 것이 좋겠다 결론 내렸고
Chat gpt를 사용하고 인터넷의 여러 글들을 참조하여 매크로를 작성해 보았으나 정상적으로 작동되지 않고있습니다.

혹여 보시고 잘못된 부분이있다면 알려주시기 바랍니다.

가능하다면 정상작동하는 스크립트 예시를 주시면 제가 실험해보고 그것을 토대로 공부해보도록 하겠습니다.

감사합니다.

function OnScriptMacro_script5()
{
    // 문서의 시작으로 이동
    HAction.Run("MoveDocBegin");

    // "(수정안 포함)" 찾기
    HAction.GetDefault("Find", HParameterSet.HFindReplace.HSet);
    HParameterSet.HFindReplace.FindString = "(수정안 포함)";  
    HParameterSet.HFindReplace.Direction = 1;  // 아래 방향 검색
    HAction.Execute("Find", HParameterSet.HFindReplace.HSet);

    // 찾았으면 그 위쪽 삭제
    if (HAction.Run("Find"))
    {
        HAction.Run("MovePageBegin");
        HAction.Run("SelectCtrlFront");
        HAction.Run("Delete");
    }
    else
    {
        // "(수정안 포함)"이 없으면 "별첨 2" 변형 버전 찾기
        for (var i = 0; i <= 4; i++)
        {
            HAction.GetDefault("Find", HParameterSet.HFindReplace.HSet);
            HParameterSet.HFindReplace.FindString = "별첨" + " ".repeat(i) + "2";  
            HParameterSet.HFindReplace.Direction = 1;
            HAction.Execute("Find", HParameterSet.HFindReplace.HSet);

            if (HAction.Run("Find"))
            {
                HAction.Run("MovePageBegin");
                HAction.Run("SelectCtrlFront");
                HAction.Run("Delete");
                break;
            }
        }
    }

    // 문서 끝으로 이동
    HAction.Run("MoveDocEnd");

    // "부      칙" 찾기 (띄어쓰기 최대 10개 허용)
    for (var i = 0; i <= 10; i++)
    {
        HAction.GetDefault("Find", HParameterSet.HFindReplace.HSet);
        HParameterSet.HFindReplace.FindString = "부" + " ".repeat(i) + "칙";  
        HParameterSet.HFindReplace.Direction = 0;  // 위쪽 방향 검색
        HAction.Execute("Find", HParameterSet.HFindReplace.HSet);

        if (HAction.Run("Find"))
        {
            HAction.Run("MovePageEnd");
            HAction.Run("SelectCtrlBack");
            HAction.Run("Delete");
            break;
        }
    }
}

이것이 제가 원하는 코드인데 문법적으로 잘못된 부분이 있는건가요?
줄수 25에서 개체가 이속성 또는 메서드를 지원하지 않는다고 뜨네요

ps. 계속확인해보니

HAction.Run("SelectCtrlFront");
HAction.Run("Delete");

이건 동작하지 않고

HAction.Run("MoveSelTopLevelBegin");  // 문서 최상단으로 이동
HAction.Run("DeleteBack");  // 위쪽 삭제

이렇게 써야 정상적으로 기능하는데

HParameterSet.HFindReplace.FindString = "별첨" + " ".repeat(i) + "2";  
HParameterSet.HFindReplace.FindString = "부" + " ".repeat(i) + "칙";  

이렇게 텍스트를 찾는부분이 문제가있는 것같아요
어떻게 수정해야할까요

1개의 좋아요

안녕하세요.

아래 동작을 한글에서 찾기/바꾸기 기능으로 수행한다면

"A라는 텍스트가 있을 경우 A가 있는 마지막 페이지(여러개 있을 경우 마지막)를 찾아 그 위에 존재하는 모든 페이지 삭제"

아래와 같은 스탭으로 실행하면 될 것 같습니다.

① 캐럿을 문서 맨 뒤로 이동
② 찾을 방향을 “위로” 설정하여 “A” 단어 찾기
③ 찾은 단어부터 문서 맨 앞까지 선택
④ 삭제

이 동작을 스크립트로 작성한다면,

function OnScriptMacro_script5()
{
	// ① 캐럿을 문서 맨 뒤로 이동
	HAction.Run("MoveDocEnd");  

	// ② 찾을 방향을 "위로" 설정하여 "A" 단어 찾기
	HAction.GetDefault("RepeatFind", HParameterSet.HFindReplace.HSet);
	with (HParameterSet.HFindReplace)
	{
		ReplaceString = "";
		FindString = "A";
		IgnoreReplaceString = 0;
		IgnoreFindString = 0;
		Direction = FindDir("Backward");
		WholeWordOnly = 0;
		UseWildCards = 0;
		SeveralWords = 0;
		AllWordForms = 0;
		MatchCase = 0;
		ReplaceMode = 0;
		ReplaceStyle = "";
		FindStyle = "";
		FindTextInPicture = 0;
		FindRegExp = 0;
		FindJaso = 0;
		HanjaFromHangul = 0;
		IgnoreMessage = 1;
		FindType = 1;
	}
	HAction.Execute("RepeatFind", HParameterSet.HFindReplace.HSet);

	// ③ 찾은 단어부터 문서 맨 앞까지 선택
	HAction.Run("MoveSelDocBegin");
	// ④ 삭제
	HAction.Run("Delete");
}

※ 위의 코드를 스크립트 작업창에 복사/붙이기 한다면 따옴표(", ') 코드값이 달라서 실행이 안될 수 있으니 참고 부탁드립니다.

위의 스크립트를 A ~ C까지 찾을 때까지 반복해서 실행하는 코드로 응용해서 작성하면 될 것 같습니다.

※ 한글에서 "매크로 정의"로 구현하고자 하는 동작을 실행하여 스크립트를 생성시켜서 로직을 만들면 좀 더 쉽게 스크립트 생성을 할 수 있을 것 같습니다.

감사합니다.

2개의 좋아요

감사합니다 주신 스크립트로 정상적으로 원하는 방향대로 처리되었습니다. 응용하여 사용하도록 하겠습니다. 정말 감사합니다.

2개의 좋아요