エクセルとアクセスでのデータ加工と出力についての質問

このQ&Aのポイント
  • エクセルやアクセスを利用して、営業所毎の配送数量データを加工する方法について教えてください。
  • 黄色い塗りつぶしの箇所では、箱数に応じて行数も自動で増やしたいです。良い方法はありますか?
  • また、加工後のデータをB6サイズの伝票に印字する方法も教えてください。
回答を見る
  • ベストアンサー

エクセルか、アクセスで下記のようなことが出来ますでしょうか?

エクセルか、アクセスで下記のようなことが出来ますでしょうか? まずは下記Webページに貼り付けた画像をみていただきたいのですが、 http://f58.aaa.livedoor.jp/~works/setumei.html 加工前状態で取引先からエクセルファイルが来ます。 これはテスト用データなので件数少ないですが、実際は1500行(1500営業所)ほどあります。 これを加工後の形になるようにしたいと考えています。 表のご説明をしますと、営業所毎に荷物を配送するのですが、 取引先からは営業所毎に配送する数量だけ来ます。 それを元にこちらで加工するのですが、列項目それぞれの意味としては、 「1箱の最大入り数」:梱包する箱にいくつ品物が入るかの個数です。 「必要箱数」:1箱の最大入り数に応じて、営業所毎に梱包箱がいくつ必要かを表しています。 「箱連番(営業所毎)」:営業所毎に、箱に連番を付けています。 「伝票番号(営業所毎)」:営業所毎の伝票に連番を付けますが、複数口の場合同一番号になるようにします。 「箱固有番号」:重複しない固有の箱番号を付けています。 「箱内数量」:それぞれの箱内に、いくつの品物が入ってるかを表しています。 説明が長くなってしまい申し訳ございません。 本題ですが、上記の表の中で、「箱内数量」を計算式で求めるにはどうすればよいでしょうか? それと、営業所毎に複数口配送となる場合(黄色い塗りつぶしの箇所です)、 箱数に応じて行数も増やしたいのですが、自動処理で良い方法はないでしょうか? それと、表が完成したのちに出力したいのですが、 B6サイズ程の伝票に、各行毎に1枚1枚伝票を印字したいのですが、 これはアクセスでないと出来ませんか? ※もし1500行あれば、各行毎に伝票枚数も1500枚となるように。 色々と大変な質問をして誠に申し訳ございません。 どうか宜しくお願いいたします。 Webページ上で、テスト用データもダウンロードできるようにしてありますので、 なにかのお役に立てますと幸いでございます。

質問者が選んだベストアンサー

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.8

何度もすみません、中途半端だったので 以下のコードを作成してみました Sub ボタン1_Click() With Sheets("加工後") .Range("2:65536").ClearContents For i = 2 To Range("A65536").End(xlUp).Row For j = 1 To Range("D" & i).Value GYOU = .Range("A65536").End(xlUp).Row + 1 .Range("A" & GYOU).Value = Range("A" & i).Value .Range("B" & GYOU).Value = Range("B" & i).Value .Range("C" & GYOU).Value = Range("C" & i).Value .Range("D" & GYOU).Value = Range("D" & i).Value .Range("E" & GYOU).Value = j .Range("F" & GYOU).Value = "111-1111-" & Right("1111" & (i - 1), 4) .Range("G" & GYOU).Value = GYOU - 1 .Range("H" & GYOU).FormulaR1C1 = _ "=MIN(RC[-5],RC[-6]-SUMIF(R1C[-2]:R[-1]C[-2],RC[-2],R1C[-5]:R[-1]C[-5]))" Next j Next i End With End Sub 結果は画面の通りです。 「1箱の最大入り数」と「必要箱数」は事前に手入力と関数を入れておきますが。

personman
質問者

お礼

お礼が遅くなりまして誠に申し訳ございませんでした!! VBAはまったく分からなかったので、ほんとに助かります。 まさに思い描いていた形になりました。 こんなに便利にエクセルが使えるだなんてとてもビックリしてます。 まだ実践で使ってないのでまずはテストを重ねてから、ありがたく使わせていただきたいと思います。 誠にありがとうございました。

その他の回答 (7)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.7

No6です。 >上記の表の中で、「箱内数量」を計算式で求めるにはどうすればよいでしょうか? =MIN(C2,B2-SUMIF(E$1:E1,E2,C$1:C1)) 下コピィでいけそうですね。 先ほどのVBAのコードですが、箱数の部分が抜けていました。 必要であれば編集の上、ご利用ください。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.6

