見出し画像

インボイス制度によって複雑化したヤフーショッピングの「受取明細」と「請求明細」を簡単にまとめるシステム

インボイス制度が始まってから、Yahoo!ショッピングの「受取明細」と「請求明細」が項目ごとに分かれており、整理が難しくなっています。
これが、正確であることは理解しますが、80枚近くもあるPDFファイルから一覧を作成するのは非常に困難です。
税理士に依頼しても、恐らく快くは思われないでしょう。
他の出店者の方々はどのように対応されているのでしょうか?

消費税額も無視できる金額ではないため、PDFからデータを抽出して一覧にまとめるシステムを開発しました。

必要なソフトウェア

-Microsoft Excel
-Adobe Acrobat Reader(無料版でOK)

利用方法

Microsoft Excelを開きます。
1行目に以下の項目をAからHまで設定します

  • ファイル名

  • 期間

  • 内容

  • 金額

  • 税率

  • 消費税

  • インボイス番号

  • 会社名

後は、VBAエディタに下記のコードを入力して
「L7」セルにPDFファイルが格納されている「フォルダのパス」を入力し、ボタンを押せば実行します。

流石に工程が多いため、ご連絡いただければ、ボランティアでシステムの完成品を添付したEメールを送信いたします!

動作動画


実行ボタンに仕込むコード

Sub 正方形長方形1_Click()
'
Call change_pdf_to_txt_per_page
Call RemoveSpacesFromTextFiles
Call ListTxtFiles
Call order_number10
Call CopySubstringToColumnCFromB2
Call RemoveTextAndZeroFromColumnB
Call order_number
Call order_number2
Call order_number3
Call RemoveText
Call order_number4
Call RemoveText2
Call UpdateColumnH
Call DeleteRowsBasedOnCellValue
Call DeleteTextFiles
Call Sort
Call InsertBlankRowsInEAndH
Call DrawLineWhenDifferentIncludingBlanks
Call SumUntilBlankInColumnDAndF

MsgBox "完了"

End Sub

PDFファイルをページごとにテキスト化

Sub change_pdf_to_txt_per_page()

Dim objAcroApp As New Acrobat.AcroApp
Dim objAcroAVDoc As Acrobat.AcroAVDoc
Dim objAcroPDDoc As Acrobat.AcroPDDoc
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim lRet As Long
Dim jso As Object
Dim sFolderPath As String
Dim sFileName As String
Dim pageNum As Integer
Dim wordIndex As Integer
Dim pageText As String
Dim wordCount As Integer

' Excelからフォルダパスを取得
sFolderPath = ThisWorkbook.Sheets("実行").Range("L7").Value

' FileSystemObjectを作成
Set objFSO = CreateObject("Scripting.FileSystemObject")
' フォルダを取得
Set objFolder = objFSO.GetFolder(sFolderPath)

' Acrobatアプリケーションを起動する。
lRet = objAcroApp.Show

' 指定されたフォルダ内のすべてのPDFを処理
For Each objFile In objFolder.Files
    If objFSO.GetExtensionName(objFile.Name) = "pdf" Then
        ' PDFファイル名を取得(拡張子なし)
        sFileName = objFSO.GetBaseName(objFile.Name)
        
        ' PDFファイルを開いて表示する。
        Set objAcroAVDoc = New Acrobat.AcroAVDoc
        lRet = objAcroAVDoc.Open(objFile.Path, "")
        
        ' PDDocオブジェクトを取得する
        Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
        
        ' JavaScriptオブジェクトを作成する。
        Set jso = objAcroPDDoc.GetJSObject
        
        ' PDF内のページ数を取得
        Dim numPages As Integer
        numPages = objAcroPDDoc.GetNumPages()
        
        ' 各ページを個別のテキストファイルとして保存
        For pageNum = 0 To numPages - 1
            pageText = ""
            wordCount = jso.getPageNumWords(pageNum)
            
            ' すべての単語の座標を取得し、テキストを組み立てる
            For wordIndex = 0 To wordCount - 1
                Dim quads
                quads = jso.getPageNthWordQuads(pageNum, wordIndex)
                If Not IsNull(quads) Then
                    pageText = pageText & jso.getPageNthWord(pageNum, wordIndex, False) & " "
                End If
            Next wordIndex
            
            ' テキストファイルとしてUnicode(UTF-8)で保存
            Dim txtStream
            Set txtStream = CreateObject("ADODB.Stream")
            txtStream.Charset = "utf-8"
            txtStream.Open
            txtStream.WriteText pageText
            txtStream.SaveToFile sFolderPath & "\" & sFileName & "_" & (pageNum + 1) & ".txt", 2 ' 2 = adSaveCreateOverWrite
            txtStream.Close
        Next pageNum
        
        ' PDFファイルを閉じます。
        lRet = objAcroAVDoc.Close(1)
        
        ' オブジェクトを開放する。
        Set objAcroPDDoc = Nothing
        Set objAcroAVDoc = Nothing
    End If
