Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
シートをまるっとコピーしたときの書式の継承について(セル幅一部未継承の謎)
投稿日時: 20/06/30 17:35:25
投稿者: QooApp

こんにちはお世話になります。
 
シートAをコピーし、寸前で新規作成した新規シートBに張り付けました。
ざっくりプログラムで下記のように書いてます
 
シートA.copy(シートB)
 
フォント サイズ セル幅 色 格子 値 その他もろもろ基本的に完全に継承されるものと存じます。
 
そのはずなのですが、セル幅がEM列以降どうやら継承されていない状態です。
シートAの状態ではEM以降も作業者の作業結果の関係でセル幅が増減したファイルなのですが、
コピーBにはEM以降のセル幅が規定値72pxに戻っております。
 
EM列以降にはデータがないのでは? > まばらですが何行か入っておりました。
※ただし、セル幅が長いセルにおいて、その量の長い文字情報は入っていませんでした。
 
★シートAとBは別々のブックかつ、シートAのブックは97-2003書式の.xlsで保存されているファイルです。
シートBを含むファイルは2013書式の.xlsmです。操作プログラムはこちらに入っています。
これが原因かもしれませんが、確認する方法がで思いつきませんでした。
 
 
困るほどではないのですが、謎なのでもしご存じのかたがいらっしゃいましたらよろしくお願いします。
 

投稿日時: 20/06/30 17:37:52
投稿者: QooApp

追記
 
未継承が発覚したのは列側です。行側は問題なかったようです。
差分の確認にはwinMergeを使用しました。
 
ただ、目視でもがっつりわかるレベルです。100pxとか200pxとか結構大きなセルです。

回答
投稿日時: 20/06/30 18:20:49
投稿者: WinArrow
投稿者のウェブサイトに移動

あなたが考えていることと、記述したコードが違っている
くらいしか思いつかないけど・・
 
実際のコードを掲示しましょう。
 

投稿日時: 20/07/01 13:36:33
投稿者: QooApp

お返事が遅くなり申し訳ございません。
 
記述のプログラムは下記です。
前後無関係な処理ばっかりですので抜粋1行としましたが、足りますでしょうか。
Workbooks(fileName).Worksheets(sheetName).Copy after:=ThisWorkbook.Worksheets("sheet1")
 
コピー作業自体は正常です。
が、コピーもとのセル幅(列方向)が継承されませんでした。

回答
投稿日時: 20/07/01 14:15:54
投稿者: simple

引用:
シートAをコピーし、寸前で新規作成した新規シートBに張り付けました。
ざっくりプログラムで下記のように書いてます
シートA.copy(シートB)

引用:
Workbooks(fileName).Worksheets(sheetName).Copy after:=ThisWorkbook.Worksheets("sheet1")

前者のコードであれば、
シートA.copy(シートB)とすると、Before:=シートBと書いたものと見なされます。
 
同一性が保証されるのは、
シートA と、シートB の 前(左)に新たに作られたシートAのコピーであって、
シートBはなんら比較の対象とするものではありません。
いずれにしても、シートBはコピーシートの位置指定に関係するだけで、
内容は何の関係もありません。
 
後者の場合は、
ThisWorkbook.Worksheets("sheet1")の後ろにコピーされるのであって、
ThisWorkbook.Worksheets("sheet1")の内容とは何の関係もありません。
比較の対象ではありません。

投稿日時: 20/07/01 14:35:37
投稿者: QooApp

simple さんの引用:
引用:
シートAをコピーし、寸前で新規作成した新規シートBに張り付けました。
ざっくりプログラムで下記のように書いてます
シートA.copy(シートB)

引用:
Workbooks(fileName).Worksheets(sheetName).Copy after:=ThisWorkbook.Worksheets("sheet1")

前者のコードであれば、
シートA.copy(シートB)とすると、Before:=シートBと書いたものと見なされます。
 
同一性が保証されるのは、
シートA と、シートB の 前(左)に新たに作られたシートAのコピーであって、
シートBはなんら比較の対象とするものではありません。
いずれにしても、シートBはコピーシートの位置指定に関係するだけで、
内容は何の関係もありません。
 
後者の場合は、
ThisWorkbook.Worksheets("sheet1")の後ろにコピーされるのであって、
ThisWorkbook.Worksheets("sheet1")の内容とは何の関係もありません。
比較の対象ではありません。

 
申し訳ございませんでした。おっしゃる通り、シートB部は別シートですね
勘違いしておりました。
 
はりつけた場合はactiveシートが正しいシートですね。
申し訳ございません。
 
値は完全一致しておりますが、やはり幅情報は継承されていないように見えます。
これはもう元のシートからA列は何ピクセル〜と参照してきて必要な列の数だけfor文でくりかえし、書式設定しかない感じでしょうか。

回答
投稿日時: 20/07/01 15:18:24
投稿者: simple

検索したら似た話がありますね。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel2013/3f1adea9-ee00-43e8-a17b-5cffe64b3cb2
 
原因不明のようですが。
古い形式のExcelブックを継承するケースが原因のひとつとして推測されているようです。

投稿日時: 20/07/01 15:20:37
投稿者: QooApp

なるほど、たしかにマクロの環境はエクセル2013のxlsmです。
インポート(シートAのファイル)は97-2003形式のxlsです。
 
バージョン違いによる継承バグ
それが原因と考えるのが妥当そうですね。

投稿日時: 20/07/01 16:16:51
投稿者: QooApp

皆様申し訳ありません。
 
原因がわかりました。
 
winMergeが反応していたのはセル幅ではなく、シート全体サイズだということでした。
 
おかしいなと思って全行程修正中、
複製したシート情報を保存する形式を元データの97-2003に合わせてxlsとしたところ、
winMergeが反応しなくなりました。
 
原因はシート全体の最大サイズの違いによる相対的な比較不可が原因のようでした。
たしかに無いセルの幅は不一致扱いになってしまうなと思い不注意でした。
 
さまざまなご意見ありがとうございます。解決しました。