• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:倉庫の管理で困っています)

倉庫の管理で困っています

このQ&Aのポイント
  • 無謀な試み?倉庫の商品管理をエクセルで行っているが、問題が発生している。入庫に関しての質問。
  • VBAを使って入庫操作を自動化したい。具体的には、Sheet1に入力した商品をSheet2の倉庫に配置したい。
  • 具体的な操作手順や問題点についてアドバイスを求めている。範囲指定や条件分岐、商品の移動などを考慮する必要がある。

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

  • ベストアンサー
  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.7

あまり変なものは使っていないので(基本的なものばかり)バージョンによるエラーは起こりづらいだろうなと思っています。 むしろシートやセルの名前が違うとか(完全一致しないと半角全角スペースの有無の違いでもだめ)、データ型が違うとかのようなエラーは起こっているかもしれません。 シート名の箇所をわかりやすく(というかそのまま使えるように)して、お隣の列に移るようにしてみました。 ちなみに全くスピードは追求しておりません。 Sub 入庫() Dim l As Long 'コースの列場所 Dim d As Long '段積み数 Dim s As Long 'シートを確定するための変数 Dim k As Long, c As Long, j As Long, t As Long, n As Long '計算のための変数 Dim data As Variant Dim ws As Worksheet data = Sheets("Sheet1").Range("a1:g" & Range("a1000").End(xlUp).Row) For j = 2 To UBound(data) 'シート1の行分だけ繰り返す s = (Int(Val(data(j, 7) - 1) / 10) + 1) * 10 Set ws = Sheets(CStr(s - 9) & "-" & CStr(s))  ’新しい約束事でのシート名。存在しないとエラーに l = ((Val(data(j, 7)) - 1) Mod 10) * 5 + 2 Select Case data(j, 5) Case "中" d = 3 Case "小" 'パレット種による場合わけ d = 5 End Select c = data(j, 6) 'ループで書き込むたびにパレット数を減らす k = 2 '書き始めの行位置 Do If ws.Cells(k, l).Value = "" Then '記入があるか確認して t = d If c < d Then t = c 'tはコピペする行数 For n = 1 To 4 ws.Range(ws.Cells(k, l + n - 1), ws.Cells(k + t - 1, l + n -1)) = data(j, n) Next c = c - d '残りのパレット数 End If If c <= 0 Then Exit Do 'パレット残数が0になったらループを抜ける k = k + 6 if k>91 then '91行目を超えると次のコースの頭に移る k=2 l=l+5 end if Loop Next End Sub

acter_k
質問者

お礼

動きました! ありがとうございました。 解決というわけではありませんが、参考にさせていただいて、もっと深めていこうと思います。 なんとか、仕事が軽減できればいいのですが・・・ ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.6

やっぱり確認してから送らないと駄目ですね。 配列を使うものに戻しました。 前の補足でシート名が変わったようなので、対応させたものを’でコメントアウトして載せてます。 使う場合には’をとって(2行とも)使ってください。 ちなみに私のコードでもコースの列が足りなくなったからといってお隣のコースには移りません。 移ったほうが良いのですか? Sub 入庫() Dim l As Long 'コースの列場所 Dim d As Long '段積み数 Dim s As Long 'シートを確定するための変数 Dim k As Long, c As Long, j As Long, t As Long, n As Long '計算のための変数 Dim data As Variant Dim ws As Worksheet data = Sheets("Sheet1").Range("a1:g" & Range("a1000").End(xlUp).Row) For j = 2 To UBound(data) 'シート1の行分だけ繰り返す Set ws = Sheets("Sheet" & CStr(Int(Val(data(j, 7)) / 10) + 2)) '書き込みシートの指定 's = (Int(Val(data(j, 7) - 1) / 10) + 1) * 10 'Set ws = Sheets(CStr(s - 9) & "-" & CStr(s)) l = ((Val(data(j, 7)) - 1) Mod 10) * 5 + 2 '書き込みシート内の列の指定 Select Case data(j, 5) Case "中" d = 3 Case "小" 'パレット種による場合わけ d = 5 End Select c = data(j, 6) 'ループで書き込むたびにパレット数を減らす(減らす前のパレット数) k = 2 '書き始めの行位置 Do If ws.Cells(k, l).Value = "" Then '記入があるか確認して t = d If c < d Then t = c 'tはコピペする行数 For n = 1 To 4 ws.Range(ws.Cells(k, l + n - 1), ws.Cells(k + t - 1, l + n - 1)) = data(j, n) Next c = c - d '残りのパレット数 End If If c <= 0 Then Exit Do 'パレット残数が0になったらループを抜ける k = k + 6 Loop Until ws.Range("a10000").End(xlUp).Row < k '無限ループ回避(特に必要ない)1コース内2000列よりは少ないよね? Next End Sub

