• ベストアンサー

Excel VBA

今、Excel2000で作成したEXcelブックをExcel2007でも正常に動作するか確認しています。 伝票のようなもので、枠内に数字を記入後、保存する際に別のブックにセルの全コピーしてから保存するようになっているのですが、Excel2007で実行すると列幅と行幅がコピーされません。 Set NewBook = Workbooks.Add Workbooks(ThisWorkbook.Name).Sheets("伝票").Cells.Copy NewBook.Sheets("Sheet1").Activate ActiveSheet.Paste Excel2003で動かしたときは、大丈夫でした。 原因がわかりません。コピーの仕方がいけないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

#2です。 ではこれでどうでしょう?今、2000と2007で試しました。 Paste:=8 としたのは、Paste:=xlPasteColumnWidthsでは2000の場合、エラーになるためです。 Sub test03() ThisWorkbook.Sheets("伝票").Cells.Copy Set NewBook = Workbooks.Add With ActiveSheet .Paste .Cells.PasteSpecial Paste:=8 Application.CutCopyMode = False x = .UsedRange.Cells(.UsedRange.Count).Row For i = 1 To x .Rows(i).RowHeight = ThisWorkbook.Sheets("伝票").Rows(i).RowHeight Next End With End Sub

その他の回答 (4)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

こんにちは。 > 作成したシートからはマクロを除外することになっています。 ということは、シートにはコントロール等を貼り付けてないようですね。 > シートの複製ですとそのシートのマクロも複製されますよね。 シートモジュール内の大抵の事(イベントも含む)は、ThisWorkbook など 他モジュールに置き換えることができます。 例えば、Sheet1 シートに次のようなコードがあったとすると、 ' // Sheet1 モジュール Private Sub Worksheet_Change(ByVal Target As Range)   Dim r As Range   Application.EnableEvents = False   For Each r In Target.Cells     If Not r.HasFormula Then       r.Value = StrConv(r.Value, vbNarrow)     End If   Next r   Application.EnableEvents = True End Sub この内容は、ThisWorkbook に次のように置き換えることができます。 ' // ThisWorkbook モジュール Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)   Dim r As Range   If Sh.Name = "Sheet1" Then       '<-- Sheet1 だけで動かすので追加     Application.EnableEvents = False     For Each r In Target.Cells       If Not r.HasFormula Then         r.Value = StrConv(r.Value, vbNarrow)       End If     Next r     Application.EnableEvents = True   End If End Sub すると、Sheet1 に書いたマクロは不要になりますので、削除できます。 シートにコードを書かなければ、シートのコピーで解決できるのでは? 今回のご質問のように、提出用ファイルはマクロ禁止といったケースは 非常に多いです。したがって、提出が前提になるようなモノでは、最初から なるべくシートモジュールを使わないようにすると良いですよ。

yoro4423
質問者

お礼

ご返答ありがとうございました。

  • hotosys
  • ベストアンサー率67% (97/143)
回答No.3

理由はわからないが「97-2003ブック」で保存したもの([互換モード])の場合おかしくなるみたい。 2007形式で保存してみては?

yoro4423
質問者

お礼

返答ありがとうございました。

yoro4423
質問者

補足

旧バージョンでも、動作されなければいけないんです。 一応、対応策として次のようにしました。 セルコピーした場合、別ブックのシートにに張り付けると行・列幅が崩れますが、同ブック内のシートに貼り付けた場合は、崩れませんでした。なので、一度、同ブック内のシートにセルコピーしてから、そのシートを別ブックに移動させることにしました(シートの移動では崩れないので)。こうすれば、マクロも除外できると思います。面倒ですがしかたありません。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

コピーペーストするのではなく発想をかえて Sub test02() Workbooks(ThisWorkbook.Name).Sheets("伝票").Copy Set NewBook = ActiveWorkbook End Sub ではいかがでしょう?

yoro4423
質問者

お礼

早いお返事ありがとうございました。

yoro4423
質問者

補足

すみません。条件がありまして、作成したシートからはマクロを除外することになっています。シートの複製ですとそのシートのマクロも複製されますよね。なので、シートではなく、セルのコピーにしました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Pasteを形式を選択して貼り付けの PasteSpecialに変更してみてはいかがでしょう ActuiveSheet.Range(A1").PasteSpetial Paste:=xlPasteAll, Operation:=xlNone, _   SkipBlanks:= False, Transpose:=False といった具合ですが ・・・

yoro4423
質問者

お礼

早いお返事ありがとうございました。

yoro4423
質問者

補足

私も、上記と同じ方法を試しました。が、ダメでした。ならばと一度、 Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False として、列幅をコピー、貼り付けしてから、再度セルの全コピーをすれば、列幅のコピーはできました。 しかし、「形式を選択して貼り付け」には、行幅の貼り付けがないので、列幅のようにはいきません。