찾기 ctrl+f 관련 질문 드립니다.

안녕하세요. ctrl+f (찾기)를 이용해서 파란색 문자열([야구])을 찾고 그 다음 복잡한 작업을 하는
매크로를 만들고 있습니다.
그런데 while문에서 막혀서 질문을 드립니다.

제가 알기로는 찾기 실행 시

HAction.Execute(“RepeatFind”, HParameterSet.HFindReplace.HSet);

는 true 값을 리턴하다가

마지막에 더 찾을 값이 없으면 false를 리턴하는 것으로 아는데

제 코드에 적용 했을때는 true 값만 리턴하여 무한 루프에 빠집니다.

찾기를 잘못 사용하고 있는 걸까요 ?

방법을 아시는 분들께 조언을 구합니다.

function OnDocument_New() {
while (findBlue()) {
HAction.Run(“MoveParaEnd”);
// false가 안 떠요 ㅠㅜ
}

}

function findBlue() {
HAction.GetDefault(“FindDlg”, HParameterSet.HFindReplace.HSet);
with (HParameterSet.HFindReplace)
{
MatchCase = 0;
AllWordForms = 0;
SeveralWords = 0;
UseWildCards = 0;
WholeWordOnly = 0;
AutoSpell = 1;
Direction = 0;
IgnoreFindString = 0;
IgnoreReplaceString = 0;
FindString = “[야구]”;
ReplaceString = “”;
FindCharShape.TextColor = RGBColor(0, 0, 255);
IgnoreMessage = 1;
HanjaFromHangul = 0;
FindJaso = 0;
FindRegExp = 0;
FindStyle = “”;
ReplaceStyle = “”;
}
HAction.Execute(“FindDlg”, HParameterSet.HFindReplace.HSet);
HAction.GetDefault(“RepeatFind”, HParameterSet.HFindReplace.HSet);
with (HParameterSet.HFindReplace) {
FindCharShape.TextColor = RGBColor(0, 0, 255);
ReplaceString = “”;
FindString = “[야구]”;
IgnoreReplaceString = 0;
IgnoreFindString = 0;
Direction = FindDir(“Forward”);
WholeWordOnly = 0;
UseWildCards = 0;
SeveralWords = 0;
AllWordForms = 0;
MatchCase = 0;
ReplaceMode = 0;
ReplaceStyle = “”;
FindStyle = “”;
FindRegExp = 0;
FindJaso = 0;
HanjaFromHangul = 0;
IgnoreMessage = 1;
FindType = 1;
}
theEnd = HAction.Execute(“RepeatFind”, HParameterSet.HFindReplace.HSet);
return theEnd;

}

안녕하세요.

작성하신 코드를 실행하면 무한 루프에 빠집니다.
스크립트로 실행하면 문서 끝까지 검색 후에 메시지 박스를 띄우지 않기 때문에
문서 끝까지 찾은 후에도 true가 반환됩니다. :thinking:

그래서 아래와 같은 방법을 제안해드립니다.
문서 끝까지 검색 후에 위치가 처음 위치로 이동하는 것을 착안하여,

function findBlue() {
    HAction.GetDefault("FindDlg", HParameterSet.HFindReplace.HSet);
    with (HParameterSet.HFindReplace)
    {
		MatchCase = 0;
		AllWordForms = 0;
		SeveralWords = 0;
		UseWildCards = 0;
		WholeWordOnly = 0;
		AutoSpell = 1;
		Direction = 0;
		IgnoreFindString = 0;
		IgnoreReplaceString = 0;
		FindString = "[야구]";
		ReplaceString = "";
		FindCharShape.TextColor = RGBColor(0, 0, 255);
		IgnoreMessage = 0;
		HanjaFromHangul = 1;
		FindJaso = 0;
		FindRegExp = 0;
		FindStyle = "";
		ReplaceStyle = "";
    }
    HAction.Execute("FindDlg", HParameterSet.HFindReplace.HSet);
    HAction.GetDefault("RepeatFind", HParameterSet.HFindReplace.HSet);
    
	with (HParameterSet.HFindReplace) {
		FindCharShape.TextColor = RGBColor(0, 0, 255);
		ReplaceString = "";
		FindString = "[야구]";
		IgnoreReplaceString = 0;
		IgnoreFindString = 0;
		Direction = FindDir("Forward");
		WholeWordOnly = 0;
		UseWildCards = 0;
		SeveralWords = 0;
		AllWordForms = 0;
		MatchCase = 0;
		ReplaceMode = 0;
		ReplaceStyle = "";
		FindStyle = "";
		FindRegExp = 0;
		FindJaso = 0;
		HanjaFromHangul = 0;
		IgnoreMessage = 1;
		FindType = 1;
    }
    theEnd = HAction.Execute("RepeatFind", HParameterSet.HFindReplace.HSet);
    return theEnd;
}

function OnScriptMacro_script1()
{
	// 문서의 시작 위치로 이동
	Run("MoveDocBegin");
	// 시작 위치를 저장
	var sPosSet = GetPosBySet();
	var slist = sPosSet.Item("List");
	var spara = sPosSet.Item("Para");
	var spos = sPosSet.Item("Pos");
	
	while (true) {
		findBlue();
		// 찾은 후에 현재 위치를 구함
		var cPosSet = GetPosBySet();
		var clist = cPosSet.Item("List");
		var cpara = cPosSet.Item("Para");
		var cpos = cPosSet.Item("Pos");
		
		// 문서를 끝까지 검색 후에 검색 위치가 처음으로 위치가 이동하기에 현재 위치와 처음 위치를 비교하여 빠져나옴
		if (slist == clist && spara == cpara && spos == cpos) {
			break;
		}
		//HAction.Run("MoveParaEnd");
		// false가 안 떠요 ㅠㅜ
   	}
}

해보시고 안되는 부분이 있으면 다시 코멘트 부탁드립니다.
감사합니다.

1개의 좋아요

덕분에 잘 해결했습니다.
감사합니다!!