一部、VBAの力を借りますが宜しいでしょうか。 加工前のシートで 「1箱の最大入り数」:梱包する箱にいくつ品物が入るかの個数です。 手入力ですよね。 「必要箱数」:1箱の最大入り数に応じて、営業所毎に梱包箱がいくつ必要かを表しています。 =ROUNDUP(B2/C2,0) の関数で下へコピィします。 >営業所毎に複数口配送となる場合(黄色い塗りつぶしの箇所です)、 >箱数に応じて行数も増やしたいのですが、自動処理で良い方法はないでしょうか? この部分にVBAを使いますが、VBエディターを起動して Sub ボタン1_Click() With Sheets("加工後") .Range("2:65536").ClearContents For i = 2 To Range("A65536").End(xlUp).Row For j = 1 To Range("D" & i).Value GYOU = .Range("A65536").End(xlUp).Row + 1 .Range("A" & GYOU).Value = Range("A" & i).Value .Range("B" & GYOU).Value = Range("B" & i).Value .Range("C" & GYOU).Value = Range("C" & i).Value .Range("D" & GYOU).Value = j .Range("E" & GYOU).Value = "111-1111-111" & (i - 1) .Range("F" & GYOU).Value = GYOU - 1 Next j Next i End With End Sub を貼り付けて閉じておきます。 別途、シート名で 加工後 という名前のシートを準備して、1行目に項目を入れてください。 マクロで ボタン1 を実行すると 箱固有番号までは自動で得られると思います。 >上記の表の中で、「箱内数量」を計算式で求めるにはどうすればよいでしょうか? は申し訳ありませんが、別途関数を検討してください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.2・3・4です! ほんとぉ~っに!何度もごめんなさい。 お詫びの印と言っては失礼なのですが、もう一度考えてみました。 あまり美しくないのですが、もう1列作業用の列を追加して 営業所名の重複があってもH列に数値を表示できる方法です。 尚、重複がある営業所に関しては営業所名の後ろに、2や3の数値が余分についてしまいます。 ↓の画像の作業列I2セルに =IF(COUNTIF($A$2:A2,A2)=1,A2,A2&COUNTIF($A$2:A2,A2)) J2セルに =IF(B2="","",IF(MOD(B2,C2)=0,INT(B2/C2),INT(B2/C2)+1)) として、I2・J2セルを範囲指定し、J2セルのフィルハンドルで下へコピー K2セルは =IF(OR($J2="",$J2<COLUMN(A1)),"",ROW(A1)*1000+COLUMN(A1)) として、列方向と行方向にオートフィルでコピーします。 Sheet2のA2セルには =IF(COUNT(Sheet1!$K$2:$T$1000)<ROW(A1),"",INDEX(Sheet1!$I$2:$I$1000,INT(SMALL(Sheet1!$K$2:$S$1000,ROW(A1))/1000))) として、下へコピー! 最後にSheet2のH2セルは =IF(A2="","",IF(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0))>=COUNTIF(Sheet2!$A$2:Sheet2!A2,A2)*INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0)),INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0)),MOD(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0)),INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0))))) としてこれも下へコピーします。 もし、入数が「50」と決まっているのであれば H2セルの数式は =IF(A2="","",IF(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0))>=COUNTIF(Sheet2!$A$2:Sheet2!A2,A2)*50,50,MOD(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$I$2:$I$1000,0)),50))) でも大丈夫だと思います。 以上、今回も長々と書いてしまいました。 何度もごめんなさいね。m(__)m

personman
質問者

お礼