acter_k
質問者

お礼

重ねて感謝申し上げます。 貴重な時間をありがとうございます。 それにくらべ、私の説明が、当を得たものでなく、また舌っ足らずで 申し訳ありません。 実際には、倉庫に模したSheet2以降は「1-10」「11-20」・・・「241-250」と続きます。 つまり、10「コース」ごとに1シートを使っているわけです。 そして、1コースはほぼ15列×5段になっています。エクセルの行でいえば、91行が「コース」の最後になっています。 現場の作業は、「コース」が一杯になると、次のコースの空いている「列」(エクセルでは「行」)の空いている場所に詰めることになります。 まだまだ道は遠いようです。 コードをためして見ましたが、やはり最初のsetのところでエラーが出ます。 実行時エラー'9':インデックスが有効範囲にありません。 となります。 申し遅れましたが、私のexcelは、2000ですので、そのせいかもしれません。 とても勉強になっています。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.5

時系列管理を含めると多分その方法ではどうにもならない(つかえない)と思うのですが、とりあえず入庫の書き込みに関してだけ考えていきます。 sheet2から後のシートはよく分からなかったので(画像では読み取れない) ・データはB2から入る(A列とB列は見だし) ・コース・列が変わるごとに1行・1列あける。 ・シート1枚に1コースから10コース、11コースから20コースと入っている と仮定する。 Sub 入庫() Dim l As Long 'コースの列場所 Dim d As Long '段積み数 Dim k As Long, c As Long, j As Long, t As Long '計算のための変数 Dim ws As Worksheet Dim ws1 As Worksheet Set ws = Sheets("Sheet1") For j = 2 To ws1.Range("a1000").End(xlUp).Row 'シート1の行分だけ繰り返す Set ws = Sheets("Sheet" & CStr(Int(Val(ws1.Range("g" & j)) / 10) + 2)) '書き込みシートの指定 l = ((Val(ws1.Range("g" & j)) - 1) Mod 10) * 5 + 2 '書き込みシート内の列の指定 Select Case ws1.Range("g" & j) Case "中" d = 3 Case "小" 'パレット種による場合わけ d = 5 End Select c = ws1.Range("f" & j) 'ループで書き込むたびにパレット数を減らす(減らす前のパレット数) k = 2 '書き始めの行位置 Do If ws.Cells(k, l).Value = "" Then '記入があるか確認して t = d If c < d Then t = c 'tはコピペする行数 ws1.Range(ws1.Range("a" & j), ws1.Range("d" & j)).Copy ws.Range(ws.Cells(k, l), ws.Cells(k + t - 1, l + 3)) c = c - d '残りのパレット数 End If If c <= 0 Then Exit Do 'パレット残数が0になったらループを抜ける k = k + 6 Loop Until ws.Range("a10000").End(xlUp).Row < k '無限ループ回避(特に必要ない)1コース内2000列よりは少ないよね? Next End Sub こんなかんじでしょうか。動作確認後に少しいじったので、動くかどうか分かりませんが。

acter_k
質問者

お礼

