- ベストアンサー
配車実績の集計で悩んでいる方へ
- 配車実績の集計でお困りですか?これからは簡単に解決できます。
- 配車実績の集計にかける時間を短縮し、ミスを防止する方法をご紹介します。
- 配車実績の集計作業を効率化し、正確さを確保する方法をお伝えします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>1.「 ROW($A$1:$A$10) 」ですが、書式をコピーしても対象となるセルは変わらず、この部分の値はいつでも「1」にならないのか。 この部分は1つの値ではなく、1から10の配列(すなわち{1;2;3;4;5;6;7;8;9;10}の配列定数)を返しています。 > B列の最大の行数が50の場合は、10を50にしたら良いのでしょうか? B列の行数には関係なく、そのセルから下のセル10個分という意味ですので、B列の数字で連続して同じ数字が入力される最大数を指定します(同じ数字が20個連続するなら10を20に変更)。 > B列なので「ROW(B1:B50)」といった感じでしょうか。 この部分は1~10の配列を取得すれば良いのでどの列で指定しても同じです。 すなわち、「ROW($A$1:$A$10)」の代わりに「ROW($1:$10)」や「{1;2;3;4;5;6;7;8;9;10}」のような配列定数の指定でもOKです。 > 2.「 OFFSET(F6,0,0,10,1)&"",0 」の「&""」はなぜ必要になるのでしょうか。 > MATCH 関数の検査値と検査範囲がいつでも同じ場合は1にならないのでしょうか? MATCH関数は基本は検索値は1つのセル(または値)ですが、検索値を同じ範囲を対象範囲とした配列数式のMATCH関数は、1つ目のセルから順にその範囲内で検索値が最初に出てくる数字を求めています。 したがって、同じデータが2つ以上ある場合、2つ目以降の検索値は範囲内の1つ目のデータでヒットしますので、上から数えた数字は、その順番と一致しないことになります。 このとき、一致するデータだけを表示するように、表示したくない数値はSMALL関数で該当しないように十分に大きい数字となるようにした数式です。 配列数式のMATCH関数についてはA1:A10セルに重複のある適当な文字列を入力し、以下のような数式を入力して、数式バーでその数式部分をドラッグして、実際にどのようなデータを返しているか調べてみてください。 =MATCH(A1:A10,A1:A10,0) この数字が1から10に対応しているセルは、初めてのデータであり以下のような数式で「TRUE」を返します。 ちなみに、「&""」を付加しているのはデータ範囲に空白セルがある場合(上記の数式ならA10まで入力されていない場合)、#N/Aエラーを返すのを防ぐために付けています。 =MATCH(A1:A10,A1:A10,0)=ROW(A1:A10) > 3.「50,000」が表示される場合はエラーなのかどうか。 該当しないデータなどで戻り値が「50,000」となる場合は、数式で表示しているセルよりも50000行下のセル(一般的には空白セル)を参照していますので、エクセル2003以前のバージョンで元データが1万5千行を超えるようなことがなければZ列やAB列の空白セルに対応することになります。
その他の回答 (5)
- jcctaira
- ベストアンサー率58% (119/204)
実行ボタン等でマクロを動かして下さい。 注)・入荷先は番号の先頭を使用しています。 複数の入荷先には対応していません。 ・同一番号は続いて指定されているとしています。 Sub 合計距離取得() Dim 直送マッチ As Range Dim 混載マッチ As Range 最終行 = Cells(Rows.Count, "B").End(xlUp).Row Range(Cells(6, "U"), Cells(最終行, "U")).ClearContents 直送最終行 = Cells(Rows.Count, "V").End(xlUp).Row 混載最終行 = Cells(Rows.Count, "Y").End(xlUp).Row 行 = 6 Do While 行 <= 最終行 番号 = Cells(行, "B") 番号先頭行 = 行 Set 直送マッチ = マッチ範囲取得(Cells(行, "H"), Range(Cells(6, "W"), Cells(直送最終行, "W"))) Set 混載マッチ = マッチ範囲取得(Cells(行, "H"), Range(Cells(6, "AB"), Cells(直送最終行, "AB"))) Do While 番号 = Cells(行, "B") Set 直送マッチ = AND集合(直送マッチ, マッチ範囲取得(Cells(行, "F"), Range(Cells(6, "V"), Cells(直送最終行, "V")))) Set 混載マッチ = AND集合(混載マッチ, マッチ範囲取得(Cells(行, "F"), Range(Cells(6, "Y"), Cells(直送最終行, "AA")))) 行 = 行 + 1 Loop Select Case True Case Not (直送マッチ Is Nothing) Cells(番号先頭行, "U") = Cells(直送マッチ.Row, "X") Case 混載マッチ Is Nothing Cells(番号先頭行, "U") = "■" Case 混載マッチ.Rows.Count >= 2 Cells(番号先頭行, "U") = "■" Case Else Cells(番号先頭行, "U") = Cells(混載マッチ.Row, "AC") End Select Loop End Sub Function マッチ範囲取得(検索文字 As String, 検索範囲 As Range) As Range Dim 範囲 As Range For Each 範囲 In 検索範囲 If 範囲 = 検索文字 Then Set マッチ範囲取得 = OR集合(マッチ範囲取得, 範囲) Next If Not (マッチ範囲取得 Is Nothing) Then Set マッチ範囲取得 = マッチ範囲取得.EntireRow End Function Function OR集合(範囲1 As Range, 範囲2 As Range) As Range Select Case True Case 範囲1 Is Nothing: Set OR集合 = 範囲2 Case 範囲2 Is Nothing: Set OR集合 = 範囲1 Case Else: Set OR集合 = Union(範囲1, 範囲2) End Select End Function Function AND集合(範囲1 As Range, 範囲2 As Range) As Range Select Case True Case 範囲1 Is Nothing Case 範囲2 Is Nothing Case Else: Set AND集合 = Intersect(範囲1, 範囲2) End Select End Function
お礼
考えていただいてありがとうございます! しかし、実績を出したいところに■が出てきてしまいました。
- MackyNo1
- ベストアンサー率53% (1521/2850)
数式を分解して説明すると、 (OFFSET(F6,SMALL(IF((OFFSET(B6,0,0,10,1)=B6)*(MATCH(OFFSET(F6,0,0,10,1)&"",OFFSET(F6,0,0,10,1)&"",0)=ROW($A$1:$A$10)),ROW($A$1:$A$10),50000)-1,1),0)=$Y$6:$Y$60) の部分は (OFFSET(B6,0,0,10,1)=B6) B6セル以下10個分のセルの値がB6と等しく、 (MATCH(OFFSET(F6,0,0,10,1)&"",OFFSET(F6,0,0,10,1)&"",0)=ROW($A$1:$A$10) かつF6セルから10個分のセルの値(配列)を、同じ範囲で検索した時、1から10(ROW関数の返り値)に等しい(初めて出てくる値と同じ)なら 1から10(ROW関数の返り値)にそれ以外の場合は50000という大きい数字の配列を返す数式になっています。 その外側の SMALL(IF((・・・・)),1) の部分は、上記で得られた配列で最も小さい数字(すなわちF6セル以下で初めてF6セル以下の10個のセルが初めて出現する位置)が求められます。 OFFSET(F6,SMALL(IF((・・・・))-1,1,0) F6セルから計算して上記の数値マイナス1した場所(Y列のデータに相当)のセルの値を求めています。 (上記の数式)=$Y$6:$Y$60) 1つ目のデータがY列のデータと等しい配列を求めています。 最後にSUMPRODUCT関数で、この条件を3つおよびAB列のデータの4つの配列を掛け算して、YからABセルですべての組み合わせが一致するデータの距離を探しています。
補足
回答を確認しました。 何度も何度もありがとうございます。 もう少し相手していただけると助かります。 回答でいくつか質問があります。 1.「 ROW($A$1:$A$10) 」ですが、書式をコピーしても対象となるセルは変わらず、この部分の値はいつでも「1」にならないのか。 B列の最大の行数が50の場合は、10を50にしたら良いのでしょうか? B列なので「ROW(B1:B50)」といった感じでしょうか。 2.「 OFFSET(F6,0,0,10,1)&"",0 」の「&""」はなぜ必要になるのでしょうか。 MATCH 関数の検査値と検査範囲がいつでも同じ場合は1にならないのでしょうか? 3.「50,000」が表示される場合はエラーなのかどうか。 お手数かけますが、この辺りを教えていただけると助かります。
- MackyNo1
- ベストアンサー率53% (1521/2850)
ご質問の趣旨は、混載の場合の条件に合致するAB列の数値を求めたいということですね。 B列の数字が連続10個までなら、たとえばU6セルに以下のような配列数式を入力してCtrl+Shift+Enterで確定して下方向にオートフィルすれば、混載の場合の数値を表示できます。 =IF(B6=B5,"",SUMPRODUCT((OFFSET(F6,SMALL(IF((OFFSET(B6,0,0,10,1)=B6)*(MATCH(OFFSET(F6,0,0,10,1)&"",OFFSET(F6,0,0,10,1)&"",0)=ROW($A$1:$A$10)),ROW($A$1:$A$10),50000)-1,1),0)=$Y$6:$Y$60)*(OFFSET(F6,SMALL(IF((OFFSET(B6,0,0,10,1)=B6)*(MATCH(OFFSET(F6,0,0,10,1)&"",OFFSET(F6,0,0,10,1)&"",0)=ROW($A$1:$A$10)),ROW($A$1:$A$10),50000)-1,2),0)&""=Z$6:$Z$60)*(OFFSET(F6,SMALL(IF((OFFSET(B6,0,0,10,1)=B6)*(MATCH(OFFSET(F6,0,0,10,1)&"",OFFSET(F6,0,0,10,1)&"",0)=ROW($A$1:$A$10)),ROW($A$1:$A$10),50000)-1,3),0)&""=$AA$6:$AA$60)*(H6=$AB$6:$AB$60)*$AC$6:$AC$60)) 必要に応じて混載と直送データについてIF関数で適宜分岐してください(もし、混載と直送の条件がかぶらないのであれば、そのまま直送データを足し算すれば良いことになります)。
補足
ありがとうございます! 教えていただいた書式を入力したら求めたいものが表示されました! あとは直送分と混載分を足したらうまく行きそうです! ただ、ROW関数・OFFSET関数・MATCH関数・SMALL関数という 普段使用しない関数を調べて、解読しようと数時間試みましたが、数式が複雑すぎて理解できません。 ・ROW($A$1:$A$10)で、A1からA10までを固定している意味 ・SUMPRODUCT関数の配列がどこで分かれているか ・ROW関数の中に出てくる「50,000」という数字は50,000行目までのデータに対応できるということか などなど、少し詳しく教えていただけないでしょうか? ちなみにB列の数字の連続は最大で50個くらいあります。
- jcctaira
- ベストアンサー率58% (119/204)
すみません、画像が見にくいのと仕様が理解できていません。 よってAA列が「距離」と勘違いしました。 >(1)B列の番号が1つで、F列の出荷元が2つ(仮にf1・f2とおく)… 「混載」 >(2)B列の番号が1つで、F列の出荷元が1箇所の場合 … 「直送」 f1・f2が具体的にどういう事か?混載、直送共に「B列の番号が1つで」等々理解ができません。 >マクロでも、うまく行かないでしょうか。 VBAでユーザ関数を作ればできると思います。 画像が見えにくいのと、仕様(計算方法やどういう結果を求めるか)がわかりませんので、 画像ではなく、文字で具体例とどういう結果になれば良いかを説明して頂くと、回答できるかと 思います。
補足
>画像が見えにくいのと、仕様(計算方法やどういう結果を求めるか)がわかりませんので、 >画像ではなく、文字で具体例とどういう結果になれば良いかを説明して頂くと、回答できるかと >思います。 考えていただいてありがとうございます。 下に説明していきます。 B列 F列 H列 (4行目) 番号 出荷元 入荷先 (5行目) (6行目) 1 A あ (7行目) 1 A あ (8行目) 1 A あ (9行目) 2 C い (10行目) 2 C い (11行目) 2 D い (12行目) 3 E う (13行目) 3 E う (14行目) 3 E う (15行目) 3 E う (16行目) 4 A い (17行目) 4 B い (18行目) 4 B い 上の場合、 番号「1」の便では出荷元「A」から入荷先「あ」まで商品を出荷しています。 番号「3」の便では出荷元「E」から入荷先「う」まで商品を出荷しています。 ・・・・・・番号1つに対して、出荷元が1つなので「直送」 番号「2」の便では出荷元「C」と出荷元「D」から入荷先「い」まで商品を出荷しています。 番号「4」の便では出荷元「A」と出荷元「B」から入荷先「い」まで商品を出荷しています。 ・・・・・・番号1つに対して、出荷元が2つなので「混載」 出荷元は最大3ヶ所になります。 ●V列~X列に「直送距離マスタ」を作成しています。 V列 W列 X列 (4行目) 直送マスタ (5行目) 発場所 着場所 距離 (6行目) A あ 10 (7行目) A い 15 (8行目) A う 20 (9行目) B あ 5 (10行目) B い 7 (11行目) B う 9 (12行目) C あ 12 (13行目) C い 16 (14行目) E う 20 ※200行くらいあります。 ●Y列~AC列に「混載距離マスタ」を作成しています。 Y列 Z列 AA列 AB列 AC列 (4行目) 混載マスタ (5行目) 発場所1 発場所2 発場所3 着場所 距離 (6行目) A B い 40 (7行目) A C あ 32 (8行目) B C い 30 (9行目) B D E あ 50 (10行目) C D い 30 ※50行くらいあります。 こういった情報をもとに、U列に合計距離を出したいと思っています。 行数はB列の番号が変わる位置に入れたいです。 上の例でいうと次の位置で考えています。 セル「U6」に直送マスタを参照して「10」と入力 セル「U9」に混載マスタを参照して「30」と入力 セル「U12」に直送マスタを参照して「20」と入力 セル「U16」に直送マスタを参照して「40」と入力 なお、マスタに出荷元と入荷先の組み合わせが無い場合は"●"など、 目立つようにしたいです。 こういった感じでいかがでしょうか? #本腰を入れて考え始めて3日目になりました。
- jcctaira
- ベストアンサー率58% (119/204)
セルS6の質問と解釈して回答致します。 ※T列(混載判断)により、直送はV列~X列、混載はY列~AB列を使用します。 S6の式は以下の通りです(配列数式で {} は省略)。 =SUM((V$6:V$150=F6)*(W$6:W$150=H6)*(X$6:X$150)*(T6=""),(Y$6:Y$150=F6)*(Z$6:Z$150=H6)*(AA$6:AA$150)*(T6="混載"))
補足
「#VALUE!」のエラーが出てしまいます。 (1)B列の番号が1つで、F列の出荷元が2つ(仮にf1・f2とおく) ある場合は、「混載」と判定されて、混載マスタを参照する。 f1・f2の情報がY列・Z列のどちらかにあって H列の情報がAA列にある場合の AB列を表示させる。 (2)B列の番号が1つで、F列の出荷元が1箇所の場合は 「直送」と判定されて、直送マスタを使用。 F列の情報がV列に H列の情報がW列にある場合の X列を表示させる。 というような書式を設定したいです。 マクロでも、うまく行かないでしょうか。 ・B列がF列が2箇所の場合の判定の仕方と ・混載の場合の出荷元の組み合わせが発場所1発場所2に含まれる場合の 混載の距離を出力するなどで難航しています。
お礼
丁寧に教えていただき、ありがとうございました。 数式を改良して、何とかやりたいことが出来るようになりました。 これで、毎月約2日分の時間を減らすことが出来ると思います。 感謝しています。