方法解析: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)
调用方法说明:
-
定义并初始化
customList:- 使用
Tuple将字符串(描述)和数据数组(Object(,))配对,添加到customList中。
- 使用
-
调用
UpdateExcelData:- 将定义好的
customList传入UpdateExcelData方法中。 - 通过循环处理
customList中的每一个Tuple,根据标记内容(如 "部品入力")精确查找 Excel 中对应的单元格行号。 - 如果找到并且有数据需要写入,方法将根据该行号,将数据写入 Excel 表格;如果没有数据但找到了标记位置,方法将删除模板中预留的行。
- 将定义好的
作用:
- 该方法的目的是自动化 Excel 数据的更新,根据自定义的标记内容在特定的区域插入、复制、删除数据。通过传递
customList这个包含多组描述和数据的列表,批量更新 Excel 中的多个数据块。