エクセル | の学校 |
8.一覧 | 9.HOME |
1.Top | 2.Last |
『印刷後別シートの指定の場所に転記』(neee)
VBA初心者のため何もわからずに投稿してます すみません😭
Excelのシート1の一部B2のセルのみと 指定行B9からN9の範囲からB17からN17までの 範囲に入力されたものを別シートにに転記する という作業をしたいと考えています。 (転記後の部分も指定の場所が希望で B2のセルはC36、B9からN9の範囲は 別シートのD36からQ36の範囲に転記)
その後にシート1の入力した部分をリセットし、 新たにシート1で入力したもの (先ほどと同じ部分) を最初に転記された別シートの下にに蓄積して 転記したいと考えています。
独学で始めるにはかなり難しく、お力を貸して いただければすごく助かります🙇♀️ よろしくお願いします🥺
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
Option Explicit Sub Tenki01() Dim r1, ws1, ws2, lr&, v() Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") Set r1 = ws1.Range("B9:N17") lr = ws2.Cells(Rows.Count, 4).End(xlUp).Row + 1 If lr < 36 Then lr = 36 v = r1.Value With ws2 .Cells(lr, 3) = ws1.Cells(2, 2) .Cells(lr, 4).Resize(UBound(v, 1), UBound(v, 2)) = v End With Erase v End Sub あわててかいたので、間違ってるかも。。。← 言い訳 ^^; m(__)m (隠居Z) 2024/04/18(木) 20:48:13
別シート(転記先)は新規って名前にしてて 元々のシートは発注にしてます。 (neee) 2024/04/18(木) 20:57:22
1.罫線は発注シートに引いて有るのでしょうかそれとも新規シートで引くのでせうかね 2.発注シート転記対象範囲の数式の有無ですが、もし有れば値変換でいいですか。 3.発注シート転記対象範囲の最初の行の「項目名でしょうか、」転記時の扱いは?
1.について、前者なら配列止めて、コピペにすればOK、後者なら罫線引くだけなので。
あとは。。。印刷なら印刷、更新は、更新、ボタン配置ならボタン等々、お困りの箇所を個別に 各シートの詳細情報と共に、ご相談賜れば、何かお手伝いくらいは出来るかもしれません。 たのご回答者様のアドバイスもお待ちくださいませ。でわ m(__)m
(隠居Z) 2024/04/19(金) 09:11:00
お手数をおかけしますが教えて欲しいです🙇♀️ (neee) 2024/04/19(金) 10:31:40
丸ごと、標準モジュールにコピペしていたけてますぅ ご確認をm(__)m (隠居Z) 2024/04/19(金) 13:49:31
sub
ここにコード
end sub
が 正常ですが
コード
sub
end sub の様な感じでプロシジャーの外に処理内容が記述されている場合に発生いたします。 エラーの内容が変化したのでしたら 黄色く反転したコードをこちらにコピペしていただけますか。 m(__)m (隠居Z) 2024/04/19(金) 15:27:59
(隠居Z) 2024/04/19(金) 09:11:00に対するお返事も戴いておりませんので わたしはここまでとさせていただきます。引き続き他の回答者様のアドバイス をお待ちくださいませ。でわ、頑張ってくださいね。 m(__)m
Option Explicit Sub Tenki02() Dim i&, r1, r, wS1, wS2, lR&, rNtx Set wS1 = Worksheets("発注") Set wS2 = Worksheets("新規") Set r1 = wS1.Range("B2,B9,D9,J9,M9,S9,V9") rNtx = Split("C,D,E,G,H,I,J", ",") lR = wS2.Cells(Rows.Count, 4).End(xlUp).Row + 1 If lR < 36 Then lR = 36 With wS2 For Each r In r1 r.Copy .Range(rNtx(i) & lR) i = i + 1 Next End With Erase rNtx End Sub (隠居Z) 2024/04/20(土) 10:18:04
横入失礼。 ・また新たに"発注"シートのB2,B9,D9,J9,M9,S9,V9セルに入力して、 ・もういちどマクロを実行すれば、 ・"新規"シートの次の行に転記される、 ということになっていると思いますけど、 そういうことではなかったんですか?
そういう話でなかったのなら、改めて説明されたらいかがですか? そうすればコメントがあるかもしれません。
(xyz) 2024/04/22(月) 17:10:36
(neee) 2024/04/22(月) 19:16:09
私も横からですが何点か。
■1 >ただ転記されるのが1行のみで、他の行が転記出来ないです セルの表現が独特なのでボタンの掛け違いがおこっているように思います。
シート1のB2のセル → 別シートのC36 シート1のB9からN9セル → 別シートのD36からQ36
多分↑のように受け取られているけど実際には↓じゃないですか?
発注シートのB2のセル → 新規シートのC36 発注シートのB9からN17セル → 新規シートのD36からQ44 ~~ ~~
■2 上記が正しいとするとデータは最大で9行あるわけですが、例えば「B9:N12」(つまり4行分)しかデータがないものを転記した場合、【次のデータ】はどこに転記するのですか?
あくまで9行1セットにするならば、45行目以降に出力すればよいですが、そうでない場合は40行目以降にしないとダメですよね? すなわち、貼付(転記)先が変わりますから、その点ははっきりさせるべきでしょう。
■3 >VBA初心者のため何もわからず〜 ↑とのことですが、仰ることをまとめると↓のようになるとおもいます。
1. 発注シートをプリントアウトする 2. 貼り付けるべき(新規シートの)行を特定する 3. 発注シートのB2のセルをコピーして(新規シートに)貼り付ける 4. 発注シートのB9からN17セルをコピーして(新規シートに)貼り付ける 5. (新規シートの)罫線を設定する 6. 発注シートの特定セルをクリアする
このうち、2以外は【マクロの記録】で必要な命令を調べることができます。 まずは、そちらから手を付けてみては如何でしょうか?
(もこな2 ) 2024/04/22(月) 19:21:34
| 転記したいのは発注シートのB9.D9.J9.M9.S9.V9の部分を | 新規別シートのD36.E36.G36.H36.I36.J36に転記 | したいと考えてます。 | (B9がD36のように前から転記したい部分は順に並べてます) | またその列が複数になるのでB16.D16の列まで必要です。
この表現で、 | B9〜16.D9〜16.J9〜16.M9〜16.S9〜16.V9〜16 | の部分を新規別シートのD36.E36.G36.H36.I36.J36に | 転記したいと考えてます。 のようには読み取れませんよ。
| (B9がD36のように前から転記したい部分は順に並べてます) は | (転記したい部分を、左から右の順に並べて書いています) と言う意味ですね。
| またその列が複数になるのでB16.D16の列まで必要です。 日本語として間違っていますよね。 複数の"行"ですよね。 「B16.D16の列まで」 というのも意味不明です。 列ですか? なぜBとDだけが出てくるんでしょうか。
■ 結局のところ、転記範囲は次のようになるんですね? 発注シート 新規シート B2 → C36 B9:B16 → D36:D43 D9:D16 → E36:E43 J9:J16 → G36:G43 M9:M16 → H36:H43 S9:S16 → I36:I43 V9:V16 → J36:J43 2回目は 発注シート 新規シート B2 → C44 B9:B16 → D44:D51 以下同じ ということなんですね? 次は44行目と、一行の空白行もなく続けるんですね?
コード作成で留意するのは、転記先の行を求めるところです。 36とか44のところです。
C列ではなく、D列の最終行を求めて、その次の行が書き込み先の開始位置です。 つまり、 ws2.Cells(Rows.Count, "D").End(xlUp).Row + 1 のように求めます。 初回だけは36にする必要があるので、 求めた行と36のいずれか大きい方とするとよいでしょう。
あとは、For.. Nextなどの繰り返し処理が不明なら、 7つの転記作業をそのまま書いたらいいでしょう。 7行のコードで書けるんですから、それでよいのではないですか? 頑張ってトライしてみて下さい。
(xyz) 2024/04/23(火) 07:19:04
■4 コピーする範囲が「B9からN17セル」なのか「9〜16行目のB,D,J,M,S,V列」なのかわかりませんが、ざっくり整理すると↓みたいな感じになるんじゃないですかね?
Sub 研究用() Dim 出力行 As Long, tmp As Long
Worksheets("発注").[プリントアウトする命令]
出力行 = 36 With Worksheets("新規") On Error Resume Next 出力行 = WorksheetFunction.Max(36, .Range("C:E,G:J").Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious).Row + 1) On Error GoTo 0
.Cells(出力行, "C").Value = Worksheets("発注").Range("B2").Value
'▼▼適宜修正してください▼▼ Worksheets("発注").Range("B9:B16,D9:D16").[コピーする命令] .Cells(出力行, "D").[値貼り付けする命令]
Worksheets("発注").Range("J9:J16,M9:M16,S9:S16,V9:V16").[コピーする命令] .Cells(出力行, "G").[値貼り付けする命令] '▲▲適宜修正してください▲▲
On Error Resume Next tmp = .Range("C:E,G:J").Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious).Row On Error Resume Next
If tmp >= 36 Then Union(.Cells(出力行, "C"), Intersect(.Rows(出力行 & ":" & tmp), .Range("D:E,G:J"))).[罫線を設定する命令] End If End With
Worksheets("発注").Range("B9:B16,D9:D16,J9:J16,M9:M16,S9:S16,V9:V16").[値をクリアする命令] End Sub
※既に述べたように[]の部分は、【マクロの記録】で必要な命令が調べられます。
(もこな2 ) 2024/04/23(火) 15:32:46
例としては 1.シート1のB2のセル → 新規シートのC36 2.シート1のB9からN9セル →新規シートのD36からQ36
2.に関してはB9〜N9のセル→新規シートD36〜Q36の行は 下に7行続くようになるので (B9のセルを含んで最大8行まで) 最終はB16〜N16→新規シートK36〜Q36 の行へ転記したいと考えています。
ただし入力部分は毎回全ての行入力しない場合が あるのでB9からB16の列からN9からN16の列の 入力された範囲のもののみを転記という形になるか と思うのですが…
またその転記した範囲を一度全てリセットし、 (このリセットはマクロの記録で製作済として) 先ほどと同じような転記を繰り返し行いたいのですが その際には前回転記したデータは残しておきたいです。
1.に関してはリセットして新たに入力する際に 新規シートに転記が出来るようにしたいのですが、 蓄積されてるデータの数によってCの列の何行目に あたるかは変わります。 リセット後に先ほど指定した範囲のセルのところに 新たに入力されたデータを別シート指定部分に転記 (条件は先ほどと同じ)・し、以前に蓄積された データの下に新たに入力したものがさらに転記 されていくような仕組みが知りたいと思っています。
この作業をボタンを作って転記というのを押せば出来るように なりたいです。
難しいと思いますがよろしくお願いします🙇 (neee) 2024/04/23(火) 21:20:54
それはそれとして、今更ながらトピ主が"質問"したいのはどんなことなのでしょうか? もし、"質問"ではなく"作成依頼"をしたいということならば、あらかじめ明言しておいたほうが良いかもしれません。
以下は質問だと捉えてのコメントになりますので、そうでない場合は無視してください。
■5 >1.シート1のB2のセル → 新規シートのC36
既に提示済です。
■6 >2.に関してはB9〜N9のセル→新規シートD36〜Q36の行は >下に7行続くようになるので >(B9のセルを含んで最大8行まで) >最終はB16〜N16→新規シートK36〜Q36 >の行へ転記したいと考えています。
↑の説明が理解できません。 たとえば↓のようにシートの情報はともかく、セルの関係性を8行分全部書けませんか? B9〜N9 → D36〜P36 B10〜N10 → E36〜Q36 B11〜N11 → F36〜R36 B12〜N12 → G36〜S36 B13〜N13 → H36〜T36 B14〜N14 → I36〜U36 B15〜N15 → J36〜V36 B16〜N16 → K36〜W36
※↑は8行分、最後がK36という情報から無理やり考えたものです。 本当にこれだったらどんどん上書きしていっちゃうので、正しいものに直して提示してください。
■7 >1.に関してはリセットして新たに入力する際に >新規シートに転記が出来るようにしたいのですが、 >蓄積されてるデータの数によってCの列の何行目に >あたるかは変わります。
あくまで、C列は独立していて書き込む行は、ほか(D列以降)の列と ずれても構わないという話の場合であっても、xyzさんが示された方法でも、 私が示した方法でも対応でも対応可能です。研究してみてください。
>リセット後に先ほど指定した範囲のセルのところに >新たに入力されたデータを別シート指定部分に転記 >(条件は先ほどと同じ)・し、以前に蓄積された >データの下に新たに入力したものがさらに転記 >されていくような仕組みが知りたいと思っています。
上記と被りますが、C列とD列以降の最終行はそれぞれ独立しているという場合でも 既に提示した方法で対応可能です。研究してみてください。
■8 >ただし入力部分は毎回全ての行入力しない場合が >あるのでB9からB16の列からN9からN16の列の >入力された範囲のもののみを転記という形になるか >と思うのですが…
「■7」にも関連しますが、空っぽのセルを転記(コピー)しちゃうと問題があるのですか? 提示した方法を応用して最終行を求めれば、仰ることは可能です。 ただ、空っぽのセルを転記(コピー)したところで、後の作業に影響がでないと思いますので 気にせずコピーするというアプローチのほうが簡単であるように思います。
(もこな2) 2024/04/24(水) 07:29:58
(もこな2) 2024/04/25(木) 06:37:37
]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.