Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Microsoft 365)
ロットナンバーを簡素化したい。
投稿日時: 23/02/06 19:18:12
投稿者: ry

検索シート
     A     B     C     D E F
1    コード        アイテム    在庫    ロット    ロケ    現品数
2    K971011728    テレビ        出荷    A310020    4D    1
3    K971011728    テレビ        出荷    A310021    4D    1
4    K971011728    テレビ     停止    A310040    YB    1
5    K971011728    テレビ        出荷    A310041    YB    1
6    K971048539    冷蔵庫        出荷    A2X0121    1D    1
7    K971048539    冷蔵庫        停止    A2Y0172    2D    1
8    K971048539    冷蔵庫     出荷    A2Y0173    2D    1
9    K971048539    冷蔵庫        出荷    A2Y0174    2D    1
10    K971064163    パソコン    出荷    A310604    1D    1
11    K971064163    パソコン    出荷    A310605    1D    1
12    K971064163    パソコン    出荷    A310606    1D    1
13    K971064163    パソコン    出荷    A310607    2D    1
14    K971064163    パソコン    出荷    A310608    2D    1
15    K971064163    パソコン    出荷    A311256    2D    1
16    K971M01439    エアコン    出荷    A311002    3D    1
17    K971M01439    エアコン    出荷    A311003    3D    1
18    K971M01439    エアコン    出荷    A311004    3D    1
19    K971M01439    エアコン    出荷    A311005    3D    1
20    K971M01439    エアコン    出荷    A311006    1D    1
 
 
入力シート
          D      E     F     G     H           I
4    コードNO.    アイテム    数量    出荷日    受注    ロット
5 K971011728    テレビ         2    2023/2/8    2615452     A310020-A310021
6 K971011728    テレビ         1    2023/2/8    2529338        A310041
7 K971048539    冷蔵庫         3    2023/2/8    2615453        A2X0121・A2Y0173-A2Y0174
8 K971055736    パソコン     6    2023/2/8    2615450     A310604-A310608・A311256
9 K971M68984    エアコン    1    2023/2/8    2616183        A311002
10 K971M68999    エアコン    2    2023/2/8    2620048     A311003-A311004
11 K971048539    エアコン    1    2023/2/8    2620049     A311005
 
I列のように(-)と(・)で集結したいです。
マクロの記録だと個数は変化するので出来ません。
宜しくお願い致します。

回答
投稿日時: 23/02/06 19:43:18
投稿者: taitani
投稿者のウェブサイトに移動

停止だと、ロットをまとめないということ?
そういうことも記載いただかないと、余計な時間がかかります。
 

投稿日時: 23/02/06 20:38:56
投稿者: ry

捕捉します。
停止は出荷しませんので、ロット件数には入りません。
連番の場合は(-)で、番号が飛んでいる場合で、かつ2個以上の倍は(・)です。
現品数は常に1個です。

回答
投稿日時: 23/02/06 20:46:33
投稿者: taitani
投稿者のウェブサイトに移動

ry さんの引用:
捕捉します。
停止は出荷しませんので、ロット件数には入りません。
連番の場合は(-)で、番号が飛んでいる場合で、かつ2個以上の倍は(・)です。
現品数は常に1個です。

 
上記理解しました。
まずは、自分でどこまでやってたのか、途中でも構わないので、コードを提示できますか?
全くの 0 からだと、作成依頼となってしまうので、回答は難しいとご理解ください。

回答
投稿日時: 23/02/06 20:48:34
投稿者: taitani
投稿者のウェブサイトに移動

★一応
https://www.moug.net/faq/kiyaku.html#link4
禁止事項

// 引用開始 //
コード制作依頼
「●●●を実行するようなマクロを作りたいのですが」「●●●をする方法を教えてください」といった、コード制作依頼ともとれるような質問はおやめください。
// 引用終了 //

投稿日時: 23/02/06 21:43:50
投稿者: ry

Sub ロット作成()
'
' ロット作成 Macro
'
 
