こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBA

今、Excel2000で作成したEXcelブックをExcel2007でも正常に動作するか確認しています。
伝票のようなもので、枠内に数字を記入後、保存する際に別のブックにセルの全コピーしてから保存するようになっているのですが、Excel2007で実行すると列幅と行幅がコピーされません。

Set NewBook = Workbooks.Add

Workbooks(ThisWorkbook.Name).Sheets("伝票").Cells.Copy
NewBook.Sheets("Sheet1").Activate
ActiveSheet.Paste

Excel2003で動かしたときは、大丈夫でした。
原因がわかりません。コピーの仕方がいけないのでしょうか。

投稿日時 - 2008-07-10 10:26:49

QNo.4165219

困ってます

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

#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

投稿日時 - 2008-07-10 14:38:25

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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 に書いたマクロは不要になりますので、削除できます。
シートにコードを書かなければ、シートのコピーで解決できるのでは?

今回のご質問のように、提出用ファイルはマクロ禁止といったケースは
非常に多いです。したがって、提出が前提になるようなモノでは、最初から
なるべくシートモジュールを使わないようにすると良いですよ。

投稿日時 - 2008-07-11 13:17:22

お礼

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

投稿日時 - 2008-07-18 16:51:08

ANo.3

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

投稿日時 - 2008-07-10 13:27:30

補足

旧バージョンでも、動作されなければいけないんです。
一応、対応策として次のようにしました。

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

投稿日時 - 2008-07-11 10:14:39

お礼

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

投稿日時 - 2008-07-11 10:22:15

ANo.2

コピーペーストするのではなく発想をかえて

Sub test02()
Workbooks(ThisWorkbook.Name).Sheets("伝票").Copy
Set NewBook = ActiveWorkbook
End Sub

ではいかがでしょう?

投稿日時 - 2008-07-10 11:03:14

補足

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

投稿日時 - 2008-07-10 13:10:13

お礼

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

投稿日時 - 2008-07-11 10:14:27

ANo.1

Pasteを形式を選択して貼り付けの PasteSpecialに変更してみてはいかがでしょう

ActuiveSheet.Range(A1").PasteSpetial Paste:=xlPasteAll, Operation:=xlNone, _
  SkipBlanks:= False, Transpose:=False

といった具合ですが ・・・

投稿日時 - 2008-07-10 10:46:17

補足

私も、上記と同じ方法を試しました。が、ダメでした。ならばと一度、

Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

として、列幅をコピー、貼り付けしてから、再度セルの全コピーをすれば、列幅のコピーはできました。

しかし、「形式を選択して貼り付け」には、行幅の貼り付けがないので、列幅のようにはいきません。

投稿日時 - 2008-07-10 13:23:06

お礼

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

投稿日時 - 2008-07-11 10:13:33

あなたにオススメの質問