Next objFile

' Acrobatアプリケーションを終了する。
lRet = objAcroApp.Hide
lRet = objAcroApp.Exit

' オブジェクトを開放する。
Set objFolder = Nothing
Set objFSO = Nothing
Set objAcroApp = Nothing

End Sub

Excelから指定されたフォルダ内のテキストファイルからスペースを削除する

Sub RemoveSpacesFromTextFiles()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = Range("L7").Value

    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"

    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name

            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close

            ' スペースをすべて削除
            textData = Replace(textData, " ", "")

            ' ストリームに書き込んでファイルに保存
            stream.Open
            stream.Charset = "UTF-8"
            stream.WriteText textData
            stream.SaveToFile fileName, 2 ' 2 は SaveCreateOverWrite の意味
            stream.Close
        End If
    Next file
End Sub

指定フォルダ内のテキストファイル一覧をExcelに出力

Sub ListTxtFiles()
    Dim folderPath As String
    Dim txtFile As String
    Dim rowNumber As Integer

    ' L7セルからフォルダパスを取得
    folderPath = Sheets("実行").Range("L7").Value

    ' パスの末尾にバックスラッシュがない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"

    ' 初期設定
    txtFile = Dir(folderPath & "*.txt")
    rowNumber = 2  ' A2セルから開始

    ' フォルダ内の全ての.txtファイルを走査
    Do While txtFile <> ""
        ' ファイル名をエクセルのA列に入力
        Sheets("実行").Cells(rowNumber, 1).Value = txtFile

        ' 次のファイル名を取得
        txtFile = Dir
        rowNumber = rowNumber + 1
    Loop
End Sub

テキストファイル内の特定範囲のデータをExcelに抽出

Sub order_number10()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim startWord As String
    Dim endWord As String
    Dim startPosition As Integer
    Dim endPosition As Integer
    Dim orderDetails As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim lastRow As Long
    Dim matchRow As Long
    Dim ws As Worksheet
    Dim i As Long  ' 追加した変数定義

    ' シートの指定
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて変更する

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = ws.Range("L7").Value
    
    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' 注文番号と注文日の単語を設定
    startWord = "金額"
    endWord = "%"

    ' シート内の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
    
    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name
            
            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close
            
    ' 注文番号から注文日までの文字列を抽出
    startPosition = InStr(textData, startWord) + Len(startWord)
    endPosition = InStr(textData, endWord)
    
    If startPosition > Len(startWord) And endPosition > startPosition Then
        ' 注文詳細を抽出
        orderDetails = Mid$(textData, startPosition, endPosition - startPosition)

        ' 改行を取り除く
        orderDetails = Replace(orderDetails, vbCrLf, "") ' 改行コード (CR+LF)
        orderDetails = Replace(orderDetails, vbCr, "")    ' キャリッジリターン (CR)
        orderDetails = Replace(orderDetails, vbLf, "")    ' ラインフィード (LF)

        ' A列でファイル名と一致する行を探す
        matchRow = 0
        For i = 1 To lastRow
            If ws.Cells(i, 1).Value = file.Name Then
                matchRow = i
                Exit For
            End If
        Next i

        ' 一致する行があればB列にデータを出力
        If matchRow > 0 Then
            ws.Cells(matchRow, 2).Value = Trim$(orderDetails)
        End If
    End If

        End If
    Next file
