[[20200624183156]] 『ヘッダーと明細の結合』(まあ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ヘッダーと明細の結合』(まあ)

販売管理のソフトから会計ソフトへデータを読み込ませたいのですが、販売管理から出力されるデータがヘッダー行と明細行が別々の行として出力されてきます。読み込みを行う側の会計ソフトでは、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


Sub main()
'データがA列のみの場合
    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.