fix: テーブルResizeでヘッダのみ(1行)への一時縮小がExcelにエラーとして拒否される問題を修正

前回のDataBodyRange Nothing対策で「一旦ヘッダ行のみにリサイズ」する方式にしたところ、
「テーブルには1行以上のデータが必要」という理由でExcel側にResize自体を拒否されるケースがあった。
現在の行数・目的の行数のいずれとも確実に異なる一時サイズ(rows.count+現在行数+1等)を経由する方式に変更し、
常に1行以上のデータ行を含んだ状態でリサイズすることで回避。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kenichiro NOGI 2026-09-18 19:01:05 +09:00
parent e879b0f584
commit 49ef4c5358

View File

@ -240,7 +240,9 @@ Function exportCSVDataToSheet(csvData As Variant, targetSheet As String)
' テーブルにデータを追加(ヘッダ行(arr(0,*))を除いたデータ部分のみをDataBodyRangeに書き込む ' テーブルにデータを追加(ヘッダ行(arr(0,*))を除いたデータ部分のみをDataBodyRangeに書き込む
'直前と同一サイズへのResizeだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、 '直前と同一サイズへのResizeだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、
'一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す '一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す
tbl.Resize tbl.Range.Resize(1, maxCols) Dim tempRows As Long
tempRows = tbl.Range.Rows.count + rows.count + 1
tbl.Resize tbl.Range.Resize(tempRows, maxCols)
tbl.Resize tbl.Range.Resize(rows.count, maxCols) tbl.Resize tbl.Range.Resize(rows.count, maxCols)
Dim dataArr() As Variant Dim dataArr() As Variant
@ -545,7 +547,9 @@ Function getRecordsDataToSheet(records As Collection, targetSheet As String)
'テーブル範囲が直前と同一サイズだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、 'テーブル範囲が直前と同一サイズだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、
'一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す '一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す
tbl.Resize tbl.Range.Resize(1, maxCols) Dim tempRows As Long
tempRows = tbl.Range.Rows.count + flatRecords.count + 2
tbl.Resize tbl.Range.Resize(tempRows, maxCols)
tbl.Resize tbl.Range.Resize(flatRecords.count + 1, maxCols) tbl.Resize tbl.Range.Resize(flatRecords.count + 1, maxCols)
Debug.Print " [DEBUG] tbl.Range.Address (after resize) = " & tbl.Range.Address Debug.Print " [DEBUG] tbl.Range.Address (after resize) = " & tbl.Range.Address
Debug.Print " [DEBUG] tbl.DataBodyRange Is Nothing (after resize) = " & (tbl.DataBodyRange Is Nothing) Debug.Print " [DEBUG] tbl.DataBodyRange Is Nothing (after resize) = " & (tbl.DataBodyRange Is Nothing)
@ -710,7 +714,9 @@ Function exportCSVDataToExistingTable(csvData As Variant, tableName As String)
'直前と同一サイズへのResizeだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、 '直前と同一サイズへのResizeだとExcelがDataBodyRangeの内部状態を更新しないことがあるため、
'一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す '一旦ヘッダ行のみにリサイズしてから目的のサイズにリサイズし直す
tbl.Resize tbl.Range.Resize(1, maxCols) Dim tempRows As Long
tempRows = tbl.Range.Rows.count + rows.count + 1
tbl.Resize tbl.Range.Resize(tempRows, maxCols)
tbl.Resize tbl.Range.Resize(rows.count, maxCols) tbl.Resize tbl.Range.Resize(rows.count, maxCols)
Dim dataArr() As Variant Dim dataArr() As Variant