ç®æ¬¡
ã¯ããã«
- æ¥åäœæ¥ã®äžã§ããªã¹ããCSVãExcelã®ããŒã¿ãèŠä»¶ã«åºã¥ããŠå€§éã«å€æãããå ŽåããããŸããããã§ã¯ãå¯èœãªéãç°¡åã«ããŒã¿ã®å€æãè¡ãããã®Excel VBAã®ãµã³ãã«ã玹ä»ããŸãã
- ããã§ç޹ä»ãããµã³ãã«ã¯ãã¡ãã£ãšããæ¥åäœæ¥ã®å¹çåã®ããã«ç°¡åã«å€æŽããŠäœ¿ããããšãç®æšã«ããŠãããå¯èœãªéãçãåãããããã³ãŒãã«ããŠããŸããæ¥åèŠä»¶ã§æ±ãããããããªãšã©ãŒãã³ããªã³ã°çã®èæ ®ã¯ããŠããªãããšã«ã泚æãã ããã
- ããã§ç޹ä»ãããµã³ãã«ã¯ãWindows 10(64ããã)ã®Excel 2019(32ããã)ã§åäœç¢ºèªããŠããŸãã
ã¹ã¯ãªããæŠèŠ
- ã·ãŒãäžã®ããŒã¿ãè¡åäœã«èªã¿åãããã®å
容ãç·šéããçµæããã¡ã€ã«ã«åºåããŸãã

- è¡ã®å
容ã«åºã¥ããŠãã¡ã€ã«ã«åºåããå
容ãç·šéããè¡ç·šé颿°ãçšæããŠããŸããèŠä»¶ã«äžçªè¿ãè¡ç·šé颿°ãåŒã³åºããã倿Žãããã®è¡ç·šé颿°ã®å
容ãèŠä»¶ã«åãããŠå€æŽããŠãã ããã
è¡ç·šé颿°ã®åç§° 説æ CSV
(ProcessRowAsCsv颿°)ãããè¡ãå«ãCSVã¬ã³ãŒããçæããŸãããããè¡ã®åãããŒã¿è¡ã®å€ã¯å šãŠåŒçšç¬Šä»ãã§åºåããŸãã ããã¹ã
(ProcessRowAsTxt颿°)ããŒã¿è¡ããã³ãã³ãããã¹ããäœæããŸããåºåå 容ã¯ãµã³ãã«ïŒã€ã¡ãŒãžïŒã§ãã
ïŒåçŽãªã³ãã³ãã§ããã°Excel颿°åŒã®æ¹ãæ©ããããããŸãããïŒSQL
(ProcessRowAsSql颿°)SQLã®INSERTæãçæããŸãã JSON
(ProcessRowAsJsn颿°)JSONãçæããŸããïŒåè¡ããŒã¿ãJSONãªããžã§ã¯ãèŠçŽ ãšããé å圢åŒïŒ - Windowsç°å¢ã§ã®åºåãã¡ã€ã«ã®ãšã³ã³ãŒãã£ã³ã°ã¯Shift_JISã§ãããµã³ãã«ãä¿®æ£ããŠãUTF-8ã«å€æŽããããšãã§ããŸãã
- è¡ã®å
容ã«åºã¥ããŠãã¡ã€ã«ã«åºåããå
容ãç·šéããè¡ç·šé颿°ãçšæããŠããŸããèŠä»¶ã«äžçªè¿ãè¡ç·šé颿°ãåŒã³åºããã倿Žãããã®è¡ç·šé颿°ã®å
容ãèŠä»¶ã«åãããŠå€æŽããŠãã ããã
- ã³ããããŠæå°éã®èšå®ã§å®è¡ã§ããããã«ãªã£ãŠããŸãã