End Sub

B列から文字列 "2" の位置までの部分文字列をC列にコピーする

Sub CopySubstringToColumnCFromB2()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' シート名を適宜変更してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).row ' B列で最後の行を見つけます

    Dim i As Long
    For i = 2 To lastRow ' B2から開始
        Dim inputValue As String
        inputValue = ws.Cells(i, 2).Value ' B列の各セルを読み込みます

        Dim position As Integer
        position = InStr(inputValue, "2") ' 文字列 "2" が最初に現れる位置を見つけます

        If position > 0 Then
            ws.Cells(i, 3).Value = Left(inputValue, position - 1) ' "2" までの部分文字列を同じ行のC列にコピー
        Else
            ws.Cells(i, 3).Value = inputValue ' "2" が見つからない場合、全ての文字列をコピー
        End If
    Next i
End Sub

文字列から余計な文字列を省く

Sub RemoveTextAndZeroFromColumnB()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて調整してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).row ' C列の最下行を取得

    Dim i As Long
    For i = 2 To lastRow
        Dim cValue As String
        cValue = ws.Cells(i, 3).Value ' C列の値を取得
        Dim bValue As String
        bValue = ws.Cells(i, 2).Value ' B列の値を取得

        ' B列からC列の文字列を削除
        If InStr(bValue, cValue) > 0 Then
            bValue = Replace(bValue, cValue, "")
        End If

        ' B列の最後の文字が「0」の場合、それを削除
        If Right(bValue, 1) = "0" Then
            bValue = Left(bValue, Len(bValue) - 1)
        End If
        
        If Right(bValue, 1) = "1" Then
            bValue = Left(bValue, Len(bValue) - 1)
        End If

        ws.Cells(i, 2).Value = bValue ' 更新されたB列の値をセット
    Next i
    
    

    
End Sub

テキストファイルから特定のキーワード間の文字列をExcelの指定列に抽出

Sub order_number()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim startWord As String
    Dim endWord As String
    Dim startPosition As Integer
    Dim endPosition As Integer
    Dim orderDetails As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim lastRow As Long
    Dim matchRow As Long
    Dim ws As Worksheet
    Dim i As Long  ' 追加した変数定義

    ' シートの指定
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて変更する

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = ws.Range("L7").Value
    
    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' 注文番号と注文日の単語を設定
    startWord = "%"
    endWord = "円"

    ' シート内の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
    
    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name
            
            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close
            
    ' 注文番号から注文日までの文字列を抽出
    startPosition = InStr(textData, startWord) + Len(startWord)
    endPosition = InStr(textData, endWord)
    
    If startPosition > Len(startWord) And endPosition > startPosition Then
        ' 注文詳細を抽出
        orderDetails = Mid$(textData, startPosition, endPosition - startPosition)

        ' 改行を取り除く
        orderDetails = Replace(orderDetails, vbCrLf, "") ' 改行コード (CR+LF)
        orderDetails = Replace(orderDetails, vbCr, "")    ' キャリッジリターン (CR)
        orderDetails = Replace(orderDetails, vbLf, "")    ' ラインフィード (LF)

        ' A列でファイル名と一致する行を探す
        matchRow = 0
        For i = 1 To lastRow
            If ws.Cells(i, 1).Value = file.Name Then
                matchRow = i
                Exit For
            End If
        Next i

        ' 一致する行があればB列にデータを出力
        If matchRow > 0 Then
            ws.Cells(matchRow, 4).Value = Trim$(orderDetails)
        End If
    End If

        End If
    Next file
End Sub

テキストファイル内の特定キーワード間のデータをExcelに特定列に配置

