매크로로 “문자열을 표로 만들기”하면 한/글이 다운됩니다

특정 문자열을 찾아서 표로 만드는 작업을 매크로로 돌리면 될 때도 있고 몇 번 되다 말거나 아예 안 될 때도 있습니다. 어느 지점에서 다운되는지 알고 싶습니다. 간략한 테스트 버전입니다.
아래 문자열을 복사하여 클립보드에 넣고 다음 매크로를 돌려보면 다운되는 현상이 생깁니다. 이유를 알 수 있을까요? (2010, 2024 버전에서 테스트 해봄)

1&2&3&4&5&6&7&8&9&10
11&12&13&14&15&16&17&18&19&20
21&22&23&24&25&26&27&28&29&30

function OnScriptMacro_문자열2표()
{
    var cnt = 10;
    for (var i = 0; i < cnt; i++) {
        HAction.Run("Paste");
        HAction.Run("MoveSelPrevParaBegin");
        HAction.Run("MoveSelPrevParaBegin");
        HAction.Run("MoveSelPrevParaBegin");
        HAction.GetDefault("TableStringToTable", HParameterSet.HTableStrToTbl.HSet);
        with (HParameterSet.HTableStrToTbl)
        {
            TableCreation.Rows = 3;
            TableCreation.Cols = 10;
            TableCreation.WidthType = 0;
            TableCreation.HeightType = 0;
            TableCreation.WidthValue = MiliToHwpUnit(148.0);
            TableCreation.HeightValue = MiliToHwpUnit(13.6);
            TableCreation.CreateItemArray("ColWidth", 10);
            TableCreation.ColWidth.Item(0) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(1) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(2) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(3) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(4) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(5) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(6) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(7) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(8) = MiliToHwpUnit(11.2);
            TableCreation.ColWidth.Item(9) = MiliToHwpUnit(11.2);
            TableCreation.CreateItemArray("RowHeight", 3);
            TableCreation.RowHeight.Item(0) = MiliToHwpUnit(0.0);
            TableCreation.RowHeight.Item(1) = MiliToHwpUnit(0.0);
            TableCreation.RowHeight.Item(2) = MiliToHwpUnit(0.0);
            TableCreation.TableProperties.CellMarginLeft = MiliToHwpUnit(1.8);
            TableCreation.TableProperties.CellMarginRight = MiliToHwpUnit(1.8);
            TableCreation.TableProperties.CellMarginTop = MiliToHwpUnit(0.5);
            TableCreation.TableProperties.CellMarginBottom = MiliToHwpUnit(0.5);
            TableCreation.TableProperties.HorzRelTo = HorzRel("Column");
            TableCreation.TableProperties.VertRelTo = VertRel("Para");
            TableCreation.TableProperties.FlowWithText = 1;
            TableCreation.TableProperties.TextWrap = TextWrapType("TopAndBottom");
            TableCreation.TableProperties.WidthRelTo = WidthRel("Absolute");
            TableCreation.TableProperties.HeightRelTo = HeightRel("Absolute");
            TableCreation.TableProperties.AllowOverlap = 0;
            TableCreation.TableProperties.TreatAsChar = 0;
            TableCreation.TableProperties.VertAlign = VAlign("Top");
            TableCreation.TableProperties.HorzAlign = HAlign("Justify");
            TableCreation.TableProperties.Width = 41956;
            TableCreation.TableProperties.Height = 0;
            TableCreation.TableProperties.TextFlow = TextFlowType("BothSides");
            TableCreation.TableProperties.OutsideMarginLeft = MiliToHwpUnit(1.0);
            TableCreation.TableProperties.OutsideMarginRight = MiliToHwpUnit(1.0);
            TableCreation.TableProperties.OutsideMarginTop = MiliToHwpUnit(1.0);
            TableCreation.TableProperties.OutsideMarginBottom = MiliToHwpUnit(1.0);
            TableCreation.TableProperties.HoldAnchorObj = 0;
            AutoOrDefine = 1;
            DelimiterType = Delimiter("UserDefine");
            UserDefine = "&";
            DelimiterEtc = "";
        }
        HAction.Execute("TableStringToTable", HParameterSet.HTableStrToTbl.HSet);
        FindCtrl();
        HAction.GetDefault("CellBorderFill", HParameterSet.HCellBorderFill.HSet);
        with (HParameterSet.HCellBorderFill)
        {
            HSet.SetItem("ApplyTo", 1);
        }
        HAction.Execute("CellBorderFill", HParameterSet.HCellBorderFill.HSet);
        HAction.GetDefault("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
        with (HParameterSet.HShapeObject)
        {
            HorzRelTo = HorzRel("Para");
            TreatAsChar = 1;
            HSet.SetItem("ShapeType", 6);
        }
        HAction.Execute("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
        HAction.Run("Cancel");
        HAction.Run("MoveLineEnd");
        HAction.Run("BreakPara");
        alert(i);
    }
}

function alert(s) {
XHwpMessageBox.String =s;
XHwpMessageBox.Flag = 0;
XHwpMessageBox.DoModal();
}

이 범주에서는 한글 오토메이션에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.

  1. 한글 오토메이션의 API 사용/연동은 개발 가이드를 참조하세요.
  2. 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
  3. 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.
1개의 좋아요

안녕하세요

HParameterSet는 전역 변수라 계속 재활용 됩니다. 그래서 2번째 루프 동작부터는 문제가 되는 것 같습니다.
HParameterSet.HTableStrToTbl를 사용하는 곳에서 CreateAction과 CreateSet, CreateItemSet 등을 활용하여 루프를 돌 때마다 새로 액션과 파라미터셋을 생성하면 정상 동작할 것 같습니다.

감사합니다.

1개의 좋아요

설명하신대로 액션을 생성하여 다운되는 문제점을 해결했습니다. ^___^
감사합니다.

function OnScriptMacro_문자열2표()
{
    var cnt = 10;
    for (var i = 0; i < cnt; i++) {
        HAction.Run("Paste");
        HAction.Run("MoveSelPrevParaBegin");
        HAction.Run("MoveSelPrevParaBegin");
        HAction.Run("MoveSelPrevParaBegin");

        var act = CreateAction("TableStringToTable");
        var set = act.CreateSet();
        act.GetDefault(set);
        
        // 하위셋 생성
        var table = set.CreateItemSet("TableCreation", "TableCreation");
        table.SetItem("Rows",3);
        table.SetItem("Cols",10);
        table.SetItem("WidthType", 0);
        table.SetItem("HeightType", 0);
        table.SetItem("WidthValue", MiliToHwpUnit(148.0));
        table.SetItem("HeightValue", MiliToHwpUnit(13.6));

        table.CreateItemArray("ColWidth", 10);
        table.SetItem(0, MiliToHwpUnit(11.2));
        table.SetItem(1, MiliToHwpUnit(11.2));
        table.SetItem(2, MiliToHwpUnit(11.2));
        table.SetItem(3, MiliToHwpUnit(11.2));
        table.SetItem(4, MiliToHwpUnit(11.2));
        table.SetItem(5, MiliToHwpUnit(11.2));
        table.SetItem(6, MiliToHwpUnit(11.2));
        table.SetItem(7, MiliToHwpUnit(11.2));
        table.SetItem(8, MiliToHwpUnit(11.2));
        table.SetItem(9, MiliToHwpUnit(11.2));

        table.CreateItemArray("RowHeight", 3);
        table.SetItem(0, MiliToHwpUnit(0.0));
        table.SetItem(1, MiliToHwpUnit(0.0));
        table.SetItem(2, MiliToHwpUnit(0.0));
        // 하위셋 생성
        var props = table.CreateItemSet("TableProperties", "TableProperties");
        props.SetItem("CellMarginLeft", MiliToHwpUnit(1.8));
        props.SetItem("CellMarginRight", MiliToHwpUnit(1.8));
        props.SetItem("CellMarginTop", MiliToHwpUnit(0.5));
        props.SetItem("CellMarginBottom", MiliToHwpUnit(0.5));
        props.SetItem("HorzRelTo", HorzRel("Column"));
        props.SetItem("VertRelTo", VertRel("Para"));
        props.SetItem("FlowWithText", 1);
        props.SetItem("TextWrap", TextWrapType("TopAndBottom"));
        props.SetItem("WidthRelTo", WidthRel("Absolute"));
        props.SetItem("HeightRelTo", HeightRel("Absolute"));
        props.SetItem("AllowOverlap", 0);
        props.SetItem("TreatAsChar", 0);
        props.SetItem("VertAlign", VAlign("Top"));
        props.SetItem("HorzAlign", HAlign("Justify"));
        props.SetItem("Width", 41956);
        props.SetItem("Height", 0);
        props.SetItem("TextFlow", TextFlowType("BothSides"));
        props.SetItem("OutsideMarginLeft", MiliToHwpUnit(1.0));
        props.SetItem("OutsideMarginRight", MiliToHwpUnit(1.0));
        props.SetItem("OutsideMarginTop", MiliToHwpUnit(1.0));
        props.SetItem("OutsideMarginBottom", MiliToHwpUnit(1.0));
        props.SetItem("HoldAnchorObj", 0);
        // 루트 옵션
        set.SetItem("AutoOrDefine", 1);
        set.SetItem("DelimiterType", Delimiter("UserDefine"));
        set.SetItem("UserDefine", "&");
        set.SetItem("DelimiterEtc", "");

        act.Execute(set);

        FindCtrl();
        HAction.GetDefault("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
        with (HParameterSet.HShapeObject)
        {
            TreatAsChar = 1;
            HSet.SetItem("ShapeType", 6);
        }
        HAction.Execute("TablePropertyDialog", HParameterSet.HShapeObject.HSet);
        HAction.Run("Cancel");
        HAction.Run("MoveLineEnd");
        HAction.Run("BreakPara");
    }
}