[[20080207143349]] 『コピー貼付け時に印刷範囲を指定』(はっぴー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コピー貼付け時に印刷範囲を指定』(はっぴー)
 AファイルのシートをコピーしBファイルのシートに貼付けをする自動マクロを設定して
 います。この時、コピーする行数がいつも同じ行数であれば貼付けされたシートの行数も
 同じになるため印刷時には同じ印刷範囲となりますが、Aファイルのシートの行数が毎回
 変わる場合はその都度Bファイルのシートで印刷範囲の再設定をする必要があります。
 毎回設定しなくても貼付けと同時に印刷範囲も行数に合わせて設定されるようにできない
 ものでしょうか。ちなみにこの例では列数は不変ですが仮に列数が変わる場合も教えてく
 ださい。


 こんなものを仕掛けておいたらどうでしょうか。(ROUGE)

 With Workbooks("B.xls").Sheets("Sheet1")
  .PageSetup.PrintArea = .UsedRange.Address
 End With

 ROUNGEさんご回答ありがとうございました。
 しかしながら、私はマクロは素人でよくわかりません。
 自動でマクロを作成するのは分かりますが、この仕掛けをどの部分に挿入すればいいのか
 皆目見当がつきません。申し訳ありませんがもう少し詳しく教えていただけないでしょうか。
 はっぴー

 見逃していました。
 お返事遅くなり申し訳ございません。

 貼り付けのコードの下に上記コードを入れ込みます。
 (ROUGE)

 ROUNGEさんご回答ありがとうございました。
 しかしながら、私の質問が言葉足らずでしたので肝心なところが抜けていました。
 申し訳ありませんが再度整理してご質問します。

 Aファイルのシート1の形式ですが既に50行目まで罫線が入っています。シートの
 データは更新毎に、20行だったり30行だったり時には60行だったりします。
 罫線がない場合はご回答のとおりにするとうまくいくのですが、罫線があるためB
 ファイルでは50行目までが印刷範囲として固定されてしまいます。Aファイルに50
 行目まで罫線があっても実際にセルに値がある行(20行、30行等)までがコピーさ
 れ、Bファイルに貼り付けられて、印刷範囲もその都度貼り付けられた行数に合わ
 せて変更されるようにしたいのですが、とても難しいでしょうか。

 横から失礼します。(回答にあらず)
ROUNGE さんではなく、ROUGEさんですよ〜    (ぷーのすけ)

 苦し紛れの処理案(汗
 (ROUNGE) ん?
'----
Dim rng As Range, wf As WorksheetFunction
Dim cl() As Long, rw() As Long, i As Long
With Workbooks("B.xls").Sheets("Sheet1")
    ReDim cl(1 To .Rows.Count)
    ReDim rw(1 To .Columns.Count)
    i = 0
    For Each rng In .Range(.Cells(.Rows.Count, 1), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        rw(i) = rng.End(xlUp).Row
    Next
    i = 0
    For Each rng In .Range(.Cells(1, .Columns.Count), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        cl(i) = rng.End(xlToLeft).Column
    Next
    .PageSetup.PrintArea = .Range("A1", .Cells(wf.Max(rw), wf.Max(cl))).Address
End With


 ROUGEさん お名前を間違えて失礼しました。
 ご回答のとおり実行しましたがエラーとなりました。

  実行エラー'91':
   オブジェクト変数またはWithブロック変数が設定されていません。

   箇所:下から2行目
     .PageSetup・・・・・・・の一行

 すみません教えてください。

 携帯からなので検証できませんが、
 Dim wf As WorksheetFunction
 を省略していませんか?
 (ROUGE)

 申し訳ありません。
 何行目を確認すればよいでしょうか。
 ご指摘のコードは見当たりませんが挿入するとしたらどこの場所ですか。
 ちなみに、End With の1行上ではエラーになりました。


 どうもWorksheetFunctionを省略したのがまずかったみたいです。(ROUGE)
 
Dim rng As Range
Dim cl() As Long, rw() As Long, i As Long
With Workbooks("B.xls").Sheets("Sheet1")
    ReDim cl(1 To .Rows.Count)
    ReDim rw(1 To .Columns.Count)
    i = 0
    For Each rng In .Range(.Cells(.Rows.Count, 1), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        rw(i) = rng.End(xlUp).Row
    Next
    i = 0
    For Each rng In .Range(.Cells(1, .Columns.Count), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        cl(i) = rng.End(xlToLeft).Column
    Next
    .PageSetup.PrintArea = Range("A1", Cells(WorksheetFunction.Max(rw), _
        WorksheetFunction.Max(cl))).Address
End With

 ROUGEさんありがとうございます。
 ただ、実行すると「型が一致しません。」のエラーメッセージが表示されます。
 なにか他に問題があるのでしょうか?

 コードのどの部分でエラーになりますか?
 (ROUGE)

 .PageSetup.PrintArea = Range("A1", Cells(WorksheetFunction.Max(rw), _
        WorksheetFunction.Max(cl))).Address

 の部分が黄色表示です。

    .PageSetup.PrintArea = .Range("A1", .Cells(WorksheetFunction.Max(rw), _
        WorksheetFunction.Max(cl))).Address

 としたらどうなりますか?(ROUGE)

 同じエラーメッセージが表示され、同じ部分が黄色表示となりました。

 こちらではエラーにならないんですよね。。。orz
 原因が分からないとどうにも対処しようがありません。
 ちなみに、新規Bookで対象となるオブジェクトをSheets("Sheet1")とした場合、同じエラーはでますか?
 (ROUGE)

 お忙しいのにすみません。
 モジュールに書き込まれた内容は下記のとおりです。
 ROUGEさんに教えてもらった部分以外は自動マクロで作成しています。
 申し訳ありませんが点検をお願いします。

 Cells.Select
    Selection.Copy
    Windows("B.xls").Activate
    Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _
        , Transpose:=False
    Range("A1").Select
    Windows("A.xls").Activate
    Range("A1").Select
    Application.CutCopyMode = False
Dim rng As Range
Dim cl() As Long, rw() As Long, i As Long
With Workbooks("B.xls").Sheets("Sheet1")
    ReDim cl(1 To .Rows.Count)
    ReDim rw(1 To .Columns.Count)
    i = 0
    For Each rng In .Range(.Cells(.Rows.Count, 1), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        rw(i) = rng.End(xlUp).Row
    Next
    i = 0
    For Each rng In .Range(.Cells(1, .Columns.Count), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        cl(i) = rng.End(xlToLeft).Column
    Next
    .PageSetup.PrintArea = .Range("A1", .Cells(WorksheetFunction.Max(rw), _
        WorksheetFunction.Max(cl))).Address

End With

End Sub


 これでどうでしょうか。(ROUGE)
'----
Dim rng As Range
Dim cl() As Long, rw() As Long, i As Long
With Workbooks("B.xls").Sheets("Sheet1")
    .Cells.Value = ActiveSheet.Cells.Value
    ReDim cl(1 To .Rows.Count)
    ReDim rw(1 To .Columns.Count)
    i = 0
    For Each rng In .Range(.Cells(.Rows.Count, 1), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        rw(i) = rng.End(xlUp).Row
    Next
    i = 0
    For Each rng In .Range(.Cells(1, .Columns.Count), _
        .Cells(.Rows.Count, .Columns.Count))
        i = i + 1
        cl(i) = rng.End(xlToLeft).Column
    Next
    .PageSetup.PrintArea = .Range("A1", .Cells(WorksheetFunction.Max(rw), _
        WorksheetFunction.Max(cl))).Address
End With

 同じエラーメッセージが表示されます。同じ部分が黄色表示となります。

 エラーの原因が分からないんですよね。。。

 ところで、コピー先のBook名は、B.xls、Sheet名は、Sheet1 ですか?

 (ROUGE)

 そのとおりです。
 モジュールの内容すべてを載せていますので、間違いないと思います。
 申し訳ないですがよろしくお願いします。

 以下でどのようなメッセージが出ますか?(ROUGE)
'----
Dim rw As Long, cl As Long
With Workbooks("B.xls").Sheets("Sheet1")
    .Cells.Value = ActiveSheet.Cells.Value
    rw = .Rows.Count
    Do While WorksheetFunction.CountBlank _
        (.Cells(rw, 1).EntireRow) = .Columns.Count
        rw = rw - 1
        If rw = 1 Then Exit Do
    Loop
    cl = .Columns.Count
    Do While WorksheetFunction.CountBlank _
        (.Cells(1, cl).EntireColumn) = .Rows.Count
        cl = cl - 1
        If cl = 1 Then Exit Do
    Loop
    MsgBox .Range("A1", Cells(rw, cl)).Address
    '.PageSetup.PrintArea = .Range("A1", Cells(rw, cl)).Address
End With


 「アプリケーション定義またはオブジェクト定義のエラーです。」とメッセージが
 表示されました。
 MsgBox .Range("A1", Cells(rw, cl)).Address 部分が黄色表示です。

 横から失礼します。
 Bブックに貼り付けたデータ範囲内の行列に
 全くの空白行や空白列が無いのであれば
 UsedRange ではなく CurrentRegionを使うのでは駄目ですかね?

 (HANA)

 おっ!そうですね。
 CurrentRegionがいいですね。

 とすると、
 
With Workbooks("B.xls").Sheets("Sheet1")
    .Clear
    ActiveSheet.Range("A1").CurrentRegion.Copy .Range("A1")
    Application.CutCopyMode = False
End With
 
でよいかも。
(ROUGE)

  Cells.Select
     Selection.Copy
     Windows("B.xls").Activate
     Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _
         , Transpose:=False
     Range("A1").Select
     Windows("A.xls").Activate
     Range("A1").Select
     Application.CutCopyMode = False
 With Workbooks("B.xls").Sheets("Sheet1")
     .Clear
     ActiveSheet.Range("A1").CurrentRegion.Copy .Range("A1")
     Application.CutCopyMode = False
 End With
 End Sub

 の .Clear が黄色表示され、「オブジェクトは、このプロパティまたはメソッドをサポートして
 いません。」のエラーメッセージが表示されます。


 ごめんなさい!!!
 いっこプロパティ忘れていました。
 コピーのコードも入れてありますので、これだけでOK(のはず)です。
 (ROUGE)

 With Workbooks("B.xls").Sheets("Sheet1")
     .Cells.Clear
     ActiveSheet.Range("A1").CurrentRegion.Copy .Range("A1")
     Application.CutCopyMode = False
 End With


 ROUGEさん、大変!
 Cells.Clear
 だと、ActiveSheet.Cells.Clear になりませんか?
 違っていたらごめんなさい。
 (seiya)

 うっ!大変だ!!修正!!!(ROUGE)

 ROUGEさん お忙しいところすみません。
 その後、解決策は見つかったでしょうか。

 あれ?上記コードではだめでしたか?
 (ROUGE)

 seiyaさんの言われるとおり、Aファイルのシートが白紙になってしまいます。
 どうしてもうまくいきません。

 いや、seiyaさんの指摘に対応して、コードを直接修正しています。
 (ROUGE)

 ROUGEさん ご指摘のとおりやってみましたが、Bファイルのシートの印刷範囲はAファイルのシートの
 入力セル範囲の行数を変えても同じ範囲で固定しています。

   Aのシートのデータが10行目までならBのシートの10行目までが印刷範囲に

   Aのシートのデータが15行目までならBのシートの15行目までが印刷範囲に

 と言う具合になれば成功なんですが。

 えっと、上記コードはB.xlsのSheet1の内容をすべて消去してから、アクティブシート(A.xlsファイル?)
 のA1から続く範囲をB.xlsのSheet1に貼り付けています。
 これで対応できないとなると、σ(^-^;)には打つ手なしです。。。orz
 (ROUGE)

 ROUGEさん ActiveSheet.Cells.Clear にするとAファイルは消去されます。
 したがって、.Cells.Clear でやると上記のようになります。
 いずれにしてもBファイルの印刷範囲は固定したままで変化ありません。 

 え?提示したコードには ActiveSheet.Cells.Clear はありませんよ。
 Workbooks("B.xls").Sheets("Sheet1").Cells.Clear はありますが。
 (ROUGE)

 またまた横から失礼します。

 ROUGEさんのコードは
 印刷範囲を変更する物では【有りません】
 その点はご理解して頂けておりますか?

 これまでは
 例えば、ブックAのデータがA1:A3の場合でも
 このシート全体を選択し、コピー
 ブックBのシートに貼り付けを行い
 印刷範囲を設定して居られたのですよね?

 その理由として、A1:A50まで罫線が引かれており
 印刷したときに罫線だけのA4:A50が印刷されて仕舞う為ですよね。

 ROUGEさんのコードは
 ブックAのデータがA1:A3の範囲しか無い場合は
 その範囲だけをブックBに貼り付ける

 と言う物です。
 A1:A3の範囲しか貼り付けられないので、
 印刷範囲の設定をする必要も無いと思います。

 こちらからははっぴーさんのブックの状況が分かりませんので
 少し教えていただきたいのですが
 1.ROUGEさんのマクロを実行したときに、ブックAのデータが有る範囲のみが
   ブックBに貼り付いているか?
   それとも、罫線だけのセルも貼り付いているか?

 2.1番でデータの有る範囲のみが貼り付いている場合。
   印刷範囲の設定を解除した状態で印刷すると
   欲しい場所だけが印刷されるか?

 3.1番で罫線だけのセルも貼り付いている場合。
   ブックAのデータがどの様に表示されている物か。
   (手入力・インポート・関数で参照 等)
   また、何の範囲を印刷範囲とするのか。
   (A列が「""」になったとき 等)

 まずは、ROUGEさんのコードに手を加えず
 データの入ったブックA と、Sheet1の有るブックBを作成し
 ブックAの標準モジュールにコードをペースト
 ブックAのデータの有るシートをアクティブにした状態で
 マクロを実行した結果のご報告を載せてみてください。

 (HANA)


 下から失礼します。
こんな感じではどうでそ。
Sub Test()
Dim Obj_LastRow As Object, Obj_LastCol As Object
Dim lng_LastRow As Long, lng_LastCol As Long
Dim str_LastRng As String
With Workbooks("B.xls").Sheets("Sheet1")
    'ブックAのシート1の全てを、ブックBのシート1に貼り付け
    Workbooks("A.xls").Sheets("Sheet1").Cells.Copy Destination:=.Range("A1")
    'ブックBの入力された最終行を変数に代入
    Set Obj_LastRow = .Cells.Find("*", , , , xlByRows, xlPrevious)
    'ブックBの入力された最終列を変数に代入
    Set Obj_LastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious)
    '何も入力されていなかったら処理を終了
    If Obj_LastRow Is Nothing Then Exit Sub
    '最終行の行数を変数に代入
    lng_LastRow = Obj_LastRow.Row
    '最終列の列数を変数に代入
    lng_LastCol = Obj_LastCol.Column
    '最終列、最終行(最後のセル番地)を変数に代入
    str_LastRng = Cells(lng_LastRow, lng_LastCol).Address
    'シートBの入力された範囲を印刷範囲に設定
    .PageSetup.PrintArea = "$A$1:" & str_LastRng
End With
Set Obj_LastRow = Nothing
Set Obj_LastCol = Nothing
End Sub

 (川野鮎太郎)

 HANAさん お世話になります。
 ご質問についてお答えします。
 1.については「データが有る範囲のみ」が貼り付いています。
 2.については「欲しい場所だけ印刷」されています。

 Aのシートのデータのある行数を変えても、欲しい場所だけが貼り付けられます。

 川野鮎太郎さん お世話になります。
 ご教示いただいたコードを貼付けてみましたが、Aのシートのデータのない罫線のみの
 50行目までBのシートに貼り付きます。


 >Aのシートのデータのない罫線のみの50行目までBのシートに貼り付きます
 そんなコードは書いてないと思うんですが・・・(多分)
 紛らわしくなっても困るでしょうから、私のは( 。・・)/⌒□ポイ しておいてください。
 (川野鮎太郎)

 >Aのシートのデータのある行数を変えても、
 >欲しい場所だけが貼り付けられます。
 と言う事ですが、それで その動きは
 ご希望のことを満たしていませんでしょうか?

 あくまでも、印刷範囲の設定を行いたいのでしょうか?
 それとも、実際は他の処理も行っており 利用できないのでしょうか?

 (HANA)

 貼り付けられた「Bファイル」のデータは毎回行数が変わるため印刷範囲の設定も新たな行数の範囲となるよう
 になればと思っています。
 また、お尋ねしているファイルではシート1のみですが実際に使っているものはシートが複数あるため各シート
 の最後にこのコードを挿入するのかすべての最後に挿入するのかも併せて教えてください。

 印刷したい部分しかコピペしていないので、印刷範囲の設定は不要だと思います。
 シートが複数になっても仕様が一緒なのであれば、対応も一緒になりますよ。
 (ROUGE)

 ROUGEさんよろしくお願いします。
 これまでAファイルのシート1での例としてお聞きしましたが、実際にこちらで使用するファ 
 イルには
 複数のシートが作成されています。したがって、[With Workbooks("B.xls").Sheets  ("Sheet1")]の
 Sheetの部分についてはどのように変更すればよろしいでしょうか。

 最初に
 >AファイルのシートをコピーしBファイルのシートに貼付けをする自動マクロを設定しています。
 と書いて居られますがその時はどの様にしていたのですか?

 (HANA)

 お尋ねの件ですが、以下のようにマクロ設定しています。

 Selection.Copy
    Windows("B.xls").Activate
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Windows("A.xls").Activate
    Sheets("31").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("B.xls").Activate
    Sheets("31").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Windows("A.xls").Activate
    Sheets("32").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("B.xls").Activate
    Sheets("32").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Windows("A.xls").Activate
    Sheets("33").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("B.xls").Activate
    Sheets("33").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    Windows("A.xls").Activate
    Sheets("34").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("B.xls").Activate
    Sheets("34").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
  End Sub
  
 

 コードだけでは良く分かりません。
 どこをコピーして、どこに貼り付けるコードなのですか?
 言葉も使って教えて下さい。

 ↑がマクロの記録のコードの場合は
 どの様な手順を記録にしたのか教えて下さい。

 (HANA)

 自動マクロを利用して、Aファイルの“31シート全体”をコピーし、Bファイルの“31シート全体”に
 値の貼付け(Aファイルには関数を使用した数値があるため)で貼り付けています。
 以下同様に“32シート”“33シート”を貼り付けています。

 こんなので上手く行きますか?

 '------
Dim sn, msn
sn = Array("31", "32", "33", "34")
For Each msn In sn
With Workbooks("B.xls").Sheets(msn)
    .Cells.Clear
    Workbooks("A.xls").Sheets(msn).Range("A1").CurrentRegion.Copy .Range("A1")
    .Range("A1").CurrentRegion.Value = .Range("A1").CurrentRegion.Value
    Application.CutCopyMode = False
End With
Next
 '------

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.