该方法的目的是自动化 Excel 数据的更新,根据自定义的标记内容在特定的区域插入、复制、删除数据。通过传递 customList 这个包含多组描述和数据的列表

41 阅读6分钟

方法解析:UpdateExcelData

第三版本
 ''' <summary>
 ''' Excelデータ更新
 ''' </summary>
 ''' <param name="excelApp">excelApp: Excel アプリケーションオブジェクト。操作する Excel アプリケーションのインスタンス。</param>
 ''' <param name="worksheet">worksheet: データを操作する対象のワークシート。</param>
 ''' <param name="range">range: 出力または削除操作で使用するセル範囲を返すための変数。</param>
 ''' <param name="detailColCount">detailColCount: 出力するデータの列数。</param>
 ''' <param name="customList">customList: 書き込むデータとその関連情報を含むリスト。各要素は Tuple 型で、文字列と二次元オブジェクト配列を含む。</param>
 Private Sub UpdateExcelData(ByRef excelApp As Application, ByRef worksheet As Worksheet, ByRef range As Range, customList As List(Of Tuple(Of String, Object(,), Boolean)), Optional detailColCount As Integer = 8)
     Dim sourceRange As Range = Nothing
     Dim targetRange As Range = Nothing

     For index = 0 To customList.Count - 1
         ' 1.インデックスを使用して、各 Tuple を取得
         Dim thirdTuple As Tuple(Of String, Object(,), Boolean) = customList(index)

         ' 2.文字列とデータ配列を抽出
         Dim secondDescription As String = thirdTuple.Item1
         Dim secondDataArray As Object(,) = thirdTuple.Item2
         Dim secondStart As Boolean = thirdTuple.Item3

         ' 3.現在のグループが書き込む必要のある Excel の行数を取得
         Dim rowCount As Integer = If(secondDataArray IsNot Nothing, secondDataArray.GetLength(0), 0)
         ' 4.テンプレートの開始位置を正確に検索、見つからなければ0、見つかれば実際の行数
         Dim markerCell As Range = worksheet.Cells.Find(What:=secondDescription, LookIn:=XlFindLookIn.xlValues, LookAt:=XlLookAt.xlWhole)
         ' 5.テンプレートの開始位置の行数を取得、見つからなければ0、見つかれば実際の行数
         Dim rowNum As Integer = If(markerCell IsNot Nothing, markerCell.Row, 0)

         ' 6書き込むデータの行数が0より大きく、テンプレートの開始位置が見つかれば、データ書き込み行を設定
         If rowCount > 0 AndAlso rowNum > 0 AndAlso secondStart = True Then
             ' 6.1 テンプレートの開始行の2行下から開始: rowNum + 2
             Dim start As Integer = rowNum + 2

             ' 6.2 書き込むデータの行数 > 1 の場合
             If rowCount > 1 Then
                 ' 6.3 行数が1より多い場合、コピーする行を開始、書き込み行 - 1 の行をコピー(テンプレートに既に1行存在するため)
                 ' 6.3.1 コピーする行を選択
                 sourceRange = worksheet.Range($"B{start}").EntireRow
                 ' 6.3.2 行全体をコピー
                 sourceRange.Copy()
                 ' 6.3.3 データ行分の範囲を設定
                 targetRange = worksheet.Range($"B{start + 1}:B{start + 1 + rowCount - 3}").EntireRow
                 targetRange.Insert(XlInsertShiftDirection.xlShiftDown)
                 excelApp.CutCopyMode = False
             End If
             ' 6.3 明細データの出力位置
             range = worksheet.Range($"B{start}")
             range.Resize(rowCount, detailColCount).Value = secondDataArray
         ElseIf secondStart = False And rowNum > 0 Then
             ' 6.4 書き込むデータがなく、テンプレートの位置が見つかる場合、元のデータ書き込み行を削除
             ' 6.4.1 削除範囲を設定
             range = worksheet.Range($"B{rowNum - 1}:B{rowNum + 5}")
             ' 6.4.2 削除範囲を削除
             range.EntireRow.Delete()
         End If
     Next
 End Sub