お礼が遅くなりまして誠に申し訳ございませんでした!! しかも何度もご教示いただきまして、お手数をおかけしましてほんとに恐縮しております。 ベストアンサーが1人しか選べなくてとても迷いました・・・。 申し訳ございません・・・。 しかしながら、tom04様の温かいお心遣いがとても伝わってきました。 感動致しました。 心よりお礼を申し上げます。 誠にありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2・3です! 何度もごめんなさい。 投稿した後に気づきました。 Sheet1のA列には営業所名が重複してあるわけですよね? その場合は前回の方法では正確な値は表示できません。 というわけで 今までの方法は無視してください。 どうもたびたびごめんなさいね。m(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です! たびたびごめんなさい。 前回の作業用の数式ですが、 J2セルの数式を =IF(OR($I2="",$I2<COLUMN(A1)),"",ROW(A1)*1000+COLUMN(A1)) に訂正してください。 前回の数式ですと、空白の行まで数値が表示されると思います。 どうも何度も失礼しました。m(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 参考になるかどうか判りませんが・・・ ↓の画像のように無理矢理作業用の表を作成してやってみました。 とりあえず、A・H列の表示だけの方法です。 Sheet1の1000行目まで対応できる数式にしています。 Sheet1に作業用の表を設けます。 作業列I2セルに =IF(B2="","",IF(MOD(B2,C2)=0,INT(B2/C2),INT(B2/C2)+1)) という数式を入れフィルハンドルの(+)マークでダブルクリック、又はオートフィルで下へコピーします。 これでSheet2にA列のデータを表示させるために何行必要かを表示させます。 そして、作業表のJ2セルに =IF($I2<COLUMN(A1),"",ROW(A1)*1000+COLUMN(A1)) という数式を入れ、列方向(右)にオートフィルでコピーします。 空白になっても構いませんので、しっかり右へコピーしておきます。 (今回は数式の関係でR列までのコピーとしておきました。) そして、オートフィルした2行目全てを範囲指定し、R2セルのフィルハンドルで下へコピーすると 画像のような数値が表示されると思います。 この数値を元に、Sheet2に表示させます。 Sheet2のA2セルに =IF(COUNT(Sheet1!$J$2:$R$1000)<ROW(A1),"",INDEX(Sheet1!$A$2:$A$1000,INT(SMALL(Sheet1!$J$2:$R$1000,ROW(A1))/1000))) という数式を入れ、オートフィルで下へコピー そして、H2セルには =IF(A2="","",IF(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$A$2:$A$1000,0))>=COUNTIF($A$2:A2,A2)*INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$A$2:$A$1000,0)),INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$A$2:$A$1000,0)),MOD(INDEX(Sheet1!$B$2:$B$1000,MATCH(A2,Sheet1!$A$2:$A$1000,0)),INDEX(Sheet1!$C$2:$C$1000,MATCH(A2,Sheet1!$A$2:$A$1000,0))))) という数式を入れこれも下へコピーします。 これで画像のような感じになります。 以上、長々と書きましたが 参考になれば幸いです。m(__)m

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

エクセルの場合。 加工後のH2の数式は =MIN(INDEX(C:C,MATCH(F2,F:F,0)),INDEX(B:B,MATCH(F2,F:F,0))-(ROW()-MATCH(F2,F:F,0))*INDEX(C:C,MATCH(F2,F:F,0))) などのような感じで,H3やH4からH7などにこのままつるつるっとコピーして入れておくと出てきます。 行を「勝手に追加してくれる」機能はありません。マクロが書けるならマクロで,出来なければ今はとりあえず手作業で(いままで通り?)「必要箱数」の計算結果を見ながら行を挿入してください。 マクロ自体はそんなに難易度の高いものではありませんが,それでも今はまだマクロなんて無理という時は,うかつにここで誰かに作ってもらったのを信じて使うとあとで困りますので,少し勉強して自作するか誰かマクロ使いを捜して実際のブックに合わせてマクロを書いて貰ってください。 表の並び順とかがちょっとでも変わると直ちにマクロも変更になりますので,要件が変わった時すぐに対応してマクロを正しく適切に直してくれる人を捕まえておくか,そういう仕事のお手伝いをしてくれる人が見つからなければご自分で作成できるようになってください。 なおマクロが自作できるなら,行追加に併せて「箱内数量」もマクロに計算させて,入れさせてしまった方が多分簡単です。 >伝票印刷 こちらもやっぱりマクロが使えれば出来ますが,ワードに伝票様式を作成して差込印刷すれば,マクロとか出来なくてもすぐに作成でもできます。 ただしその場合,箱数が増えて追加した行にも「漏れなく」データを書き入れておかないといけません。今みたいに空きのまま,グループの先頭行を見てみたいな手抜きをすると収拾がつかなくなりがちです。 #あんまり「それからそれから」のご質問で,その一つ一つに精緻な回答を付けているときりがありませんので,出来る範囲の事をとりあえず自力で作成してみて下さい。 不明の点や自分でやってみて出来なかった部分は,具体的な問題箇所の状況(ここまでこうやって,ここで躓いたと)を添えてピンポイントに,遠慮なくまたご質問を投稿なさってみてください。

personman
質問者

お礼

お礼が遅くなりまして誠に申し訳ございませんでした!! 箱内数量の数式は大変助かりました。 ありがたくご利用させていただきます。 誠にありがとうございました。

