[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ヘッダーと明細の結合』(まあ)
販売管理のソフトから会計ソフトへデータを読み込ませたいのですが、販売管理から出力されるデータがヘッダー行と明細行が別々の行として出力されてきます。読み込みを行う側の会計ソフトでは、1行にヘッダーと明細を入れる形式のため、関数などを使用してヘッダー行と明細行を結合した行を作成したいのですが良い方法はありますでしょうか。
なお、明細行は1〜20行程度でランダムで出力されてきます。
良い方法があればご教授ください。
<サンプル>
H,1,20200623
M,現金,1000円,売掛金,1000円,取引先A
H,2,20200624
M,預金,2000円,売掛金,2000円,取引先B
M,売掛金,3000円,売上,3000円,取引先C
<加工後>
1,20200623,現金,1000円,売掛金,1000円,取引先A
2,20200624,現金,2000円,売掛金,2000円,取引先B
2,20200624,売掛金,3000円,売上,3000円,取引先C
< 使用 Excel:Office365、使用 OS:Windows10 >
>販売管理のソフトから会計ソフトへデータを読み込ませたいのですが ここはエクセルの場です。他のサイトへどうぞ。 (つつ) 2020/06/24(水) 20:04
こんばんは ^^ 他ソフトからのテキストダンプを エクセルのセル上で会計ソフト用のテキストへ加工のお話でしたら。。。 必ずヘッダーが先で次にある件数明細がありまたヘッダー。。。。の繰り返し でしたらVBAのループ処理で上から順に ある変数にヘッダーでしたらヘッダーを格納、明細でしたらある変数に明細を格納 明細の行でしたら、↑のある変数とある変数をつなぎ合わせて新しい配列変数に 順次格納して最後の行までいけば、その配列を一括で表示したいシート、セル番地 へ書き出せば出来ない事は無いかと。。。←思うだけで済みません。。。m(_ _)m (隠居じーさん) 2020/06/24(水) 20:16
私も隠居じーさんの案に賛成ですが、とりあえず作業列を使って数式で別シートに書き出す案です。
[A] [B] [C] [D] [E] [F] [G] [1] H 1 20200623 [2] M 現金 1000円 売掛金 1000円 取引先A 1 [3] H 2 20200624 [4] M 預金 2000円 売掛金 2000円 取引先B 2 [5] M 売掛金 3000円 売上 3000円 取引先C 2
まず、元のシートでG列を作業列として、
G2=IF(F2<>"",MAX($B$1:B2),"") これを下までコピーしておきます。
元シートのシート名を「サンプル」として、別シートの
A1=IFERROR(INDEX(サンプル!G:G,SMALL(IF(サンプル!$A$1:$A$10="M",ROW($A$1:$A$10)),ROW(A1))),"") B1=IFERROR(VLOOKUP(A1,サンプル!B:C,2,FALSE),"") C1=IFERROR(INDEX(サンプル!B:B,SMALL(IF(サンプル!$A$1:$A$10="M",ROW($A$1:$A$10)),ROW(A1))),"")
A1とC1は CtrlとShiftキーを押しながらEnterで確定、配列数式にします。 次に、C1をG1までコピー、C1:G1を下に適当にコピーすると希望通りになりませんでしょうか。
なお上記の数式中、$A$1:$A$10 の部分はとりあえず10行分でテストしていますので、 実際の行数より多く設定してください。
(tora) 2020/06/24(水) 21:20
Office365 だとすると、こんな案も浮かびます
まず、数式でやると (1) J1セル =FILTER(B:F,A:A="M") (2) H1セル =XLOOKUP(ROW(),B:B,B:C,"",-1) 下にコピー
<結果図> 行 _A_ ___B___ ____C____ ___D___ __ E __ __ F __ _G_ _H_ ___ I ___ __ J __ ___K___ __ L __ ___M___ ___N___ 1 H 1 20200623 1 20200623 現金 1000円 売掛金 1000円 取引先A 2 M 現金 1000円 売掛金 1000円 取引先A 2 20200624 預金 2000円 売掛金 2000円 取引先B 3 H 2 20200624 2 20200624 売掛金 3000円 売上 3000円 取引先C 4 M 預金 2000円 売掛金 2000円 取引先B 5 M 売掛金 3000円 売上 3000円 取引先C
出来上がったリストをコピーして、A1セルを先頭に値の貼り付け。
それをVBAでトレースすると
Sub Macro1() Dim Rws, v
Range("J1").Formula2R1C1 = "=FILTER(C[-8]:C[-4],C[-9]=""M"")"
Rws = Application.CountA(Columns("J")) Range("H1").Resize(Rws).Formula2R1C1 = "=XLOOKUP(ROW(),C[-6],C[-6]:C[-5],"""",-1)"
v = Range("H1").CurrentRegion.Value
Cells.ClearContents Range("A1").Resize(Rws, 7).Value = v End Sub
<結果図> 行 _A_ ____B____ ___C___ ___D___ __ E __ __ F __ ___G___ 1 1 20200623 現金 1000円 売掛金 1000円 取引先A 2 2 20200624 預金 2000円 売掛金 2000円 取引先B 3 2 20200624 売掛金 3000円 売上 3000円 取引先C
(半平太) 2020/06/24(水) 21:38
> (2) H1セル =XLOOKUP(ROW(),B:B,B:C,"",-1) ↑ すみません。それ全然ダメでした。
私の回答はスルー願います。 m(__)m
(半平太) 2020/06/24(水) 22:10
これならよさそう。(2行目以下およびK列以遠はスピルします)
(1) J1セル =FILTER(B:F,A:A="M")
(2) H1セル =XLOOKUP(FILTER(ROW(B1:B1000),A1:A1000="M"),ROW(B1:B1000)/ISNUMBER(B1:B1000),B1:B1000,"",-1) (3) I1セル =XLOOKUP(H1#,B:B,C:C)
(半平太) 2020/06/24(水) 23:13
Set r = Sheets("加工後").Range("A1") For Each c In Sheets("サンプル").Range("A:A").SpecialCells(2) Select Case Trim(Left(c.Value, 1)) Case "H" temp = Trim(Mid(c.Value, InStr(c.Value, ",") + 1)) Case "M" r.Value = temp & Mid(c.Value, 2) Set r = r.Offset(1) End Select Next c End Sub (mm) 2020/06/25(木) 09:37
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.