第二版
  ''' <summary>
  ''' Excelデータ更新
  ''' </summary>
  ''' <param name="excelApp">excelApp: Excel アプリケーションオブジェクト。操作する Excel アプリケーションのインスタンス。</param>
  ''' <param name="worksheet">worksheet: データを操作する対象のワークシート。</param>
  ''' <param name="range">range: 出力または削除操作で使用するセル範囲を返すための変数。</param>
  ''' <param name="detailColCount">detailColCount: 出力するデータの列数。</param>
  ''' <param name="customList">customList: 書き込むデータとその関連情報を含むリスト。各要素は Tuple 型で、文字列と二次元オブジェクト配列を含む。</param>
  Private Sub UpdateExcelData(ByRef excelApp As Application, ByRef worksheet As Worksheet, ByRef range As Range, customList As List(Of Tuple(Of String, Object(,))), Optional detailColCount As Integer = 8)
      Dim sourceRange As Range = Nothing
      Dim targetRange As Range = Nothing

      For index = 0 To customList.Count - 1
          ' 1.インデックスを使用して、各 Tuple を取得
          Dim thirdTuple As Tuple(Of String, Object(,)) = customList(index)

          ' 2.文字列とデータ配列を抽出
          Dim secondDescription As String = thirdTuple.Item1
          Dim secondDataArray As Object(,) = thirdTuple.Item2

          ' 3.現在のグループが書き込む必要のある Excel の行数を取得
          Dim rowCount As Integer = If(secondDataArray IsNot Nothing, secondDataArray.GetLength(0), 0)
          ' 4.テンプレートの開始位置を正確に検索、見つからなければ0、見つかれば実際の行数
          Dim markerCell As Range = worksheet.Cells.Find(What:=secondDescription, LookIn:=XlFindLookIn.xlValues, LookAt:=XlLookAt.xlWhole)
          ' 5.テンプレートの開始位置の行数を取得、見つからなければ0、見つかれば実際の行数
          Dim rowNum As Integer = If(markerCell IsNot Nothing, markerCell.Row, 0)

          ' 6書き込むデータの行数が0より大きく、テンプレートの開始位置が見つかれば、データ書き込み行を設定
          If rowCount > 0 AndAlso rowNum > 0 Then
              ' 6.1 テンプレートの開始行の2行下から開始: rowNum + 2
              Dim start As Integer = rowNum + 2

              ' 6.2 書き込むデータの行数 > 1 の場合
              If rowCount > 1 Then
                  ' 6.3 行数が1より多い場合、コピーする行を開始、書き込み行 - 1 の行をコピー(テンプレートに既に1行存在するため)
                  ' 6.3.1 コピーする行を選択
                  sourceRange = worksheet.Range($"B{start}").EntireRow
                  ' 6.3.2 行全体をコピー
                  sourceRange.Copy()
                  ' 6.3.3 データ行分の範囲を設定
                  targetRange = worksheet.Range($"B{start + 1}:B{start + 1 + rowCount - 3}").EntireRow
                  targetRange.Insert(XlInsertShiftDirection.xlShiftDown)
                  excelApp.CutCopyMode = False
              End If
              ' 6.3 明細データの出力位置
              range = worksheet.Range($"B{start}")
              range.Resize(rowCount, detailColCount).Value = secondDataArray
          ElseIf rowNum > 0 Then
              ' 6.4 書き込むデータがなく、テンプレートの位置が見つかる場合、元のデータ書き込み行を削除
              ' 6.4.1 削除範囲を設定
              range = worksheet.Range($"B{rowNum - 1}:B{rowNum + 5}")
              ' 6.4.2 削除範囲を削除
              range.EntireRow.Delete()
          End If
      Next
  End Sub

方法功能概述:

UpdateExcelData 方法用于根据 customList 中的内容,在 Excel 工作表中找到对应的标记位置,并将数据写入或删除特定范围内的行。

  • excelApp: 代表 Excel 应用程序的实例,用于操控 Excel 文件。
  • worksheet: 目标工作表,在此工作表上进行数据操作。
  • range: 用于传递或返回操作的范围。
  • customList: 包含数据和相关信息的列表,每个元素是一个 Tuple,其中包括一个字符串(描述)和一个二维对象数组(数据)。
  • detailColCount: 数据的列数,默认为 8。

调用方法解析:

第三版
        ' List を定義し、Tuple を含む、String と Object(,) を保存する
        Dim customList As New List(Of Tuple(Of String, Object(,), Boolean))()

        ' データを List に追加
        customList.Add(Tuple.Create("部品入力", data1, True))
        customList.Add(Tuple.Create("出荷使用入力", data2, True))
        customList.Add(Tuple.Create("未使用(在庫に戻す)", data3, False))

        UpdateExcelData(excelApp, worksheet, range, customList, detailColCount)
第二版
        ' List を定義し、Tuple を含む、String と Object(,) を保存する
        Dim customList As New List(Of Tuple(Of String, Object(,)))()

        ' データを List に追加
        customList.Add(Tuple.Create("部品入力", data1))
        customList.Add(Tuple.Create("出荷使用入力", data2))
        customList.Add(Tuple.Create("未使用(在庫に戻す)", data3))
        customList.Add(Tuple.Create("部品入力1", data1))
        customList.Add(Tuple.Create("出荷使用入力1", data2))
        customList.Add(Tuple.Create("未使用(在庫に戻す)1", data3))

        UpdateExcelData(excelApp, worksheet, range, customList, detailColCount)

调用方法说明:

  1. 定义并初始化 customList:

    • 使用 Tuple 将字符串(描述)和数据数组(Object(,))配对,添加到 customList 中。
  2. 调用 UpdateExcelData:

    • 将定义好的 customList 传入 UpdateExcelData 方法中。
    • 通过循环处理 customList 中的每一个 Tuple,根据标记内容(如 "部品入力")精确查找 Excel 中对应的单元格行号。
    • 如果找到并且有数据需要写入,方法将根据该行号,将数据写入 Excel 表格;如果没有数据但找到了标记位置,方法将删除模板中预留的行。

作用:

  • 该方法的目的是自动化 Excel 数据的更新,根据自定义的标记内容在特定的区域插入、复制、删除数据。通过传递 customList 这个包含多组描述和数据的列表,批量更新 Excel 中的多个数据块。