이 범주에서는 한글 오토메이션에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.
- 한글 오토메이션의 API 사용/연동은 개발 가이드를 참조하세요.
- 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
- 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.
한글 매크로를 이용해서 제 로컬 내의 한글 파일을 자동으로 여러개 켜고 작업하는 스크립트를 짜고 싶습니다
스크립트는 정상인 것 같은데, 위와 같은 오류로 더이상 진행이 안되는 것 같더라구요..
혹시 어떻게 더 진행할 수 있을까요?
\[코드\]
// 매크로 이름: 학생별학습지통하
function OnScriptMacro_TotalNote() {
var fso = new ActiveXObject(“Scripting.FileSystemObject”);
// 1. 폴더 경로 입력
var folderPath = InputBox("시험지 파일들이 있는 [폴더 경로]를 붙여넣으세요.\n(예: C:\\Users\\User\\Desktop\\시험지모음)", "폴더 경로 입력");
if (!folderPath || folderPath.length === 0) return;
if (!fso.FolderExists(folderPath)) {
Alert("❌ 입력하신 경로를 찾을 수 없습니다.\n오타가 있는지 확인해주세요.");
return;
}
// 2. 파일 리스트업
var folder = fso.GetFolder(folderPath);
var fc = new Enumerator(folder.files);
var fileList = [];
for (; !fc.atEnd(); fc.moveNext()) {
var f = fc.item();
var ext = fso.GetExtensionName(f.name).toLowerCase();
if (ext == "hwp" || ext == "hwpx") {
fileList.push(f.path);
}
}
fileList.sort();
if (fileList.length === 0) {
Alert("❌ 해당 폴더에 한글(hwp, hwpx) 파일이 없습니다.");
return;
}
// 3. 파일 목록 및 문제 입력
var msgList = "📂 파일 목록 (번호 확인용):";
for (var i = 0; i < fileList.length; i++) {
msgList += "\n[" + (i + 1) + "] " + fso.GetFileName(fileList[i]);
}
var guideMsg = "\n\n✍️ 추출할 문제를 입력하세요. (예: 1-3 2-5 1-2)";
var inputStr = InputBox(msgList + guideMsg, "문제 추출 입력");
if (!inputStr) return;
// 4. 입력값 파싱
var tasks = ParseInput(inputStr);
if (tasks.length === 0) {
Alert("❌ 입력 형식이 올바르지 않습니다.\n숫자-숫자 형태로 입력해주세요.");
return;
}
// 5. 백그라운드 한글 실행 (오류 확인용 수정)
var sourceHwp = null;
try {
// 여기서 에러가 발생하면 catch로 넘어갑니다.
sourceHwp = new ActiveXObject("HWPFrame.HwpObject");
sourceHwp.XHwpWindows.Item(0).Visible = false;
sourceHwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule");
} catch (e) {
// ⭐ 여기가 중요합니다. 진짜 에러 내용을 보여줍니다.
Alert("🚨 오토메이션 오류 발생!\n\n에러 메시지: " + e.description + "\n에러 번호: " + e.number + "\n\n(해결책: HwpAutomationApp.exe를 관리자 권한으로 실행해보세요)");
return;
}
// 6. 작업 시작
var currentFileIdx = -1;
var errorLog = "";
var successCount = 0;
for (var k = 0; k < tasks.length; k++) {
var task = tasks[k];
var fIdx = task.fileIdx;
var qNum = task.qNum;
if (fIdx < 0 || fIdx >= fileList.length) {
errorLog += "[" + (fIdx + 1) + "번 파일 없음] ";
continue;
}
if (currentFileIdx !== fIdx) {
try {
sourceHwp.Open(fileList[fIdx], "HWP", "forceopen:true");
currentFileIdx = fIdx;
} catch (e) {
errorLog += "[" + (fIdx + 1) + "번 파일 열기 실패] ";
continue;
}
}
if (CopyQuestionFromSource(sourceHwp, qNum)) {
HAction.Run("Paste");
HAction.Run("MoveColumnEnd");
HAction.Run("BreakPara");
HAction.Run("BreakPara");
successCount++;
} else {
errorLog += "[" + (fIdx+1) + "번 파일-" + qNum + "번 없음] ";
}
}
if (sourceHwp) sourceHwp.Quit();
if (errorLog !== "") {
Alert("⚠️ 작업 완료 (일부 누락)\n성공: " + successCount + "건\n누락: " + errorLog);
} else {
Alert("✅ " + successCount + "문제 생성 완료! 수고하셨습니다.");
}
}
// ==========================================
// \[보조 함수들\]
// ==========================================
function Alert(msg) {
XHwpMessageBox.String = msg;
XHwpMessageBox.Flag = 0;
XHwpMessageBox.DoModal();
}
function CopyQuestionFromSource(hwpObj, targetNum) {
var ctrl = hwpObj.HeadCtrl;
var count = 0;
var found = false;
while (ctrl) {
if (ctrl.CtrlID == "en") {
count++;
if (count == targetNum) {
var anchor = ctrl.GetAnchorPos(0);
hwpObj.SetPosBySet(anchor);
var nextCtrl = ctrl.Next;
while (nextCtrl) {
if (nextCtrl.CtrlID == "en") break;
nextCtrl = nextCtrl.Next;
}
hwpObj.Run("MoveSelParaBegin");
if (nextCtrl) {
var nextPos = nextCtrl.GetAnchorPos(0);
hwpObj.SetPosBySet(nextPos);
hwpObj.Run("MovePrevParaEnd");
} else {
hwpObj.Run("MoveDocEnd");
}
hwpObj.Run("Copy");
found = true;
break;
}
}
ctrl = ctrl.Next;
}
return found;
}
function ParseInput(str) {
var parts = str.split(/\[\\s,\]+/);
var result = [ ];
for (var i = 0; i < parts.length; i++) {
var p = parts\[i\];
if (p.indexOf(“-”) > -1) {
var nums = p.split(“-”);
var f = parseInt(nums\[0\]) - 1;
var q = parseInt(nums\[1\]);
if (!isNaN(f) && !isNaN(q)) {
result.push({ fileIdx: f, qNum: q });
}
}
}
return result;
}
function InputBox(prompt, title) {
var script = new ActiveXObject(“MSScriptControl.ScriptControl”);
script.Language = “VBScript”;
var safePrompt = prompt.replace(/“/g, '”“');
var lines = safePrompt.split(/\\r\\n|\\r|\\n/);
var vbStr = '”’ + lines.join(‘" & vbCrLf & "’) + ‘"’;
return script.Eval(‘InputBox(’ + vbStr + ‘, "’ + title + ‘")’);
}