Sub order_number2()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim startWord As String
    Dim endWord As String
    Dim startPosition As Integer
    Dim endPosition As Integer
    Dim orderDetails As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim lastRow As Long
    Dim matchRow As Long
    Dim ws As Worksheet
    Dim i As Long  ' 追加した変数定義

    ' シートの指定
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて変更する

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = ws.Range("L7").Value
    
    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' 注文番号と注文日の単語を設定
    startWord = "%"
    endWord = "%"

    ' シート内の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
    
    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name
            
            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close
            
    ' 注文番号から注文日までの文字列を抽出
    startPosition = InStr(textData, startWord) - 2
    endPosition = InStr(textData, endWord)
    
    If startPosition > Len(startWord) And endPosition > startPosition Then
        ' 注文詳細を抽出
        orderDetails = Mid$(textData, startPosition, endPosition - startPosition)

        ' 改行を取り除く
        orderDetails = Replace(orderDetails, vbCrLf, "") ' 改行コード (CR+LF)
        orderDetails = Replace(orderDetails, vbCr, "")    ' キャリッジリターン (CR)
        orderDetails = Replace(orderDetails, vbLf, "")    ' ラインフィード (LF)

        ' A列でファイル名と一致する行を探す
        matchRow = 0
        For i = 1 To lastRow
            If ws.Cells(i, 1).Value = file.Name Then
                matchRow = i
                Exit For
            End If
        Next i

        ' 一致する行があればB列にデータを出力
        If matchRow > 0 Then
            ws.Cells(matchRow, 5).Value = Trim$(orderDetails)
        End If
    End If

        End If
    Next file
End Sub

テキストファイル内の消費税から合計金額までのデータをExcelに抽出

Sub order_number3()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim startWord As String
    Dim endWord As String
    Dim startPosition As Integer
    Dim endPosition As Integer
    Dim orderDetails As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim lastRow As Long
    Dim matchRow As Long
    Dim ws As Worksheet
    Dim i As Long  ' 追加した変数定義

    ' シートの指定
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて変更する

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = ws.Range("L7").Value
    
    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' 注文番号と注文日の単語を設定
    startWord = "消費税"
    endWord = "合計金額"

    ' シート内の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
    
    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name
            
            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close
            
    ' 注文番号から注文日までの文字列を抽出
    startPosition = InStr(textData, startWord) - 2
    endPosition = InStr(textData, endWord)
    
    If startPosition > Len(startWord) And endPosition > startPosition Then
        ' 注文詳細を抽出
        orderDetails = Mid$(textData, startPosition, endPosition - startPosition)

        ' 改行を取り除く
        orderDetails = Replace(orderDetails, vbCrLf, "") ' 改行コード (CR+LF)
        orderDetails = Replace(orderDetails, vbCr, "")    ' キャリッジリターン (CR)
        orderDetails = Replace(orderDetails, vbLf, "")    ' ラインフィード (LF)

        ' A列でファイル名と一致する行を探す
        matchRow = 0
        For i = 1 To lastRow
            If ws.Cells(i, 1).Value = file.Name Then
                matchRow = i
                Exit For
            End If
        Next i

        ' 一致する行があればB列にデータを出力
        If matchRow > 0 Then
            ws.Cells(matchRow, 6).Value = Trim$(orderDetails)
        End If
    End If

        End If
    Next file
End Sub

Excelの指定範囲から特定テキストを削除

Sub RemoveText()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' "Sheet1"を対象シートの名前に変更してください

    Dim rng As Range
    Set rng = ws.Range("F2:F" & ws.Cells(ws.Rows.Count, "F").End(xlUp).row)

    Dim cell As Range
    For Each cell In rng
        cell.Value = Replace(cell.Value, "消費税", "")
        cell.Value = Replace(cell.Value, "円", "")
    Next cell
End Sub

テキストファイルから事業者登録番号と郵便番号間のデータをExcelに抽出

