[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.