入出金明細のExcelファイルを編集用ファイルに変更する
ダイアログボックスを使用してファイルを選択し、そのファイルを別のフォルダにコピーして、新しいファイル名を「会社名_jouranalN月」で保存する
Option Explicit Sub CopyFileWithNewName() Dim SourceFile As Variant Dim TargetFolder As Variant Dim CompanyName As String Dim MonthStr As String Dim NewFileName As String Dim FileExtension As String Dim fso As Object ' ファイル選択ダイアログを表示 With Application.FileDialog(msoFileDialogFilePicker) .Title = "コピーするファイルを選択してください" .AllowMultiSelect = False If .Show = -1 Then SourceFile = .SelectedItems(1) Else MsgBox "ファイルが選択されませんでした。処理を終了します。" Exit Sub End If End With ' フォルダ選択ダイアログを表示 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "ファイルをコピーするフォルダを選択してください" If .Show = -1 Then TargetFolder = .SelectedItems(1) Else MsgBox "フォルダが選択されませんでした。処理を終了します。" Exit Sub End If End With ' 会社名と月を入力 CompanyName = InputBox("会社名を入力してください。", "会社名の入力") If CompanyName = "" Then MsgBox "会社名が入力されませんでした。処理を終了します。" Exit Sub End If MonthStr = InputBox("月を入力してください。(例: 1月の場合は '1'、10月の場合は '10')", "月の入力") If MonthStr = "" Then MsgBox "月が入力されませんでした。処理を終了します。" Exit Sub End If ' 新しいファイル名を作成 FileExtension = Mid(SourceFile, InStrRev(SourceFile, ".")) NewFileName = CompanyName & "_jouranal" & MonthStr & "月" & FileExtension ' ファイルをコピー Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile SourceFile, TargetFolder & Application.PathSeparator & NewFileName ' 確認メッセージを表示 MsgBox "ファイルが正常にコピーされました。" & vbCrLf & "新しいファイル名: " & NewFileName, vbInformation, "完了" End Sub
編集ファイルに仕訳作成のための列名を付与
ダイアログボックスで選択されたファイルを開き、”Bank Statement”シートをコピーして”Bank Statement(編集用)”シートに変更し、新しい列名を追加します。
Option Explicit Sub UpdateBankStatementSheet() Dim ws As Worksheet Dim wsCopy As Worksheet Dim LastColumn As Long Dim NewColumnTitles As Variant Dim i As Long Dim OpenFileName As Variant Dim SourceWorkbook As Workbook ' ダイアログボックスでファイルを選択 OpenFileName = Application.GetOpenFilename _ (Title:="選択したファイルを開く", _ FileFilter:="Excel Files *.xls* (*.xls*),") ' キャンセルが選択された場合、終了 If OpenFileName = False Then MsgBox "ファイルが選択されませんでした。", vbExclamation, "エラー" Exit Sub End If ' 選択されたファイルを開く Set SourceWorkbook = Workbooks.Open(OpenFileName) ' シートを設定 Set ws = SourceWorkbook.Worksheets("Bank Statement") ' シートをコピーし、新しいシート名を設定 ws.Copy After:=ws Set wsCopy = ActiveSheet wsCopy.Name = "Bank Statement(編集用)" ' 最初の3行を削除 wsCopy.Rows("1:3").Delete ' 最終列を取得 LastColumn = wsCopy.Cells(1, wsCopy.Columns.Count).End(xlToLeft).Column ' 新しい列名を配列に設定 NewColumnTitles = Array("為替換算", "識別フラグ", "支払日", "借方勘定", "借方補助科目", "借方消費税", "金額", "貸方勘定科目", "貸方補助科目", "貸方消費税", "金額", "摘要", "仕訳メモ") ' 最終列の次の列から新しい列名を設定 For i = LBound(NewColumnTitles) To UBound(NewColumnTitles) wsCopy.Cells(1, LastColumn + i + 1).Value = NewColumnTitles(i) Next i ' 完了メッセージを表示 MsgBox "Bank Statement(編集用)シートが作成されました。", vbInformation, "完了" End Sub
入出金明細のデータを条件にして仕訳を作成する
指定された要件に従って操作を実行します。新しい列にデータを代入し、指定された条件に基づいて値を設定します。
Option Explicit Sub UpdateNewColumns() Dim ws As Worksheet Dim LastRow As Long Dim LastColumn As Long Dim i As Long Dim OpenFileName As Variant Dim SourceWorkbook As Workbook ' ダイアログボックスでファイルを選択 OpenFileName = Application.GetOpenFilename _ (Title:="選択したファイルを開く", _ FileFilter:="Excel Files *.xls* (*.xls*),") ' キャンセルが選択された場合、終了 If OpenFileName = False Then MsgBox "ファイルが選択されませんでした。", vbExclamation, "エラー" Exit Sub End If ' 選択されたファイルを開く Set SourceWorkbook = Workbooks.Open(OpenFileName) ' シートを設定 Set ws = SourceWorkbook.Worksheets("Bank Statement(編集用)") ' 最終行と最終列を取得 LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row LastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' F列でソート With ws.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("F2:F" & LastRow), SortOn:=xlSortOnValues, Order:=xlAscending .SetRange ws.Range("A1:" & ws.Cells(LastRow, LastColumn).Address) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ' 新しい列にデータを代入 For i = 2 To LastRow With ws ' F列の値を支払日に代入 .Cells(i, LastColumn - 9).Value = .Cells(i, "F").Value ' I列に数値があり、R列がUSDの時、S列の数値を金額に If Not IsEmpty(.Cells(i, "I").Value) And .Cells(i, "R").Value = "USD" Then .Cells(i, "金額").Value = .Cells(i, "S").Value ' I列に数値があり、R列がUSDでない時、I列の金額を ElseIf Not IsEmpty(.Cells(i, "I").Value) And .Cells(i, "R").Value <> "USD" Then .Cells(i, "金額").Value = .Cells(i, "I").Value ' I列が空白で、R列がUSDの時、S列の数値を金額に ElseIf IsEmpty(.Cells(i, "I").Value) And .Cells(i, "R").Value = "USD" Then .Cells(i, "金額").Value = .Cells(i, "S").Value ' I列が空白で、R列がUSD出ない場合、H列の数値を金額に入れる ElseIf IsEmpty(.Cells(i, "I").Value) And .Cells(i, "R").Value <> "USD" Then .Cells(i, "金額").Value = .Cells(i, "H").Value End If ' 借方消費税、仕方消費税に対象外を代入 .Cells(i, LastColumn - 3).Value = "対象外" .Cells(i, LastColumn + 1).Value = "対象外" ' J列に基づいて借方勘定科目に代入 Select Case True Case InStr(1, Mid(.Cells(i, "J").Value, 2, 1), "G") > 0 Or InStr(1, Mid(.Cells(i, "J").Value, 2, 1), "A") > 0 Or InStr(1, Mid(.Cells(i, "J").Value, 2, 1), "P") > 0 .Cells(i, LastColumn - 4).Value = "未払金" Case InStr(1, .Cells(i, "J").Value, "CONSOLID") > 0 .Cells(i, LastColumn - 4).Value = "未払給与" Case InStr(1, .Cells(i, "J").Value, "EBテスウリョウ") > 0 Or InStr(1, .Cells(i, "J").Value, "TRANZACTION") > 0 .Cells(i, LastColumn - 4).Value = "銀行手数料" .Cells(i, LastColumn - 3).Value = "課対仕入込10%" Case InStr(1, .Cells(i, "J").Value, "TAX") > 0 .Cells(i, LastColumn - 4).Value = "預り金_住民税" Case InStr(1, .Cells(i, "J").Value, "CUSTOMER") > 0 .Cells(i, LastColumn - 4).Value = "預り金_所得税" End Select ' J列にINTSSAが含まれている場合 If InStr(1, .Cells(i, "J").Value, "INTSSA") > 0 Then ' I列に数値がある場合は、資金移動振替勘定を最終列の-9行目に代入 If Not IsEmpty(.Cells(i, "I").Value) Then .Cells(i, LastColumn - 9).Value = "資金移動振替勘定" ' I列に数値がない場合は、最終列の-5行目に代入 Else .Cells(i, LastColumn - 5).Value = "資金移動振替勘定" End If End If ' J列にREIMBURSEが含まれていて、RETURNがない場合 If InStr(1, .Cells(i, "J").Value, "REIMBURSE") > 0 And InStr(1, .Cells(i, "J").Value, "RETURN") = 0 Then ' 未払金(立替精算)を最終列の-9行目に代入 .Cells(i, LastColumn - 9).Value = "未払金(立替精算)" End If ' J列にINTDDSAが含まれている場合 If InStr(1, .Cells(i, "J").Value, "INTDDSA") > 0 Then ' I列に数値がある場合は、未収入金_関連会社を最終列の-9行目に代入 If Not IsEmpty(.Cells(i, "I").Value) Then .Cells(i, LastColumn - 9).Value = "未収入金_関連会社" ' I列に数値がない場合は、預り金_関連会社を最終列の-5行目に代入 Else .Cells(i, LastColumn - 5).Value = "預り金_関連会社" End If End If ' J列にReturnが含まれている場合、組み戻し振替勘定を最終列の-9行目に代入 If InStr(1, .Cells(i, "J").Value, "Return") > 0 Then .Cells(i, LastColumn - 5).Value = "組み戻し振替勘定" End If End With Next i ' 完了メッセージを表示 MsgBox "Bank Statement(編集用)シートが更新されました。", vbInformation, "完了" ' 選択されたファイルを閉じる SourceWorkbook.Close SaveChanges:=False End Sub
仕訳に識別フラグを立てる
最終列の-10列目の日付が上から下に連続して同じ日付であれば、複数行の伝票、連続しなければ1行の伝票として以下のルールで最終行の-11列目に入力してください。
1行の伝票データ :2111 複数行の伝票データ 1行目 :2110 間の行 :2100 最終行 :2101
Option Explicit Sub UpdateSlipNumbers() Dim OpenFileName As Variant Dim SourceWorkbook As Workbook Dim ws As Worksheet Dim LastRow As Long Dim LastColumn As Long Dim i As Long Dim currentInvoiceDate As Variant Dim isFirstRow As Boolean ' ダイアログボックスでファイルを選択 OpenFileName = Application.GetOpenFilename _ (Title:="選択したファイルを開く", _ FileFilter:="Excel Files *.xls* (*.xls*),") ' キャンセルが選択された場合、終了 If OpenFileName = False Then MsgBox "ファイルが選択されませんでした。", vbExclamation, "エラー" Exit Sub End If ' 選択されたファイルを開く Set SourceWorkbook = Workbooks.Open(OpenFileName) ' シートを設定 Set ws = SourceWorkbook.Worksheets("Bank Statement(編集用)") ' 最終行と最終列を取得 LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row LastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' 伝票番号の更新 currentInvoiceDate = ws.Cells(2, LastColumn - 10).Value isFirstRow = True For i = 2 To LastRow With ws If .Cells(i, LastColumn - 10).Value <> currentInvoiceDate Then currentInvoiceDate = .Cells(i, LastColumn - 10).Value isFirstRow = True End If If isFirstRow Then If .Cells(i, LastColumn - 10).Value <> .Cells(i + 1, LastColumn - 10).Value Then .Cells(i, LastColumn - 11).Value = "2111" Else .Cells(i, LastColumn - 11).Value = "2110" End If isFirstRow = False Else If .Cells(i, LastColumn - 10).Value = .Cells(i + 1, LastColumn - 10).Value Then .Cells(i, LastColumn - 11).Value = "2100" Else .Cells(i, LastColumn - 11).Value = "2101" isFirstRow = True End If End If End With Next i ' 完了メッセージを表示 MsgBox "Bank Statement(編集用)シートの伝票番号が更新されました。", vbInformation, "完了" End Sub
補足
Excel VBAを使用して、2022-10-12
のようなテキスト形式の日付を日付型に変換する方法を以下に示します。
Sub ConvertTextToDate() Dim ws As Worksheet Dim LastRow As Long Dim i As Long Dim SourceData As String Dim ConvertedDate As Date ' シートを設定 Set ws = ThisWorkbook.Worksheets("Bank Statement(編集用)") ' 最終行を取得 LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' テキスト形式の日付を日付型に変換 For i = 2 To LastRow ' ソースデータを取得 SourceData = ws.Cells(i, "F").Value ' テキストを日付型に変換 ConvertedDate = CDate(SourceData) ' 変換した日付をセルに代入 ws.Cells(i, "F").Value = ConvertedDate Next i ' 日付形式に変換されたことを確認 MsgBox "日付形式に変換されました。", vbInformation, "完了" End Sub
指定された条件に従ってK列とJ列の1文字目を除いた20文字を()で閉じた文字を最終列の-1行目に代入します。
' K列とJ列の1文字目を除いた20文字を()で閉じた文字を最終列の-1行目に代入 .Cells(i, LastColumn - 1).Value = .Cells(i, "K").Value & " (" & Mid(.Cells(i, "J").Value, 2, 20) & ")"
K列とJ列の15文字目から22文字目までの文字を()で閉じた文字を最終列の-1行目に代入します。
' K列とJ列の15文字目から22文字目の文字を()で閉じた文字を最終列の-1行目に代入 .Cells(i, LastColumn - 1).Value = .Cells(i, "K").Value & " (" & Mid(.Cells(i, "J").Value, 15, 8) & ")"