-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReservationExcelEdit.vbs
More file actions
154 lines (123 loc) · 5.92 KB
/
Copy pathReservationExcelEdit.vbs
File metadata and controls
154 lines (123 loc) · 5.92 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Option Explicit
'--------------------------------------------------------------------------------
' ScriptName : ReservationExcelEdit.vbs
' Creator : Sungman Han
' Creation Date : 2019-05-30
' Description : 예약(Reservation) 엑셀 정리
' 1) C열 삭제
' 2) 데이터 행 수 확인
' 3) '납품처' 열에 납품업체코드 일괄 입력
' 4) '생산버전' 헤더를 STATUS 로 바꾸고 값 비우기
'
' Usage : cscript //nologo ReservationExcelEdit.vbs <통합문서명|경로> <납품업체코드> [시트명]
' 이미 열려 있는 Excel 인스턴스의 통합 문서를 대상으로 한다.
'
' Output : 표준출력에 데이터 행 수 1줄. 실패는 표준오류 + 0 이 아닌 종료코드.
' Exit codes : 0 정상 | 1 인자 오류 | 2 Excel 미실행 | 3 통합문서 없음 | 4 헤더 없음
'
' Encoding : 이 파일은 한글 리터럴을 포함하므로 작업트리에서 UTF-16LE + BOM 으로
' 유지된다(.gitattributes 의 working-tree-encoding). cscript.exe 는
' .vbs 를 시스템 코드페이지로 읽기 때문에, BOM 없는 UTF-8 로 저장하면
' 한글이 깨져 컬럼 검색이 실패한다.
'--------------------------------------------------------------------------------
Const COL_PLANT = "플랜트"
Const COL_DELIVERY = "납품처"
Const COL_VERSION = "생산버전"
Const HEADER_ROW = 1
Const FIRST_DATA_ROW = 2
' Excel enumerations are not predefined in VBScript
Const XL_VALUES = -4163
Const XL_WHOLE = 1
Dim vWorkbookRef, vSupplier, vSheetName
Dim vExcel, vWorkbook, vSheet, vRowCount, vVersionColumn
If WScript.Arguments.Count < 2 Then
WScript.StdErr.WriteLine "Usage: cscript //nologo ReservationExcelEdit.vbs <통합문서명|경로> <납품업체코드> [시트명]"
WScript.Quit 1
End If
vWorkbookRef = WScript.Arguments.Item(0)
vSupplier = WScript.Arguments.Item(1)
vSheetName = "Sheet1"
If WScript.Arguments.Count >= 3 Then vSheetName = WScript.Arguments.Item(2)
Set vExcel = GetRunningExcel()
Set vWorkbook = FindOpenWorkbook(vExcel, vWorkbookRef)
Set vSheet = vWorkbook.Worksheets(vSheetName)
'--------------------------------------------------------------------------------
' 1) 컬럼 삭제
'--------------------------------------------------------------------------------
vSheet.Range("C:C").EntireColumn.Delete
'--------------------------------------------------------------------------------
' 2) 데이터 행 수 확인 ('플랜트' 열이 채워진 연속 구간)
'--------------------------------------------------------------------------------
vRowCount = CountDataRows(vSheet, RequireColumn(vSheet, COL_PLANT))
'--------------------------------------------------------------------------------
' 3) 납품처 일괄 입력
'--------------------------------------------------------------------------------
FillColumn vSheet, RequireColumn(vSheet, COL_DELIVERY), vRowCount, vSupplier
'--------------------------------------------------------------------------------
' 4) 생산버전 -> STATUS 로 헤더 변경, 값은 비움
'--------------------------------------------------------------------------------
vVersionColumn = RequireColumn(vSheet, COL_VERSION)
vSheet.Cells(HEADER_ROW, vVersionColumn).Value = "STATUS"
FillColumn vSheet, vVersionColumn, vRowCount, ""
'--------------------------------------------------------------------------------
' 저장 및 객체 정리 (Excel 인스턴스는 호출자 소유이므로 Quit 하지 않는다)
'--------------------------------------------------------------------------------
vWorkbook.Save
Set vSheet = Nothing
Set vWorkbook = Nothing
Set vExcel = Nothing
WScript.StdOut.WriteLine vRowCount
WScript.Quit 0
'--------------------------------------------------------------------------------
' Function List
'--------------------------------------------------------------------------------
Function GetRunningExcel()
Dim vApp
Set vApp = Nothing
On Error Resume Next
Set vApp = GetObject(, "Excel.Application")
Err.Clear
On Error GoTo 0
If vApp Is Nothing Then Fail 2, "실행 중인 Excel 인스턴스를 찾지 못했습니다. 먼저 ExcelOpen.vbs 로 통합 문서를 여세요."
Set GetRunningExcel = vApp
End Function
' Workbooks 컬렉션은 전체 경로가 아니라 '파일명' 으로 색인된다.
' 원본은 경로를 그대로 넘겨 항상 실패했다.
Function FindOpenWorkbook(vApp, vRef)
Dim vBook, vName
vName = vRef
If InStr(vName, "\") > 0 Then vName = Mid(vName, InStrRev(vName, "\") + 1)
Set vBook = Nothing
On Error Resume Next
Set vBook = vApp.Workbooks(vName)
Err.Clear
On Error GoTo 0
If vBook Is Nothing Then Fail 3, "열려 있는 통합 문서에서 찾지 못했습니다: " & vName
Set FindOpenWorkbook = vBook
End Function
Function RequireColumn(vSheet, vHeader)
Dim vFound
Set vFound = vSheet.Rows(HEADER_ROW).Find(vHeader, , XL_VALUES, XL_WHOLE)
If vFound Is Nothing Then Fail 4, "헤더를 찾지 못했습니다: " & vHeader
RequireColumn = vFound.Column
End Function
' 헤더 아래 첫 공백 셀까지의 행 수. Do While 이므로 데이터가 없으면 0 을 반환한다.
' (원본의 Do ... Loop While 은 최소 1회 실행되어 빈 시트에서 무한 루프가 났다.)
Function CountDataRows(vSheet, vColumn)
Dim vRow
vRow = FIRST_DATA_ROW
Do While Trim(vSheet.Cells(vRow, vColumn).Value & "") <> ""
vRow = vRow + 1
Loop
CountDataRows = vRow - FIRST_DATA_ROW
End Function
' 셀 단위 COM 호출 대신 Range 한 번에 대입한다. 행이 없으면 아무것도 하지 않는다.
Sub FillColumn(vSheet, vColumn, vRowCount, vValue)
If vRowCount < 1 Then Exit Sub
vSheet.Range(vSheet.Cells(FIRST_DATA_ROW, vColumn), _
vSheet.Cells(FIRST_DATA_ROW + vRowCount - 1, vColumn)).Value = vValue
End Sub
Sub Fail(vCode, vMessage)
WScript.StdErr.WriteLine vMessage
WScript.Quit vCode
End Sub