[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『sheet1のデータを35行おきに1行ずつ、sheet2[P列]に転記する』(まるたん)
はじめまして。VBA初心者です。
ここ最近、業務効率化のためにVBAに取り組み始めましたが、今回どうしても分からなくなってしまったため、お尋ねします。
<前提条件>
・sheet1(wsData) A〜X列、A2から1行ごとに氏名などのデータが入力されている。これが1レコード単位となる。
データは可変するが、最大200程度(A200まで)。
・sheet2(wsPrint)に設定した印刷シート(A2:M35)あり。この印刷シートは上書き出来ず、書式を下に連続しなければならない。
例)A2:M35 ⇒ A36:M36 ⇒ A71:M71
・上記の印刷シートに対し、差し込みコードによる連続印刷は出来る。wsPrintの「A1」にDataのレコードが1枚ずつ差し込まれるようになっている(コード1)。
・書式そのものをコピーし、1枚目の書式下へ追加するコードは他サイトを参考に出来た(コード2)。
<要望・問題点>
・コード1ではwsPrint A1に差し込まれるが、下の書式と連続させたいため、A1に差し込まれるのは避けたい。
印刷に影響のないP列から差し込みたいが、【r.Copy.Range("P1")】とした場合、「実行時エラー1004:コピー領域〜」が発生し、実行できない。
⇒ただのレコード単位差し込みであれば、【P1】差し込みは可能。
・以下の例のようにデータの参照先も同時に移動しているので、データをst2 1枚目用:P1〜AM1、2枚目:P36〜AM36のように35ないし36行おきに1行ずつ飛ばしたい。
<問題のシート>
st1=wsData
A2 B2 C2 X2
1 田中 男 生年月日 …… ●●
2 松田 女 生年月日 …… △△
st2=wsPrint
1枚目
P1 Q1 R1 AM1
1 田中 男 生年月日 …… ●●
st2 コピー書式2枚目
P36 Q36 R36 AM36
2 松田 女 生年月日 …… △△⇒これが出来ない。
<コード1:差し込み>
Public Function オートフィルター基点() As Range '
Set オートフィルター基点 = wsData.Range("A1")
End Function
Public Sub 差し込み印刷_指定()
Dim r As Variant
With wsData
If .AutoFilterMode = True Then オートフィルター基点.AutoFilter '
If .Cells(.Rows.Count, 1).End(xlUp).Row <> 1 Then オートフィルター基点.AutoFilter 1, 1 '
With オートフィルター基点.CurrentRegion
For Each r In .Offset(1, 1).Resize(.Rows.Count - 1, Columns.Count - 1).SpecialCells(xlCellTypeVisible).Rows '
With wsPrint
r.Copy .Range("A1")
.PrintPreview '
End With
Next r
End With
If .AutoFilterMode = True Then オートフィルター基点.AutoFilter
End With
End Sub
<コード2:書式の指定回数コピー>
Sub 書式の指定回数コピー()
Dim TgRng As Range '
Dim rgRows As Long
Dim CopyKaisuu As Long
Dim cot As Long
Set TgRng = Range("A1:M35") '
rgRows = TgRng.Rows.Count
CopyKaisuu = Application.InputBox("コピーする回数を入力して下さい", Type:=1)
If (TgRng.Rows.Count + 1) * (CopyKaisuu + 1) < Rows.Count Then
TgRng.Copy
Application.ScreenUpdating = False
For cot = 1 To CopyKaisuu
With TgRng.Offset((rgRows + 1) * cot, 0)
.PasteSpecial Paste:=xlPasteFormats
.PasteSpecial Paste:=xlPasteFormulas
.PasteSpecial -Paste:=xlPasteAllMergingConditionalFormats
End With
Next
Application.CutCopyMode = False
TgRng(1).Activate
Application.ScreenUpdating = True
End If
Set TgRng = Nothing
End Sub
いろんなサイトや掲示板を頼りに、なんとか書式のコピーまではたどり着きましたが、肝心のデータ転記が一向に出来ません。
勉強不足であり、ご質問に上手く答えられないかもしれませんが、どうか、よい方法をご教授ください。
長々と失礼いたしました。
何卒よろしくお願いいたします。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
なにがやりたくて何ができてないのか全然わかりません
ループ中で貼り付け先を変えればいいんですよね?
i=0 ' カウンタ
For Each r In .Offset(1, 1).Resize(.Rows.Count - 1, Columns.Count - 1).SpecialCells(xlCellTypeVisible).Rows
With wsPrint
r.Copy .Cells(i*36+1,"P") ' ←とかすればいいのでは?
.PrintPreview '
i=i+1
End With
Next r
あと、かすかに分かる書式のコピーですが、
これでよくないですか?
Sub 書式の指定回数コピー()
Dim TgRng As Range '
Set TgRng = Range("A1:M36") ' 下に1行多くとる
CopyKaisuu = Application.InputBox("コピーする回数を入力して下さい", Type:=1)
With TgRng
.Copy
.Resize(.Rows.Count * CopyKaisuu ).PasteSpecial xlPasteAllMergingConditionalFormats
End With
End Sub
CopyKaisuu はフィルタされた行数で自動で求められるような気がしますが
(´・ω・`) 2022/11/02(水) 00:27:44
個人的な考えですが、 VBA初学者にとって、コピペのメソッドは、その後の学習で 混乱しませんか?
非常に便利なものではありますが、 VBAにとって重要な、オブジェクトの概念を阻害しているような 気がするんですよ。
多くの方は、数式含めセルの値が欲しい訳で、罫線や書式丸ごとは、 頻繁に必要としないと思います。
値であれば、
Range("A1").Value = Range("B1").Value
のような記述で値を代入できます。
値を消す場合でも、
Range("A1").ClearContents
より、
Range("A1").Value = ""
の方が、直感的に理解し易いと思うんですね。
この辺を理解すれば、その後の学習に控えている 配列の習得のし易さにも影響すると思うんですよね。
(tkit) 2022/11/02(水) 09:57:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.