Sub order_number4()
    Dim folderPath As String
    Dim fileName As String
    Dim textData As String
    Dim startWord As String
    Dim endWord As String
    Dim startPosition As Integer
    Dim endPosition As Integer
    Dim orderDetails As String
    Dim stream As Object
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim lastRow As Long
    Dim matchRow As Long
    Dim ws As Worksheet
    Dim i As Long  ' 追加した変数定義

    ' シートの指定
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて変更する

    ' エクセルのL7セルからフォルダパスを取得
    folderPath = ws.Range("L7").Value
    
    ' 末尾がバックスラッシュでない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' 注文番号と注文日の単語を設定
    startWord = "事業者登録番号:"
    endWord = "〒"

    ' シート内の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).row
    
    ' フォルダ内の各テキストファイルをループ処理
    For Each file In folder.Files
        ' ファイル名が.txtで終わるかをチェック
        If Right(file.Name, 4) = ".txt" Then
            ' テキストファイルの完全パスを取得
            fileName = folderPath & file.Name
            
            ' ADODB.Stream オブジェクトを使用してUTF-8としてファイルを開く
            Set stream = CreateObject("ADODB.Stream")
            stream.Open
            stream.Charset = "UTF-8"
            stream.LoadFromFile fileName
            textData = stream.ReadText
            stream.Close
            
    ' 注文番号から注文日までの文字列を抽出
    startPosition = InStr(textData, startWord) - 2
    endPosition = InStr(textData, endWord)
    
    If startPosition > Len(startWord) And endPosition > startPosition Then
        ' 注文詳細を抽出
        orderDetails = Mid$(textData, startPosition, endPosition - startPosition)

        ' 改行を取り除く
        orderDetails = Replace(orderDetails, vbCrLf, "") ' 改行コード (CR+LF)
        orderDetails = Replace(orderDetails, vbCr, "")    ' キャリッジリターン (CR)
        orderDetails = Replace(orderDetails, vbLf, "")    ' ラインフィード (LF)

        ' A列でファイル名と一致する行を探す
        matchRow = 0
        For i = 1 To lastRow
            If ws.Cells(i, 1).Value = file.Name Then
                matchRow = i
                Exit For
            End If
        Next i

        ' 一致する行があればB列にデータを出力
        If matchRow > 0 Then
            ws.Cells(matchRow, 7).Value = Trim$(orderDetails)
        End If
    End If

        End If
    Next file
End Sub

Excelの指定範囲から"事業者登録番号:"を削除

Sub RemoveText2()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' "Sheet1"を対象シートの名前に変更してください

    Dim rng As Range
    Set rng = ws.Range("G2:G" & ws.Cells(ws.Rows.Count, "G").End(xlUp).row)

    Dim cell As Range
    For Each cell In rng
        cell.Value = Replace(cell.Value, "事業者登録番号:", "")
    Next cell
End Sub

特定の事業者登録番号に基づいて会社名をExcelの列に更新

Sub UpdateColumnH()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' "Sheet1" を対象のシート名に変更してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).row ' G列の最終行を取得

    Dim i As Long
    For i = 1 To lastRow
        If ws.Cells(i, "G").Value = "T4010401039979" Then
            ws.Cells(i, "H").Value = "LINEヤフー株式会社"
        ElseIf ws.Cells(i, "G").Value = "T3180001067019" Then
            ws.Cells(i, "H").Value = "株式会社スズキモータース"
        End If
    Next i
End Sub

特定のセル値を持つ行をExcelで削除

Sub DeleteRowsBasedOnCellValue()
    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long
    Dim i As Long

    ' 対象のシートを設定します(ここでは "Sheet1" としています)
    Set ws = ThisWorkbook.Sheets("実行")

    With ws
        ' A列の最終行を取得
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).row

        ' 最終行から上に向かって検索し、条件に合う行を削除
        For i = lastRow To 1 Step -1
            If .Cells(i, 1).Value = "精算明細" Then
                If rng Is Nothing Then
                    Set rng = .Cells(i, 1)
                Else
                    Set rng = Union(rng, .Cells(i, 1))
                End If
            End If
        Next i

        ' 該当する範囲が存在する場合、行を削除
        If Not rng Is Nothing Then
            rng.EntireRow.Delete
        End If
    End With
End Sub

指定フォルダ内の全テキストファイルを削除

Sub DeleteTextFiles()
    Dim folderPath As String
    Dim file As String

    ' L7セルからフォルダパスを取得
    folderPath = Range("L7").Value

    ' パスの末尾にバックスラッシュがない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"

    ' 指定フォルダ内のテキストファイルを検索
    file = Dir(folderPath & "*.txt")

    ' ファイルが見つかった場合、削除を行う
    Do While file <> ""
        Kill folderPath & file
        file = Dir
    Loop

   