'
    Range("F5").Select
    Sheets("検索").Select
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "A310020"
    Sheets("sheet1").Select
    Range("I5").Select
    ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _
        DisplayAsIcon:=False, NoHTMLFormatting:=True
    ActiveCell.FormulaR1C1 = "A310020-"
    Sheets("検索").Select
    Range("D3").Select
    ActiveCell.FormulaR1C1 = "A310021"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A310020-A310021"
    Range("F6").Select
    Sheets("検索").Select
    Range("D5").Select
    ActiveCell.FormulaR1C1 = "A310041"
    Sheets("sheet1").Select
    Range("I6").Select
    ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _
        DisplayAsIcon:=False, NoHTMLFormatting:=True
    Range("E7").Select
    Sheets("検索").Select
    Range("D6").Select
    ActiveCell.FormulaR1C1 = "A2X0121"
    Sheets("sheet1").Select
    Range("I7").Select
    ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _
        DisplayAsIcon:=False, NoHTMLFormatting:=True
    ActiveCell.FormulaR1C1 = "A2X0121・"
    Sheets("検索").Select
    Range("D8").Select
    ActiveCell.FormulaR1C1 = "A2Y0173"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A2X0121・A2Y0173-"
    Sheets("検索").Select
    Range("D9").Select
    ActiveCell.FormulaR1C1 = "A2Y0174"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A2X0121・A2Y0173-A2Y0174"
    Range("F8").Select
    Sheets("検索").Select
    Range("D10").Select
    ActiveCell.FormulaR1C1 = "A310604"
    Sheets("sheet1").Select
    Range("I8").Select
    ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _
        DisplayAsIcon:=False, NoHTMLFormatting:=True
    ActiveCell.FormulaR1C1 = "A310604-"
    Sheets("検索").Select
    Range("D14").Select
    ActiveCell.FormulaR1C1 = "A310608"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A310604-A310608・"
    Sheets("検索").Select
    Range("D15").Select
    ActiveCell.FormulaR1C1 = "A311256"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A310604-A310608・A311256"
    Range("F9").Select
    Sheets("検索").Select
    Range("D16").Select
    ActiveCell.FormulaR1C1 = "A311002"
    Sheets("sheet1").Select
    Range("I9").Select
    ActiveSheet.PasteSpecial Format:="Unicode テキスト", Link:=False, _
        DisplayAsIcon:=False, NoHTMLFormatting:=True
    Range("F10").Select
    Sheets("検索").Select
    Range("D17").Select
    ActiveCell.FormulaR1C1 = "A311003"
    Sheets("sheet1").Select
    Range("I10").Select
    ActiveCell.FormulaR1C1 = "A311003-"
    Sheets("検索").Select
    Range("D18").Select
    ActiveCell.FormulaR1C1 = "A311004"
    Sheets("sheet1").Select
    ActiveCell.FormulaR1C1 = "A311003-A311004"
    Range("F11").Select
    Sheets("検索").Select
    Range("D19").Select
    ActiveCell.FormulaR1C1 = "A311005"
    Sheets("sheet1").Select
    Range("I11").Select
    ActiveCell.FormulaR1C1 = "A311005"
    Range("D5").Select
End Sub
マクロの記録だとこのようになります。
宜しくお願い致します。

回答
投稿日時: 23/02/06 22:43:45
投稿者: simple

マクロ記録は意味がありません。
それは手作業をするのと全く同じことです。
手作業でやりたいということですか?
 
質問の最初に、折角例を出してもらっていますが、まったく意味がとれません。
1. パソコンとエアコンはコードNoが合致していないので、例としての意味がありません。
   見直して、再提示してください。
2.「入力シートにある、受注No.ごとにロットをまとめる」ように見受けますが、
   受注No が2529338のもののロットが A310041、というのはどこの情報をもとに
   判定できたんですか?検索シートには 受注No情報は無いですよね。
 
やりたいのは、入力シートのI列以外のすべて作成されていて、
入力シートのI列だけを自動作成したいということですか?
 
それを他人に検討依頼するのであれば、もう一度、例示を自分できちんと確認したうえで、
他人にわかるように、丁寧に説明してください。

回答
投稿日時: 23/02/06 23:14:50
投稿者: simple

(1)前提とするデータのサンプルを示す。
(2)結果として得たいものを示す((1)との対応がきちんととれた状態で示してください)
(3)それらの算出方法を、他人にわかるように説明してください。
この手順で示してください。