- åŠç察象ãšãªãããŒã¿ãå«ãExcel(VBA)ã«ã¹ã¯ãªããã匵ãä»ããããããè¡æ°ããããŒã¿é åãçã倿Žããå®è¡ããã ãã§ããïŒxls,xlsxãã¡ã€ã«ã«åŒµãä»ããŠå®è¡ããããšãå¯èœã§ãããä¿åããå Žåã¯xlsm圢åŒãå¿ èŠã§ããïŒ
- VBAã®ç·šéç»é¢ã¯ã·ã§ãŒãã«ãããAlt + F11ãã§éããŸãã
ã¡ãã¥ãŒããéãå Žåã[ãªãã·ã§ã³]ïŒ[ãªãã³ã®ãŠãŒã¶ãŒèšå®]ã§éçºã¿ãã衚瀺ãã”Visual Basic”ãã¯ãªãã¯ããŸãã詳现ã¯ãã¡ããã芧ãã ããã
- ã¹ã¯ãªããã®åºæ¬ãšãªãèããåŠçã®æŠèŠã¯æ¬¡ã®éãã§ãã

- ãããè¡ãšããŒã¿è¡ãç¹å®ããããŒã¿è¡ã®è¡æ¯ã«è¡ç·šé颿°ProcessRowAsXXX()ãå®è¡ããŸãã
- 宿°DataStartA1, DataEndA1ã«æå®ãããç¯å²ãããŒã¿è¡ãšããŸãããããè¡ã®çŽåNè¡ïŒå®æ°HeadRowCountïŒããããè¡ãšããŸãã
- ProcessRowAsXXX()ã®åŒæ°ãšããŠããããè¡ãïŒç¯å²ïŒããããŒã¿è¡ãïŒç¯å²ïŒããåŠç察象ã®è¡çªå·ãïŒæŽæ°ïŒãæž¡ãããŸãããã®é¢æ°ã®è¿åŽå€ããã¡ã€ã«ã«åºåãããŸãã
- ãããã»ããã¿ããŒã¿ãäœæãã颿°ã®äœæãèããã®ã§ããã颿°ãè€æ°ã«åããããšåæ¿ãé¢åãªã®ã§ãå¿ èŠã§ããã°è¡ç·šé颿°ã§ãããã»ããã¿ãåºåããèšèšã«ããŠããŸãã
ã¹ã¯ãªããå 容
Excel VBAã¹ã¯ãªããã®èª¬æã§ãã
å®å
šãªãœãŒã¹ã³ãŒãã¯githubïŒãç°¡å倿ãµã³ãã«.xlsmãïŒã§å
¬éããŠããŸãã
åºæ¬éšåãšè¡ç·šé颿°ïŒCSV
- ã¹ã¯ãªããã®äž»èŠãªåŠçã®ã¹ã¯ãªããã¯æ¬¡ã®éãã§ãã
ïŒäŸãšããŠCSVãåºåããè¡ç·šé颿°ãå«ãã§ããŸããïŒOption Explicit '誀åäœé²æ¢ã®ãã Const HeadRowCount = 2 'â ãããè¡æ° Const DataStartA1 = "B5" 'â ããŒã¿é å(å·Šäž) Const DataEndA1 = "" 'â ããŒã¿é å(å³äž) â»æªæå®æã¯èªåæ€åº Const OutputFile = ".\output.txt" 'â åºåå â»ã«ã¬ã³ãã¯Bookã®ãã¹ Sub Main() GenerateFile Worksheets("Sheet1") 'â ã·ãŒãå End Sub Sub GenerateFile(ws As Worksheet) ws.Activate 'ã³ãŒãç°¡æœåã®ããã«åŠç察象ã·ãŒããéžæ ChDir ThisWorkbook.Path: ChDrive ThisWorkbook.Path Open OutputFile For Output As #1 'Windowsç°å¢ã ãšSJIS 'ããŒã¿è¡ãªã¹ãããããè¡ãªã¹ããçæ Dim dataRange As Range, dataRows As Range, headRows As Range Set dataRange = DetectDataRange() Set dataRows = dataRange.Rows Set headRows = dataRange.Offset(-HeadRowCount, 0).Rows("1:" & HeadRowCount) 'ããŒã¿è¡ã®è¡åäœã§åŠç Dim rowIdx As Integer, line As String, genCount As Integer For rowIdx = 1 To dataRows.Rows.Count 'â èŠä»¶ã«è¿ãè¡ç·šé颿°ã®ã³ã¡ã³ãã¢ãŠãã¯å€ã line = ProcessRowAsCsv(headRows, dataRows, rowIdx) 'line = ProcessRowAsTxt(headRows, dataRows, rowIdx) 'line = ProcessRowAsSql(headRows, dataRows, rowIdx) 'line = ProcessRowAsJsn(headRows, dataRows, rowIdx) If line <> "" Then Print #1, line genCount = genCount + 1 End If Next Close #1 'ResaveAsUtf8 OutputFile 'UTF-8ã§ä¿åãçŽã MsgBox genCount & "ä»¶ãåºåããŸããã" 'Shell "notepad.exe " & OutputFile, vbNormalFocus 'ã¢ããªèµ·åäŸ End Sub 'ããŒã¿é åã®ç¹å® Function DetectDataRange() Dim endA1 As String: endA1 = DataEndA1 If endA1 = "" Then With UsedRange endA1 = .Cells(.Rows.Count, .Columns.Count).Address(False, False) End With End If Set DetectDataRange = Range(DataStartA1 & ":" & endA1) End Function 'è¡ç·šé颿°: CSV Function ProcessRowAsCsv(headRows As Range, dataRows As Range, rowIdx As Integer) Dim line As String, colIdx As Integer, deli As String 'å é è¡ã®å Žåã¯ããããå«ãã If rowIdx = 1 Then For colIdx = 1 To headRows.Columns.Count If colIdx = 1 Then deli = "" Else deli = "," line = line & deli & """" & headRows.Cells(1, colIdx) & """" Next line = line & vbCrLf End If 'è¡é (ããŒ)ã空ã®å Žåã¯ã¹ããã If dataRows.Cells(rowIdx, 1) = "" Then Exit Function For colIdx = 1 To headRows.Columns.Count If colIdx = 1 Then deli = "" Else deli = "," line = line & deli & """" & dataRows.Cells(rowIdx, colIdx) & """" Next ProcessRowAsCsv = line End Function - ã«ã¹ã¿ãã€ãºã®ãã€ã³ã
è¡çªå· 説æ 3-5 ã·ãŒãã®å 容ã«å¿ããŠããããè¡æ°ïŒå®æ°HeadRowCountïŒãããŒã¿é åïŒå®æ°DataStartA1ã宿°DataEndA1ïŒã倿ŽããŠãã ãããDataEndA1ã¯ã·ãŒãã®äœ¿çšç¯å²ããèªåçã«æ±ºå®ãããŸããã倿Žãããå Žåã¯å€ãæå®ããŠãã ããã 7 å®è¡çµæã¯ãVBAã匵ãä»ããExcelããã¯ãšåããã©ã«ãã«output.txtãšããŠåºåãããŸããåºåå ã倿Žããå Žåã¯ã宿°OutputFileã倿ŽããŠãã ããã 10 ã·ãŒãåã倿ŽããŠãã ããã 30-32 èŠä»¶ã«è¿ãè¡ç·šé颿°ãå®è¡ããããããäžèŠãªè¡ç·šé颿°ãã³ã¡ã³ãã¢ãŠãããŠãã ããã 39 Windowsç°å¢ã§ã¯Shift_JISã§ä¿åããŸããUTF-8ã§ä¿åãããå ŽåãResaveAsUtf8颿°ãå®è¡ããããã³ã¡ã³ãã¢ãŠããå€ããŠãã ããã 42 ãã¡ã€ã«äœæåŸã«ã³ãã³ããå®è¡ãããå ŽåãShell颿°ãå®è¡ãããããã³ã¡ã³ãã¢ãŠããå€ããŠãåžæã®ã³ãã³ããæå®ããŠãã ããã 57-79 ãããè¡ãããŒã¿è¡ã®å šãŠã®é ç®ãåŒçšç¬Šä»ãã§åºåããå®è£ ã«ãªã£ãŠããŸããèŠä»¶ã«å¿ããŠå€æŽããŠãã ããã
è¡ç·šé颿°ïŒããã¹ã
- ã³ãã³ãçã®ä»»æã®ããã¹ããçæããããã®è¡ç·šé颿°ã§ãã
- ã·ãŒãäžã®è€æ°åã®å€ã«åºã¥ããŠå 容ã«åºã¥ããŠãã³ãã³ãçãäœæããéã«äœ¿çšããæ³å®ã§ãã
- ãµã³ãã«ã§åºåããŠããã³ãã³ãããã¹ãã¯ãµã³ãã«ã§ããç¹ã«æå³ã¯ãããŸããã
- ç§ã®æ¥åäœæ¥ã§ãAzureäžã®å€æ°ã®ãªãœãŒã¹ã®äœæã倿Žãè¡ãå ŽåããããŸãã察象ãªãœãŒã¹ãæ¡ä»¶ãã·ãŒãã«èšèŒããçºããŠPowerShellã³ãã³ããäœæããéã«äœ¿çšããæ³å®ã§ãã
'è¡ç·šé颿°: ããã¹ã Function ProcessRowAsTxt(headRows As Range, dataRows As Range, rowIdx As Integer) If dataRows.Cells(rowIdx, 1) = "" Then Exit Function Dim keyName As String: keyName = dataRows.Cells(rowIdx, 2) ProcessRowAsTxt = "findstr /S """ & keyName & """ *.txt" End Function
è¡ç·šé颿°ïŒSQL
- SQLã®INSERTæãäœæããè¡ç·šé颿°ã§ãã
- 18è¡ç®ã®å€æ°tableã®ããŒãã«åãé©å®å€æŽããŠãã ãããã·ãŒãåããååŸããå Žåã”ActiveSheet.Name”ãä»£å ¥ããŠãã ããã
- INSERTæã«åºåããå€ãç·šéãããå ŽåãEditSqlVal()ã®å 容ã倿ŽããŠãã ããã
- EditSqlVal()ã§ã¯ãchar/varchar/nchar/nvarchar/textçã®æåååãdate/time/datetimeçã®æ¥ä»ã»æå»åã§ã¯åŒçšç¬Šä»ãã§å€ãåºåããŸãã
'è¡ç·šé颿°: SQL Function ProcessRowAsSql(headRows As Range, dataRows As Range, rowIdx As Integer) If dataRows.Cells(rowIdx, 1) = "" Then Exit Function 'insertæã®ååãšå€ã«å¯Ÿå¿ããæååçæ Dim colIdx As Integer, cols As String, vals As String Dim colName As String, colType As String, val As String, deli As String For colIdx = 1 To dataRows.Columns.Count colName = headRows.Cells(1, colIdx) colType = headRows.Cells(2, colIdx) val = EditSqlVal(colName, colType, dataRows.Cells(rowIdx, colIdx)) If colIdx = 1 Then deli = "" Else deli = ", " cols = cols & deli & colName: vals = vals & deli & val Next 'SQLæãæ§ç¯ Dim table As String: table = "[m_employee]" 'ActiveSheet.Name ProcessRowAsSql = _ "insert into " & table & "(" & cols & ") values(" & vals & ");" End Function 'ã«ã©ã åã»åã«å¿ããSQLå€ã®ç·šé Function EditSqlVal(colName As String, colType As String, val As String) colName = LCase(colName): colType = LCase(colType) Select Case True Case val = "" val = "null" Case InStr(colType, "char") > 0 Or InStr(colType, "text") > 0 val = "'" & val & "'" Case InStr(colType, "date") > 0 Or InStr(colType, "time") > 0 val = "'" & val & "'" End Select EditSqlVal = val End Function
è¡ç·šé颿°ïŒJSON
- JSONãäœæããè¡ç·šé颿°ã§ãã
- å€ãç·šéãããå ŽåãEditJsonVal()ã®å 容ã倿ŽããŠãã ããã
- ãã£ãŒã«ãåãã±ããã±ãŒã¹ïŒã¹ããŒã¯ã±ãŒã¹ïŒãã¹ã«ã«ã±ãŒã¹ïŒãã£ã¡ã«ã±ãŒã¹çã«å€æãããå Žåã¯ããã¡ããã芧ãã ããã
'è¡ç·šé颿°: JSON 'â»å é ã»æçµè¡ã®[]ãåºåããé¢ä¿ã§ãçæä»¶æ°genCountããããå ŽåããããŸãã Function ProcessRowAsJsn(headRows As Range, dataRows As Range, rowIdx As Integer) Dim line As String, colIdx As Integer Dim colName As String, colType As String, val As String, deli As String 'å é è¡ã®å Žåãé åãéã If rowIdx = 1 Then line = line & "[" & vbCrLf If dataRows.Cells(rowIdx, 1) <> "" Then 'JSONãªããžã§ã¯ããçæ: { "field1": value1, "field2": "value2", ... } line = line & " {" & vbCrLf For colIdx = 1 To dataRows.Columns.Count colName = headRows.Cells(1, colIdx) colType = headRows.Cells(2, colIdx) val = EditJsonVal(colName, colType, dataRows.Cells(rowIdx, colIdx)) If colIdx = 1 Then deli = "" Else deli = "," & vbCrLf line = line & deli & " """ & colName & """: " & val Next line = line & vbCrLf & " }" '次ã®è¡ã«ããŒã¿ãããå Žåã¯ããªãã¿è¿œå (ããŒã¿æãè¡ããªãåæ) If dataRows.Cells(rowIdx + 1, 1) <> "" Then line = line & "," End If 'æçµè¡ã®å Žåãé åãéãã If rowIdx = dataRows.Count Then If line <> "" Then line = line & vbCrLf 'çæããŒã¿ãããå Žå line = line & "]" End If ProcessRowAsJsn = line End Function 'ã«ã©ã åã»åã«å¿ããJSONå€ã®ç·šé Function EditJsonVal(colName As String, colType As String, val As String) colName = LCase(colName): colType = LCase(colType) Select Case True Case val = "" val = "null" Case InStr(colType, "char") > 0 Or InStr(colType, "text") > 0 val = """" & val & """" Case InStr(colType, "date") > 0 Or InStr(colType, "time") > 0 val = """" & val & """" End Select EditJsonVal = val End Function
UTF-8ã«ããåä¿å
- Shift_JISã§ä¿åããããã¡ã€ã«ãUTF-8(BOMãªã)ã§ä¿åãçŽã颿°ã§ãã
- Windowsç°å¢ã§ã¯ãªãå Žåã6è¡ç®ã®ãšã³ã³ãŒãã£ã³ã°ãå®è¡ç°å¢ã®ãã®ã«å€æŽããŠãã ããã
- BOMãä»ããŠåºåãããå Žåã15è¡ç®(“.Position = 3”)ãã³ã¡ã³ãã¢ãŠãããŠãã ãããïŒä»ã«ãåé·ãªéšåããããŸãããåäœã«åœ±é¿ã¯ãªãã®ã§ç¡èŠããŸããïŒ
'UTF-8ã§ä¿åãçŽã Sub ResaveAsUtf8(filename As String) Dim str As String, buf() As Byte With CreateObject("ADODB.Stream") .Open 'SJISãã¡ã€ã«ãæååãšããŠèªã¿èŸŒã¿ .Charset = "Shift-JIS" .LoadFromFile filename str = .ReadText .Close .Open 'UTF-8æžã蟌ã¿åŸãBOMãé€ãããã€ããªãšããŠååŸ .Charset = "UTF-8" .WriteText str .Position = 0 .Type = 1 'adTypeBinary .Position = 3 'â BOMä»äžæã¯ã³ã¡ã³ãã¢ãŠã buf = .Read .Close .Open 'åè¿°ã®ãã€ããªããã¡ã€ã«ã«æžã蟌㿠.Write buf .SaveToFile filename, 2 'adSaveCreateOverWrite .Close End With End Sub