関連するQ&A

  • エクセルでセルに入力した値によってそれに対応した数値で合計を出す

    以下のような表を作成します (あ)入力用の表      A    B    C     D 1    品物   箱数   バラ個数  合計個数 2    りんご  3     7     157 3    みかん  2     9     209 (い)品物の一箱あたりの個数を記したデータの表      A    B 100  品物   一箱あたりの個数 101  りんご  50 102  みかん  100 103  ぶどう  30 2行目について説明しますと、 まずA2に(い)の表のA列のリストに書いてある品物の名称を入力します。 次にB2に箱数を入力、最後に箱とは別にバラの個数をC2に入力します。 そうすると、りんごは一箱50個入りで、それ以外にバラで7個なので、 D2の合計個数は 3(箱)×50(個/箱)+7(個)=157(個) となるような数式は、どのように書けばよろしいでしょうか…。 よろしくお願いします。

  • エクセル VBAの修正箇所について

    エクセル VBAの修正箇所について 物品配送関係の管理表を作成中ですが、一部VBAの動作を下記のように修正するにはどこを修正したらよろしいでしょうか? サンプルファイル(エクセル2003で作成)をアップロードしましたので、宜しくお願い致します。 http://www.filebank.co.jp/filelink/9315d83f25575cce44fad4fea1d0cf38 VBAの動作を簡潔にご説明しますと、 各営業所毎に、決められた個数の物を箱詰めして送付しています。 例えば、1営業所への送付個数120個、ダンボール1箱の入り数50個だった場合、 20個、50個、50個の合計3箱のダンボールを送付するということになります。 それをVBAにて処理できるように作成中です。 加工前シートの実行ボタンをクリックすると、加工後シートに反映されるようにしています。 ■修正箇所1 「箱内数量」の計算がうまくいきません。 例えば、送付個数150個、ダンボール1箱の入り数50個だった場合、 本来なら、50個、50個、50個の合計3箱になってほしいのですが、 どういうわけか、0個、50個、50個になってしまいます。 ただし、送付個数120個、ダンボール1箱の入り数50個のように端数が出る場合は、 20個、50個、50個と正常に計算されます。 ■修正箇所2 「箱連番(営業所毎)」の列は、その名の通り営業所毎に送付する箱に連番を振ってるのですが、数字が降順ではなく昇順になるようにしたいです。 以上、2箇所の修正点ご教示いただきたく思います。 どうか宜しくお願い致します。

  • アクセスVBA超初級

    依頼伝票を、アクセスのデータベースで、1枚ごとに入力しています。 伝票には、一意の伝票Noが振ってあります。 上段には、おおまかな、請求先や日付や、金額の総合計が入力してあり、 その下に、サブフォームとして、細かい項目分類ごとの、品目や数量、単価、小計などを 入力するようにしています。(分析用クエリ、というタイトルで) その項目分類ごとに、1行、項目が増えるごとに、項目番号として、行の始めに、 1、2、3、4、5、と、順次増えるように、自動的に、連番を振りたいのです。 Private Sub Form_BeforeInsert(Cancel As Integer) If DCount("*", "Q_分析用 クエリ") = 0 Then 項目番号 = 1 Else 項目番号 = DMax("項目番号", "Q_分析用 クエリ") + 1 End If End Sub それで、上記のようなVBEを考えたのですが、これですと、各1枚ごとの伝票に 連番が振ることができずに、全ての伝票を通しての、連番になってしまいます。 1枚ごとに、また、1から連番を振るようにするには、どうすればいいでしょうか。 わかりにくい質問で申し訳ありませんが、よろしくお願いします。

  • 商品を混在させて箱に詰めていった場合の、梱包数

    エクセルにて箱の大きさは問わずに、商品それぞれの重量単位で箱に詰めていった場合、箱が何箱必要か計算したいのですが。2週間たっても今だ解決しなくて困っています。どうかよろしくお願いします。 条件1: ひと箱あたり最大20Kgまで入ります。(箱の大きさは問わない) 条件2: 一つの商品を切り分けて別の箱に移すことができない 条件3: 商品を効率よく混在させて箱に詰めていった場合の、梱包箱数を求めたい

  • [Access]別テーブルの最大値以降の連番振り

    過去の質問を色々調べたのですが、結局以下の連番の振り方が分からず・・・困っています。 どなたか助けて下さい。お願いいたします。 テーブルA(蓄積されている過去テーブル) 伝票番号  顧客NO  注文日 001 111111 2012/11/10 001 111111 2012/11/10 002 222222 2012/11/25 002 222222 2012/11/25 002 222222 2012/11/25 003 333333 2012/12/31 テーブルB(新規にインポートするテーブル) 004 444444 2013/02/01 004 444444 2013/02/01 005 222222 2013/02/15 005 222222 2013/02/15 006 555555 2013/02/15 006 555555 2013/02/15 上記のように、テーブルBをインポートした時に、伝票番号を「004,004,005・・・」という風に 顧客NO毎に連番を振りたいです。 DmaxやDcount関数を使う事はなんとなく分かったのですが、うまくいきません。 出来れば、クエリで実現したいと思ってます。 テーブルAにある顧客がテーブルBに出てきたとしても、関係なく連番が振れれば問題無いので、 テーブルAからは最大値+1の値だけ取れればいいです。 宜しくお願いいたします!!

  • 桐Ver9の主キーの設定

    桐Ver9をWindowsXPで使ってます。 表定義で主キーを複数設定することってできないのでしょうか? 簡単に言うと、 伝票表(伝票番号,顧客ID,売上日)      ~~~~~~~~ 明細表(伝票番号,商品コード,数量)      ~~~~~~~~  ~~~~~~~~~ といったときの、明細表の[伝票番号]と[商品コード]なのですが。

  • DVDを宅急便で送る際の伝票の書き方について

    DVDBOXをクロネコヤマト宅急便で送ろうかと考えています。 エアパッキンや水濡れ防止の梱包をして、ダンボール箱に入れたのですが、 品名がDVDでも配送伝票のコワレモノに丸を付けても大丈夫でしょうか?

  • EXCELのVBAで出荷個数の累計

    お尋ねいたします。 以下のような一日の納品書のデータベースがありまして 日付,No,品名,数量,,,,, 4/1, 1, A, 3,,,,, 4/1, 2, A, 4,,,,, 4/1, 3, A, 2,,,,ここまで1枚の伝票 4/1, 1, A, 3,,,,,ここで2枚の伝票 4/1, 1, A, 4,,,,, 4/1, 2, A, 2,,,,,,ここで3枚目の伝票 1枚目の伝票の出荷累計 9 2枚目の伝票の出荷累計 3 3枚目の伝票の出荷累計 6  作りたい集計表 日付,No,品名,数量,累計 4/1, 1, A, 3, 9 4/1, 1, A, 3, 3 4/1, 1, A, 4, 6 4/1,,,,,,最大で300行位あります ピボットテーブルでなくワークシートにデータベースとして作りたいのです(後で他のテーブルとAccessでリレーションしたいと思っていますので) よろしくお願いいたします。

  • ACCESS 追加クエリでレコード数の指定したい

    Win XP Access2003 見積伝票を作成しております。サブフォーム(帳票フォーム)の登録方法でご教授お願い致します。 "伝票明細テーブルW"(伝票番号,行番号,内容、数量、単価、・・・)を基にした "伝票明細クエリW"を作成し、入力しやすいようにフォームを開いた時に行番号(連番)を振り、30行表示するようになっています。 入力確認後に登録ボタンをクリックして追加クエリを開き"伝票明細テーブルW"から"伝票明細テーブル"に30件レコード保存するようになっているのですが、 場合によって内容が2~3行で終わる時があります。 このような時に無駄に30行のレコードを保存せず"内容"(フィールド)が入力されているの最終レコードまでで伝票明細テーブルに追加したいのですが、よい方法がありましたら宜しくお願い致します。 "内容"(フィールド)は途中に空白の時があります。 行番号    内容        数量  1     オイル交換      3.0  2  3     タイヤ交換       4.0

  • access2003

    2000種ほどの商品を扱っています。商品コードひとつにつき、仕入先・取引先が1箇所ずつ決まっていて、値段の変化もあまりありません。伝票を見ながら、フォームから直接売上入力を行い、請求処理と売上分析に利用したく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 入力の効率化を図るため、1部品1取引先であることを利用して、親フォームで取引先を選択することで商品を絞り込み、子フォームの商品選択コンボボックスにはその取引先の商品だけが表示させるようにしたいと思います。どのような方法が考えれるでしょうか? クエリを使うのだと思いますが、いろいろ試しても失敗してしまいます。 また、その上でさらなる絞込みとして、明細の各行で各商品を選択する際に、商品コードの一部を入れたり、仕入先名を入れると部品が絞り込めるようにできないでしょうか? アドバイス、参考資料、なんでもお寄せください! どうぞよろしくお願いいたします。

専門家に質問してみよう