End Sub

Excelで特定の列に基づいて複数条件でデータを昇順に並び替える

Sub Sort()


    Cells.Select
    Range("A2").Activate
    ActiveWorkbook.Worksheets("実行").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("実行").Sort.SortFields.Add2 Key:=Range("B2:B76"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("実行").Sort.SortFields.Add2 Key:=Range("E2:E76"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("実行").Sort.SortFields.Add2 Key:=Range("H2:H76"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("実行").Sort
        .SetRange Range("A1:X76")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub

E列とH列の値が変わる箇所に空白行を挿入

Sub InsertBlankRowsInEAndH()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' シート名を適宜変更してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).row
    Dim lastRowH As Long
    lastRowH = ws.Cells(ws.Rows.Count, "H").End(xlUp).row

    If lastRowH > lastRow Then lastRow = lastRowH

    Dim i As Long
    For i = lastRow To 3 Step -1
        Dim eDiff As Boolean
        eDiff = (ws.Cells(i, "E").Value <> ws.Cells(i - 1, "E").Value) And (ws.Cells(i, "E").Value <> "" Or ws.Cells(i - 1, "E").Value <> "")

        Dim hDiff As Boolean
        hDiff = (ws.Cells(i, "H").Value <> ws.Cells(i - 1, "H").Value) And (ws.Cells(i, "H").Value <> "" Or ws.Cells(i - 1, "H").Value <> "")

        If eDiff Or hDiff Then
            ws.Rows(i & ":" & i + 2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        End If
    Next i

End Sub

E列の値が変わる箇所に、A列からH列まで下線を引く


Sub DrawLineWhenDifferentIncludingBlanks()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' シート名に合わせて調整してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).row

    Dim i As Long
    For i = 2 To lastRow
        If ws.Cells(i, "E").Value <> ws.Cells(i + 1, "E").Value Or ws.Cells(i, "E").Value <> "" Or ws.Cells(i + 1, "E").Value <> "" Then
            ws.Range(ws.Cells(i, "A"), ws.Cells(i, "H")).Borders(xlEdgeBottom).LineStyle = xlContinuous
        End If
    Next i
End Sub

D列とF列に空白までの合計を計算し、両列ともゼロの場合に値をクリアする

Sub SumUntilBlankInColumnDAndF()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") '適宜シート名を変更してください

    ' D列の処理
    SumColumn ws, 4 ' D列は列番号4
    ' F列の処理
    SumColumn ws, 6 ' F列は列番号6
    
    Call ClearZeroValuesOnlyIfBothColumnsAreZero
    
End Sub

' 列に対する合計処理を行うサブルーチン
Private Sub SumColumn(ws As Worksheet, colNum As Integer)
    Dim currentRow As Long
    currentRow = 2 ' 開始行

    Dim sum As Double
    sum = 0

    ' 指定した列の最後の行を取得
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, colNum).End(xlUp).row

    ' 指定した列を下にスクロールして確認
    Do While currentRow <= lastRow
        If IsNumeric(ws.Cells(currentRow, colNum).Value) Then
            sum = sum + ws.Cells(currentRow, colNum).Value
        End If

        ' 次のセルが空欄か、または最終行に達した場合
        If ws.Cells(currentRow + 1, colNum).Value = "" Or currentRow = lastRow Then
            ws.Cells(currentRow + 1, colNum).Value = sum
            sum = 0
            currentRow = currentRow + 2
        Else
            currentRow = currentRow + 1
        End If
    Loop
End Sub


Sub ClearZeroValuesOnlyIfBothColumnsAreZero()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("実行") ' "Sheet1"を対象のシート名に変更してください

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).row

    Dim i As Long
    For i = 1 To lastRow
        If ws.Cells(i, "D").Value = 0 And ws.Cells(i, "F").Value = 0 Then
            ws.Cells(i, "D").ClearContents
            ws.Cells(i, "F").ClearContents
        End If
    Next i
End Sub

この記事が気に入ったらサポートをしてみませんか?