回答
投稿日時: 23/02/07 09:08:00
投稿者: んなっと

ワークシート関数だとこんな感じ。
pで数量分(F5)のロットナンバーを配列で抽出して
fで連番とその前の文字列に分解する関数を定義して
vで連結...3段階。
  
I5
=LET(r,検索!B$2:D$500,
 p,CHOOSEROWS(FILTER(TAKE(r,,-1),(INDEX(r,,2)="出荷")*(TAKE(r,,1)=E5)),
        SEQUENCE(F5,,SUMIF(E$4:E4,E5,F$4:F4)+1)),
 F,LAMBDA(t,i,
     LET(s,INDEX(t,1,1),
       n,MATCH(TRUE,ISERROR(1*RIGHT(s,SEQUENCE(LEN(s)))),0),
       CHOOSE(i,LEFT(s,LEN(s)-n+1),RIGHT(s,n-1)))),
 v,REDUCE("",SEQUENCE(ROWS(p)),
       LAMBDA(s,j,
           LET(a,INDEX(p,j-1),b,INDEX(p,j),c,INDEX(p,j+1),
           IF(j=1,b,
             s&IF(ISNUMBER(1/(F(b,1)=F(a,1))/(F(b,2)-F(a,2)=1)),
               IF(RIGHT(s)="-","","-")&IF(j=ROWS(p),b,""),
               IF(j=2,"",a)&"・"&b))))),
 IFERROR(v,""))
  
下方向・↓

投稿日時: 23/02/07 16:35:04
投稿者: ry

simple さんの引用:
マクロ記録は意味がありません。
それは手作業をするのと全く同じことです。
手作業でやりたいということですか?
 
質問の最初に、折角例を出してもらっていますが、まったく意味がとれません。
1. パソコンとエアコンはコードNoが合致していないので、例としての意味がありません。
   見直して、再提示してください。
2.「入力シートにある、受注No.ごとにロットをまとめる」ように見受けますが、
   受注No が2529338のもののロットが A310041、というのはどこの情報をもとに
   判定できたんですか?検索シートには 受注No情報は無いですよね。
 
やりたいのは、入力シートのI列以外のすべて作成されていて、
入力シートのI列だけを自動作成したいということですか?
 
それを他人に検討依頼するのであれば、もう一度、例示を自分できちんと確認したうえで、
他人にわかるように、丁寧に説明してください。

 
入力シートは出来ていて、I列にロットナンバーを入れるだけなんです。
受注bヘ入力シートなので元々割り振られてきます。
受注bニは同じものはありません。
I列だけ自動で出来れば、ヒューマンエラーが出ない事と、今回のように間違った情報になってしまうのを無くしたいと思いました。

投稿日時: 23/02/07 16:36:21
投稿者: ry

んなっと さんの引用:
ワークシート関数だとこんな感じ。
pで数量分(F5)のロットナンバーを配列で抽出して
fで連番とその前の文字列に分解する関数を定義して
vで連結...3段階。
  
I5
=LET(r,検索!B$2:D$500,
 p,CHOOSEROWS(FILTER(TAKE(r,,-1),(INDEX(r,,2)="出荷")*(TAKE(r,,1)=E5)),
        SEQUENCE(F5,,SUMIF(E$4:E4,E5,F$4:F4)+1)),
 F,LAMBDA(t,i,
     LET(s,INDEX(t,1,1),
       n,MATCH(TRUE,ISERROR(1*RIGHT(s,SEQUENCE(LEN(s)))),0),
       CHOOSE(i,LEFT(s,LEN(s)-n+1),RIGHT(s,n-1)))),
 v,REDUCE("",SEQUENCE(ROWS(p)),
       LAMBDA(s,j,
           LET(a,INDEX(p,j-1),b,INDEX(p,j),c,INDEX(p,j+1),
           IF(j=1,b,
             s&IF(ISNUMBER(1/(F(b,1)=F(a,1))/(F(b,2)-F(a,2)=1)),
               IF(RIGHT(s)="-","","-")&IF(j=ROWS(p),b,""),
               IF(j=2,"",a)&"・"&b))))),
 IFERROR(v,""))
  
下方向・↓

 
有難う御座います。
関数でも出来るのですか?

トピックに返信