[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シートの連動について(VBA)』(カフェオレ)
初めまして。マクロの勉強を始めたばかりで、同じような事例を探して作り変えてみましたが、一応正しく動いたのですが、範囲の指定方法等ご教授頂きたく、お願いいたします。
「通常」シート、「8月」シート、「まとめ」シートの3シートを連動させて、行挿入を実施したいです。
<通常シート>
A B C 1 No. 商品 個数 2 Aまとめ 80 3 A-1 りんご 10 4 A-2 みかん 30 5 A-3 キウイ 40 6 Bまとめ 90 7 B-1 りんご 30 8 B-2 みかん 30 9 B-3 キウイ 30
<8月シート>
A B C 1 No. 商品 個数 2 Aまとめ 60 3 A-1 りんご 10 4 A-2 みかん 20 5 A-3 キウイ 30 6 Bまとめ 60 7 B-1 りんご 10 8 B-2 みかん 20 9 B-3 キウイ 30
<まとめシート>
A B C 1 No. 商品 個数 2 Aまとめ 20 3 A-1 りんご 0 4 A-2 みかん 10 5 A-3 キウイ 10 6 Bまとめ 30 7 B-1 りんご 20 8 B-2 みかん 10 9 B-3 キウイ 0
A列(No.)、B列(商品)は3シートすべて同じ表示としたい為、「通常」シートに内容を書き込んだものを「8月」「まとめ」シートに下記の式で表示させています。
=IF(INDIRECT("通常!R"&ROW()&"C"&COLUMN(),0)="","",(INDIRECT("通常!R"&ROW()&"C"&COLUMN(),0)))
C列の個数は、下記のように入力方法がシートによって異なります。
★「通常」シート → 手入力で個数を入れている。但し、2行目、6行目は3-5行目、7-9行目の足し算。
★「8月」シート → 別シート(「8月の個数」シート)のA列に果物、B列に個数が書いてあり、そこからVlookupで個数を拾っている。但し、2行目、6行目は3-5行目、7-9行目の足し算。
8月シートのC3セルの数式例=IFERROR(VLOOKUP(B3,'8月の個数'!A:B,2,FALSE),"")
★「まとめ」シート → 「通常」シートと「8月」シートの引き算を入れている。但し、2行目、6行目は3-5行目、7-9行目の足し算。
まとめシートのC3セルの数式例 =IFERROR(通常!C3-'8月'!C3,通常!C3)
上記の条件のもと、「通常」シートに行が挿入された際も、他の2シートにも連動して挿入して、かつ、数式もずれずにコピーしたいです。
ちなみに、行挿入時は、4行セットで実施したいです。(〇まとめ、〇-1、〇-2、〇-3)。
但し、通常シートの文字や個数は手入力とする。
また、各シートに条件付き書式をC列にいれて閾値以上は色を付けるようにしている。
Sub 連動1行ずつ()
Dim r As Integer
r = ActiveCell.Row Rows(r & ":" & r + 3).Insert
Worksheets(Array("8月", "まとめ")).Select Rows(r).Select Selection.Offset(-4, 0).Range("A1:AI4").Copy Selection.Insert
Worksheets("まとめ").Select Application.CutCopyMode = False
End Sub
上記コードで、正しく動きますが、例えば「通常シート」は基本手作業で入力しますが、可能ならC列の〇まとめ行のTotal式は、行を挿入しても自動で上の式からコピーして入れておきたいのですが、うまく組み込めなかったのでご教授頂けますと幸いです。
また、
> Rows(r & ":" & r + 3).Insert > Selection.Offset(-4, 0).Range("A1:AI4").Copy
等の4行セットで挿入や式をコピーの指定の方法は、もっといいやり方があれば、教えて下さい。
実際は、D列以降にも数式を色々入れたいので、出来るだけ重くならずにスマートに動かしたいです。
関数部分も含めて、何か修正した方がよい箇所等ありましたら、今後の勉強の参考に教えて下さい<m(__)m>
< 使用 Excel:Excel2016、使用 OS:Windows10 >
おはようございます ^^ w、複雑そうですね。。。正常に動いているならそれが一番^^;v わたし、数式は新米レベルで回答では御座いませんが。テーブルにして おけば数式はずれない!というような、お話は聞いた記憶が御座います。 一度、ダメもとで、お調べになっては?( ̄▽ ̄) 他にも【8月の個数】というシートが存在するのでせうかね。 私でしたら、いっそ、読込みから、作表、個数算出計算、書き出し まで、オールマクロで[数式は利用した方が便利な場合はちょい利用で^^;] 済ましてしまうと、思います。外していましたらお許しを。 また、余計なお世話でしたら、無視して下さいませ。m(_ _)m (隠居Z) 2021/09/11(土) 11:01
(カフェオレ) 2021/09/11(土) 13:57
にこんな、入力シートを用意し
入力シートと、他のシート(通常、8月、まとめ)を連動させてはどうですか。
A B C D E 1 No 商品 通常 8月 まとめ 2 Aまとめ 80 60 20 3 A-1 りんご 10 10 0 4 A-2 みかん 30 20 10 5 A-3 キウイ 40 30 10 6 Bまとめ 90 60 30 7 B-1 りんご 30 10 20 8 B-2 みかん 30 20 10 9 B-3 キウイ 30 30 0
(マナ) 2021/09/11(土) 14:12
こんにちは ^^ 済みません。済みません。テーブルにしてみましたが だめでした。←私の考えが浅はかでした。みたいです^^; m(_ _)m 何やら、在庫の管理をしておられるようにお見受けするのですが 挿入するのは、何のためなのでしょう。 ちなみに、こちらではエラーで処理できませんでした。 動いているのですよね。↑のコードで。←私の操作ミスかもm(__)m 8月のシートをコピーしてまとめしーとに貼り付けるのでしょうか それにしては、貼り付けるコードが見当たらないような気がするのですが 気のせいでしょうか。 どうなれば、正解なのかを教えていただけると、お手伝い出来るかも しれません。← 多分。。。 ^^;。。。m(__)mm(__)mm(__)m (隠居Z) 2021/09/11(土) 14:28
隠居Z様
試して頂き、ありがとうございます。
目的は在庫が増えるたびに、リストにどんどん追加していきたい為です。
ちなみに行の挿入は、一番下に追加していくイメージです。(途中に挿入しても動きますが)
あれ?動かないですか?
挿入したい行(例えば例題ですと一番下に4行挿入したいとして)通常シートの10行目を
行選択した状態でマクロを動かすと他の2シートにも行が4行増えました。
(マクロ稼働後に通常シートには手入力でNo.、商品、個数を入力する事で、8月シート、まとめシートにも結果がかえります)
式のコピー貼り付けは自動で8月、まとめシート両選択して、いっぺんにやっています。
selection.insert する時に、その前にコピーしてきたものを4行まとめて貼りつけていると思います←初心者なもので、その理解で合っているか定かではありませんが、、
(カフェオレ) 2021/09/11(土) 15:08
こんにちは ^^ はい、大変失礼致しました。動きました。 で、素朴な疑問が、追加した情報分の8月の個数は どうしておられるのでしょう。 また、実際は、AI列まで情報が有るのでしょうか。←これも数式?? でせうか^^;www m(_ _)m (隠居Z) 2021/09/11(土) 15:54
例題なので色々簡素化してしまいましたが、実際のイメージはC列以降は各シート計算式を入れているので、それぞれのシートの4行セットで上から式をコピーしたいのです。
AI列も適当に入れてしまいましたが、実際は数十列あるので、なるべく素速く動くマクロで書きたいと思っています。
ですが、マクロ初心者のため、ネットで同じようなものを見つけては組み合わせて…という感じなので、おかしい書き方やもっとこうした考え方をするといいと言ったご意見頂きたいな…と思い、投稿させて頂きました。
(カフェオレ) 2021/09/11(土) 16:14
こんにちわ ^^ 私も、こちらでは、生徒さんなので、あまり詳しくありませんので、 アドバイスは他の方の回答も引き続きお待ちくださいませ。そのうえで 気が付いた点だけ。 1.私が誤作動させた要因かもしれませんが、うっかりアクティブシートが 変わっていますと、とんでもない結果に。。。今回の様に複数シートに 跨る、処理をする場合は明示的にシートを指定すればリスクを回避でき ると思います。また、[二行目のセルを指定すればエラーに^^;] のエラー回避処理等が必要かと。 2.元の情報に小計[Aまとめ]とかは入れずに処理し、1行、1情報[複数列可] のようなデーターベースライクにして、それを基に、見やすい帳票はそれ を基準に後から作成すると思います。←エクセルの様々な便利機能が使えて 仕事が楽になります。^^v えらそぉな事を申し上げましたが。ちょい参考程度にお止めをm(_ _)m でわ、頑張ってくださいね。。。m(_ _)m (隠居Z) 2021/09/11(土) 17:01
小計行…そうですよね。。今後の使い方含めて、効率の良い方法を検討してみます。
お忙しい中、ありがとうございました^ ^
(カフェオレ) 2021/09/11(土) 17:48
こんばんわ。。。^^ もう、ご覧になっていないかもですが、言い出しべ!なので そのぉ〜私なら、こんな感じでという物ですが。かなり いい加減な冗長なコードですが、ご考察時の何かの足しにでも なれば幸甚です。m(_ _)m シート名 通常 数式なし
|[A] |[B] |[C] [1]|No. |商品 |個数 [2]|Aまとめ| | 80 [3]|A-1 |りんご| 10 [4]|A-2 |みかん| 30 [5]|A-3 |キウイ| 40 [6]|Bまとめ| | 90 [7]|B-1 |りんご| 30 [8]|B-2 |みかん| 30 [9]|B-3 |キウイ| 30 シート名 8月の個数 数式なし |[A] |[B] [1]|商品 |個数 [2]|A-1りんご| 10 [3]|A-2みかん| 20 [4]|A-3キウイ| 30 [5]|B-1りんご| 10 [6]|B-2みかん| 20 [7]|B-3キウイ| 30 シート名 8月 と まとめ は 空のシートにして 新規ブックに↑の各シートを用意して、お試しを^^; 新規ぶっくですよ(*^^*)、間違ってもご使用中の物はいけませんですよ。 Option Explicit Sub OneInstanceMain() Dim i As Long Dim lR As Long Dim eflg As Boolean Dim r As Range Dim ad8 As String Dim uAry() As Variant Dim k8Ary() As Variant Dim ws1 As Worksheet Dim wS2 As Worksheet Dim wS3 As Worksheet Dim wS4 As Worksheet Dim t As Double t = Timer Set ws1 = Worksheets("通常") Set wS2 = Worksheets("8月") Set wS3 = Worksheets("まとめ") Set wS4 = Worksheets("8月の個数") ReDim uAry(1 To 4, 1 To 3) ReDim k8Ary(1 To 3, 1 To 2) uAry(1, 1) = "Xまとめ": uAry(1, 2) = "": uAry(1, 3) = 100 uAry(2, 1) = "X-1": uAry(2, 2) = "かき": uAry(2, 3) = 5 uAry(3, 1) = "X-2": uAry(3, 2) = "もも": uAry(3, 3) = 75 uAry(4, 1) = "X-3": uAry(4, 2) = "くり": uAry(4, 3) = 20 k8Ary(1, 1) = "X-1かき": k8Ary(1, 2) = 3 k8Ary(2, 1) = "X-2もも": k8Ary(2, 2) = 50 k8Ary(3, 1) = "X-3くり": k8Ary(3, 2) = 10 With ws1 lR = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To lR If uAry(1, 1) = .Cells(i, 1) Then eflg = True Exit For End If Next If Not eflg Then .Cells(lR, 1).Resize(UBound(uAry, 1), UBound(uAry, 2)) = uAry End If eflg = False End With With wS4 lR = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To lR If k8Ary(1, 1) = .Cells(i, 1) Then eflg = True Exit For End If Next If Not eflg Then .Cells(lR, 1).Resize(UBound(k8Ary, 1), UBound(k8Ary, 2)) = k8Ary End If ad8 = .Cells(1).CurrentRegion.Address End With With wS2 '8 .UsedRange.Clear ws1.Cells(1).CurrentRegion.Copy .Cells(1) Set r = .Cells(1).CurrentRegion r.Offset(1, 2).Resize(r.Rows.Count - 1, 1).Formula = "=VLOOKUP(A2&B2,'8月の個数'!" & ad8 & ",2,FALSE)" For i = 2 To r.Rows.Count Step 4 .Cells(i, 3).Formula = "=Sum(r[1]c:r[3]c)" Next End With With wS3 'まとめ .UsedRange.Clear ws1.Cells(1).CurrentRegion.Copy .Cells(1) Set r = .Cells(1).CurrentRegion r.Offset(1, 2).Resize(r.Rows.Count - 1, 1).Formula = "=IFERROR(通常!C2-'8月'!C2,通常!C2)" For i = 2 To r.Rows.Count Step 4 .Cells(i, 3).Formula = "=Sum(r[1]c:r[3]c)" Next End With Erase k8Ary, uAry MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _ Format((Timer - t) - Int(Timer - t), ".000") & " 秒" End Sub (隠居Z) 2021/09/11(土) 19:52
掛かった時間を表示しているマクロをたまに見かけますが、このようにやるのですね(^^)
(カフェオレ) 2021/09/11(土) 20:31
恐縮で御座います。m(__)m 配列部分は、別途、入力用シート、若しくは、ユーザーフォーム等 を使用して、新規増加分とそれに対応する処理月度の支出部分を入力 した情報の受け皿を想定して、配列に手入力部分を格納してみました。 確かに処理速度を上げる、一方法としても有効な時も御座いますので、 習得しておいて、損はないかと思います。 とても、楽しく勉強させて戴きました。ありがとうございました。 でわ。。。m(_ _)m (隠居Z) 2021/09/11(土) 21:39
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.