お忙しい中、こんなに早くありがとうございます。 でも、残念ながら動きませんでした。 最初のForの行で 「実行時エラー'91' オブジェクト変数、またはWithブロック変数が設定されていません。」 のエラーになります。 VBAの勉強は始めたばかりで、デバッグの仕方もわかりません。 自分でも見よう見まねで、以下のようなものを書きましたが、 これも動きません(^^; 困りました。 Dim comDate As String Dim n As Integer Sub 入庫管理() Dim w As Worksheet 'Sheetを選択する Worksheets("Sheet1").Activate w = Worksheets("Sheet1").Cells(n, 7).Value Select Case w Case "1","2","3","4","5","6","7","8","9","10" ws = Sheets("1-10") Case "11","12","13","14","15","16","17","18","19","20" ws = Sheets("11-20")            ・            ・            ・ End Select For n = 2 To 1000 '2から1000まで次の動作をくり返す comDate = Sheets("Sheet1").Range(Cells(n, 1), Cells(n, 4)).Value 'Sheet1 n行1~4列の値 'Caseで振り分けたシートをアクティブにする ws.Activate '「コース」(列)を選択し、入力を開始する空白セルを選択する If ws.Cells(3, 2) <> "" Then '二行目から下の空白セルを探す Do Until ActiveCell = "" ActiveCell.Offset(6, 0).Select Loop End If 'comDateを三行ずつx回貼り付ける Dim x As Integer x = Worksheets("shieet1").Cells(n, 5).Value / 3 Do Until x Sheets("Sheet1").Range(Cells(n, 1), Cells(n, 4)).Select wrksht.Activate Selection.Copy For COUNTER = 0 To 3 ActiveCell.Offset(0, 0).Select ActiveSheet.Paste Next ActiveCell.Offset(4, 0).Select Loop Next End Sub そもそも、私のは、「コース」の下限に来たときに折り返して次の「コース」に移ることもできていないし、そもそも文法が合っているかどうかもわかりません(^^;

すると、全ての回答が全文表示されます。
  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.4

作業そのものは単純で、VBAには向いていると思います。 その代わり、時系列での管理や問題が発生した場合には困りますけれどね。 まあ、その辺りはこれまでもやられてきたでしょうから・・・。 いくつか質問があります。 中パレットと小パレット(大パレットもあるの?)は混在して1つの列に存在することはあるのですか? どういうタイミングでコース書き込みをするつもりですか? シート1を書き終わったらボタンを押すみたいな? (どちらかといえばこっちを推薦しますが) シート1の行のあるセルの入力がされるたびに?

acter_k
質問者

補足

ありがとうございます。 大パレットはありません。 中パレットと、小パレットが「コース」上に混在する事はありますが、 列につまりは上下に重ねられる事はありません。 書き込みのポイントは、おっしゃるように、シート1を入力し終えてから ボタンを押すようにしたいと思っています。 時系列については、いまのところ データ検索用のセルをSheet2に置いてそれをlogdateとして If logDate > Sheets("Sheet1").Cells(n, 4).Value Then などとやってみようかと思っています。 なんとかなるでしょうか?

すると、全ての回答が全文表示されます。
  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.3

>どなたか、お知恵をお願いします。 無料のアイデアは期待しない方が良いでしょう。 Excelを応用することを否定しませんが、質問の文言だけで具体的な方法論は出ません。 実際の管理状況をフローチャートに書き出してソフトの専門家に見てもらうと良いでしょう。 業務の効率化が出来れば利益が上がるのですからそれなりの費用を費やすことを考えてください。 費用対効果を評価しないで効率化を始めると見えない費用(人件費など)が大幅に増えて逆効果になります。 個人レベルの知識習得で行き詰った問題を具体的に質問された方が回答を得やすくなります。

acter_k
質問者

お礼

アドバイスありがとうございます。 残念ながら、私は会社の管理責任者ではありません。 単に、自分の摩滅的な仕事を楽にできないかという発想からの質問でした。 したがって、予算もなければ専門家への相談も不可能です。 ここはそういう場ではないのだということがよくわかりました。 ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • k-josui
  • ベストアンサー率24% (3220/13026)
回答No.2

書かれていますが・・・ Excelでやる事自体無謀、専用ソフトを買って下さい。 ただ、一旦導入するとそれに依存することになります。 目先の金額だけにとらわれず、様々な変動要素も考えて導入した方がいいですよ。 フリーソフトなどで導入すると、一つ変動があっただけで身動き取れなくなってその処理で忙殺されることになります。 きちんとサポートのあるソフトが、結果的に安くなると場合もあります。 (メンテナンスで何日もかかったら人件費だけで膨大になるでしょ、それ以前に身動きできなくなりますが) https://www.google.co.jp/webhp?rls=ig#newwindow=1&q=%E5%9C%A8%E5%BA%AB%E7%AE%A1%E7%90%86%E3%82%BD%E3%83%95%E3%83%88&rls=ig

acter_k
質問者

お礼

ご回答ありがとうございます。 私は会社経営者でもなければ管理者でもありません。 ただのオペレータです。 自分の仕事をなんとか楽にしたくて質問しましたが、ここはそういう場では無いようですね。 電子タグなどをつかって、管理するよう会社には進言していますが、会社にはまったくその気がなく、家に持ち帰って零時過ぎまでデータ入力に追われているのです。 アドバイスはありがたいですが、専用ソフト導入も何も権限がありません。 ここは私のような者が来る場所ではなようですね。

すると、全ての回答が全文表示されます。
  • yasuto07
  • ベストアンサー率12% (1344/10625)
回答No.1

あのさ、ソフトがまずいよ、ファイルメーカー10が、Amazonで、5000円くらいだから、それ買って帳票作りなよ、 エイ列の10番目の棚の100番目の商品、、、そんなの、簡単に管理できますよ、ソフトがまずいでしょう。

acter_k
質問者

お礼

アドバイスありがとうございました。 しかし、何を言われているのか私には理解できませんでした。 残念です。

すると、全ての回答が全文表示されます。

関連するQ&A