『データを配列?で印刷フォームに転記』(KUN)
どうしていいのかわからないので教えてください。
具体的な例で説明させて下さい
sheet1にデータが入っています。
名前 区分1 明細1 明細2 明細3
山田 野菜 001 AAA aaa
山田 野菜 002 BBB bbb
山田 肉 001 FFF
山田 魚 001 JJJ
山田 果物 001 QQQ
が1000件ぐらいあります。
sheet2に印刷に対応したマスに転記したいのですが・・・
A B C D E・・・ L(max10マス)
1 山田 野菜 |001|002|003|
2 |AAA|BBB|CCC|
3 |aaa|bbb|ccc|
4 |011|
5 |KKK|
6 |kkk|
7 肉 |001|
8 |PPP|
9 |ppp|
1マスは明細の3行使い、
区分1のデータが変われば、sheet2は次の行のマスに、
区分1(野菜)の同じデータが10以上の場合は、次の行のマスに転記
人が変わっても次の行のマスに転記していきたいです。
区分1は4種類、人は20人位います。
sheet1のデータ(1行)をsheet2の3行に転記、
sheet1の10データをsheet2の同じ行(3行)のマスに転記したいです。
何となく、配列を利用するのではないかと思っていますが、
実際どうすればいいのか分かりません。
上手く説明できているかも不安ですが、
どうか、手助けをお願い致します。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
003 CCC ccc はどこにあるのだろ? (*^^*)
新入社員の皆様にご説明戴くように、詳細に渡る 転記規則を 手を取る様に手順を
さらに教えて戴くと、何かお手伝いくらいは出来るかもしれません。。。← 怪しい ^^;
m(__)m
(隠居Z) 2025/06/28(土) 12:18:25
名前 区分1 明細1 明細2 明細3
山田 野菜 001 AAA aaa
山田 野菜 002 BBB bbb
山田 野菜 003 CCC ccc
・・・と続いています。
山田の野菜が11データあり、sheet2のマスは2行目(実際には3行使っているので4行目)で
次が、山田の肉が次のマス行3行目(実際には7行目)・・・という感じです。
山田の野菜のデータを10個、sheet2に横に転記、11個目は次の行(下のマス)に転記。
データを10個転記、又は、区分1(野菜等)が変わる又は、人(山田)が変わったら下のマス
に転記したい。
区分はMAX4種類、人によっては1種類の場合もある
人は20人ぐらい・・・MAX30人です、
隠居Z様、よろしくお願いいたします。
(KUN) 2025/06/28(土) 12:43:59
早速のさらなるご説明、ありがとうございます。勘案してみます。暫時、御猶予を
他の回答者様のお出ましも合わせてお待ちくださいませ。でわ
m(__)m
(隠居Z) 2025/06/28(土) 13:04:38
Option Explicit Sub ConvertToPrintOutFormatMatrix() Dim v() As Variant Dim w() As Variant Dim r As Range Dim i As Long Dim Ay As Long Dim Ax As Long Dim x As Long Dim y As Long With Worksheets("Sheet1") Set r = .Cells(1).CurrentRegion End With With Worksheets("Sheet2") .UsedRange.Clear r.Copy .Cells(1) Set r = .Cells(1).CurrentRegion r.Sort Key1:=r.Columns(1), Order1:=xlAscending, _ Key2:=r.Columns(2), Order2:=xlAscending, Header:=xlYes v = r.Resize(r.Rows.Count + 1).Value End With ReDim w(1 To 3, 1 To 10) With Worksheets("Sheet2") .UsedRange.Clear .Cells(1).Resize(, 12) = Array("氏名", "区分", "F1", "F2", "F3", "F4", _ "F5", "F6", "F7", "F8", "F9", "F10") y = 2: x = 1 Ay = 1: Ax = 1 For i = 2 To UBound(v, 1) - 1 For J = 3 To 5 w(Ay, Ax) = v(i, J) Ay = Ay + 1 Next Ax = Ax + 1 Ay = 1 If v(i, 1) <> v(i + 1, 1) Or v(i, 2) <> v(i + 1, 2) Or Ax > 10 Then .Cells(y, x) = v(i, 1) .Cells(y, x + 1) = v(i, 2) .Cells(y, x + 2).Resize(3, 10) = w y = y + 4 Ax = 1 Ay = 1 ReDim w(1 To 3, 1 To 10) End If Next End With Erase v, w End Sub (隠居Z) 2025/06/28(土) 15:20:10
有難うございます。
やってみます。
少しお時間を下さい。
勉強しながら、やってみます。
( ..)φ
本当にありがとうございます。
(KUN) 2025/06/28(土) 17:44:46
ありがとうございました。
希望の形になりました。
只今、勉強中なので1つ教えてください
マクロの途中で、sheet2にデータが転記されるのですが・・・
With Worksheets("Sheet2") .UsedRange.Clear r.Copy .Cells(1) Set r = .Cells(1).CurrentRegion v = r.Resize(r.Rows.Count + 1).Value End With
教えてください。
よろしくお願いいたします。
(KUN) 2025/06/29(日) 12:32:41
With Worksheets("Sheet2") Rem Sheet2の内容を書式を含め初期化します。 .UsedRange.Clear Rem Sheet1の内容をA1セルを基準[範囲の左上]として貼り付けます r.Copy .Cells(1) Rem ソート用に変数rにSheet2の内容を格納します Set r = .Cells(1).CurrentRegion
ここでA列、B列の順で昇順並び替え^^;
Rem 配列変数vにソート済みrの範囲を、1行余分に[最下行は空白のダミーを作成して]格納 v = r.Resize(r.Rows.Count + 1).Value End With 今回のコードの場合 一つ下の行の値と比較しますのでレンジオブジェクトならそのままエラー無く可能ですが 配列はそんな要素無いよ。とエラーに成りますので偽情報を一行必要列分余分に確保しておきます。 その為、ループ指定はデータ開始行から最大要素数-1 までです。 << _ _ >>
(隠居Z) 2025/06/29(日) 13:10:20
SORTBY関数が使えるなら必要ないかもしれません。。。
様々な方法が有ると思いますので。。。↑は、ほんの一案とお考えいただければ幸甚ですA^^;
m(__)m
(隠居Z) 2025/06/29(日) 13:16:23
ありがとうございました。
これから、たくさん勉強します。
迅速にご対応いただき
本当に感謝しております。
ありがとうございました。
(KUN) 2025/06/29(日) 13:52:23
後追いの蛇足です。
Sheet1は元データでそれには変更を加えない、というポリシーだからでしょう。 まるごとSheet2にいったんコピーし、ソートするのが手っ取り早い(*)です。 ソートし配列にとりこんだあとで .Clearしていますからまさに一時的に利用しているだけです。
元データをソートしてよければコピーは不要でしょうが、 元データはそのまま残すのが安全なので妥当なポリシーだと思います。
(*) 1.sortメソッドもsortオブジェクトを使う方法もいずれも、InPlace(その場で直接並び替える)のものであり、 結果を別にコピーする機能はありません。 2. また、ワークシート関数を使って、Sheet2からSheet1のデータのソート結果を利用することは、 お使いのExcel2016ではできません。 (xyz) 2025/06/29(日) 14:01:18
ああそうか、ソートは不要なので、と言うことならコピーは不要です。 Sheet1から直接取ればいいだけです。 話の前提を相手に伝わるように明記したほうがいいですよ。 (xyz) 2025/06/29(日) 14:34:17
(匿名) 2025/06/29(日) 15:45:32
> マクロの途中で、sheet2にデータが転記されるのですが・・・ > > > With Worksheets("Sheet2") > .UsedRange.Clear > r.Copy .Cells(1) > Set r = .Cells(1).CurrentRegion > v = r.Resize(r.Rows.Count + 1).Value > End With > 教えてください。 に対するコメントですから、自ずと理解できると思います。
> 転記されるのですが・・・・ と言われて後は想像して、というのは無しですよ。 「ソートなしであればコピーは要らないと考えていいですか?」 とかハッキリ書いて下さい、という趣旨でした。
>ああそうか、ソートは不要なので、と言うことならコピーは不要です。 という私のコメント内容からしても、誰に向かってのコメントなのかは分かるはずです。
(xyz) 2025/06/29(日) 16:10:54
教えて頂き本当にありがとうございました。
説明が下手な点も考慮して頂き、心から感謝申し上げます。
これから、沢山、学ばせて頂きます。
よろしくお願いいたします。
(KUN) 2025/06/30(月) 10:06:55
データはsheet2に
A B C D E・・・ L(max10マス)
1 山田 野菜 |001|002|003|
2 |AAA|BBB|CCC|
3 |aaa|bbb|ccc|
出るようなりました。↑
こそで、A1セルからL3セルにデータが有る場合に罫線を引く方法を教えて下さい。
001のデータ=C1-C3のセルの外側に罫線が引きたいです。
なので、001のデータが□で囲まれている様にしたいです。
出来れば、Aセルの人(=山田)が変わったら、次の人のデータの上に太目の罫線
5行目のL(MAXデータが10なので)まで引きたいです。
Aセルが変わった場合はデータの有無に関係なくMAX10のLセルまで横太罫線で
どうか、よろしくお願いいたします。
(KUN) 2025/07/02(水) 16:49:13
m(__)m
(隠居Z) 2025/07/02(水) 17:43:59
Sheet1 の情報が下記の様な感じだとして^^; Option Explicit Private Sub zddmk() Rnd -19 Dim w(), i&, j&, n&, a, b, c, d, e Dim m(), k(), dc Set dc = CreateObject("Scripting.Dictionary") ReDim m(29) For i = 0 To 29 m(i) = "名前" & Format(i, "00") Next k = Array("果物", "野菜", "肉", "魚") With Worksheets("Sheet1") .UsedRange.Clear .Cells(1).Resize(, 5) = Array("氏名", "区分", "明細1", "明細2", "明細3") i = 0 Do j = Int((29 - 0 + 1) * Rnd + 0) a = m(j) j = Int((3 - 0 + 1) * Rnd + 0) b = k(j) j = Int((29 - 0 + 1) + Rnd + 0)
c = Cells(n + 1).Address d = Cells(n + 2).Address e = Cells(n + 3).Address n = n + 3 dc(i) = Array(a, b, c, d, e) i = i + 1 If i Mod 32 = 0 Then DoEvents If i > 1200 Then Exit Do Loop .Cells(2, 1).Resize(dc.Count, 5) = Application.Index(dc.items, 0, 0) End With dc.RemoveAll End Sub
別モジュール使用として
下記のコードですが、[前回のものに恐怖の憶測と推測による
ちょい変更を加えたものに、罫線を引いてみました。]
ご希望の物とは違うかもしれませんが、何かの参考にでもなれば幸甚です。でわ
m(__)m
Option Explicit Sub ConvertToPrintOutFormatMatrix_Ver1000() Dim v() As Variant Dim w() As Variant Dim r As Range Dim i As Long Dim j As Long Dim Ay As Long Dim Ax As Long Dim x As Long Dim y As Long Dim OldV1 As String Dim OldV2 As String Dim tmp As Variant Dim ic As Long Dim oc As Long Dim jFlg As Boolean With Worksheets("Sheet1") Set r = .Cells(1).CurrentRegion End With With Worksheets("Sheet2") .UsedRange.Clear r.Copy .Cells(1) Set r = .Cells(1).CurrentRegion r.Sort Key1:=r.Columns(1), Order1:=xlAscending, _ Key2:=r.Columns(2), Order2:=xlAscending, Header:=xlYes v = r.Resize(r.Rows.Count + 1).Value ReDim w(1 To 3, 1 To 10) .UsedRange.Clear With .Cells(1).Resize(, 12) .Value = Array("氏名", "区分", "F1", "F2", "F3", "F4", _ "F5", "F6", "F7", "F8", "F9", "F10") .Borders.LineStyle = 1 End With y = 2: x = 1 Ay = 1: Ax = 1 OldV1 = v(2, 1) OldV2 = v(2, 2) For i = 2 To UBound(v, 1) - 1 ic = ic + 1 For j = 3 To 5 w(Ay, Ax) = v(i, j) Ay = Ay + 1 Next Ax = Ax + 1 Ay = 1 If v(i, 1) <> v(i + 1, 1) Or v(i, 2) <> v(i + 1, 2) Or Ax > 10 Then tmp = v(i, 1) If tmp = OldV1 And y > 2 Then tmp = "" .Cells(y, x) = tmp tmp = v(i, 2) If tmp = OldV2 And y > 2 Then tmp = "" .Cells(y, x + 1) = tmp .Cells(y, x + 2).Resize(3, 10) = w Set r = .Cells(y, x + 2) If i + 1 = UBound(v, 1) Then jFlg = True DrawBordersLine r, jFlg y = y + 3 oc = oc + Ax - 1 Ax = 1 Ay = 1 OldV1 = v(i, 1) OldV2 = v(i, 2) ReDim w(1 To 3, 1 To 10) End If Next End With Erase v, w MsgBox "IN = " & ic & Chr(13) & "OUT = " & oc End Sub Private Sub DrawBordersLine(ByVal r As Range, ByVal lFlg As Boolean) Dim x As Long With r For x = 1 To 10 .Resize(3, x).BorderAround 1 Next If .Offset(, -2).Value <> "" Then With .Offset(, -2).Resize(, 12).Borders(xlEdgeTop) .LineStyle = 1 .Weight = xlThick End With End If If lFlg Then With .Offset(3, -2).Resize(, 12).Borders(xlEdgeTop) .LineStyle = 1 .Weight = xlThick End With End If End With End Sub
(隠居Z) 2025/07/02(水) 19:09:50
対応が遅くなって申し訳ありません。
sheet1のデータはこんな感じです。
担当 区分 明細1 明細2 明細3
山田 野菜 001 AAA aaa
山田 野菜 002 BBB bbb
山田 野菜 003 CCC ccc
山田 野菜 004 DDD ddd
山田 野菜 005 EEE eee
山田 肉 001 FFF fff
山田 魚 001 JJJ jjj
山田 果物 001 KKK kkk
山田 果物 002 LLL lll
山田 果物 003 MMM mmm
山田 果物 004 NNN nnn
山田 果物 005 OOO ooo
鈴木 野菜 001 AAA aaa
鈴木 野菜 002 BBB bbb
鈴木 野菜 003 CCC ccc
鈴木 肉 004 DDD ddd
鈴木 肉 005 EEE eee
鈴木 肉 001 FFF fff
鈴木 魚 001 JJJ jjj
鈴木 魚 001 KKK kkk
鈴木 魚 002 LLL lll
鈴木 果物 001 MMM mmm
鈴木 果物 002 NNN nnn
鈴木 果物 003 OOO ooo
鈴木 果物 004 MMM mmm
鈴木 果物 005 NNN nnn
鈴木 果物 006 OOO ooo
鈴木 果物 007 MMM mmm
鈴木 果物 008 NNN nnn
鈴木 果物 009 OOO ooo
鈴木 果物 010 OOO ooo
ソートは必要なきです。
明細2,3はデータが有ったり、無かったりです。
迅速な対応、ありがとうございます。
これから、やってみます。
本当にありがとうございます。
(KUN) 2025/07/02(水) 21:05:35
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.