EXCELで商品の納品管理を考えています。


納品した日付を入力することで、
自動的に未納品リストからそのデータが行ごと
抹消され、同時に、納品済みリストへ、
そのデータ行が自動付加されるような動きが
必要です。
また未納品リスト、納品済みリストともに、
"発注日"行のデータにて、自動的にソート
できればなおさらに理想的です。

どのように作ればよいのか、イメージがつかめないでおりまして、どなたかEXCELに詳しい方がいらっしゃいましたらば、ご教授ください。

回答の条件
  • 1人20回まで
  • 登録:2006/05/30 04:02:47
  • 終了:2006/05/30 17:04:58

回答(5件)

id:gong1971 No.1

gong1971回答回数443ベストアンサー獲得回数682006/05/30 10:47:13

ポイント20pt

なかなか回答が付かないようなのでアドバイスを...。

Excelで行を削除(抹消)したり、データを挿入(自動付加)するには

VBA(Visual Basic for Application)というプログラミング言語を

使用する必要があります。(いわゆる関数では処理出来ません。)


簡単なVBAであれば、はてなでも回答が付く事がありますし、

ある程度VBAを理解されている人からの質問では回答が付く事が

ありますが、そうでないと難しいかと思います。


もし、ある程度プログラミングの経験があるようでしたら、

下記のサイトでVBAを勉強してみると良いかもしれません。

http://www.sanynet.ne.jp/~awa/excelvba/kouza.html

http://www.tsucchy.com/Excel/contents.html


質問を見る限り業務での使用のようですが、可能であれば

会社の情報システム部門にご相談されたり、予算が許すのであれば

短期の派遣社員に依頼するのも手かと思います。


もし、ある程度VBAの経験があるですとか、状況が違うようであれば

コメントをください。別途アドバイスができるかもしれません。

id:kitatom

ありがとうございます。参考にさせていただきます。

2006/05/30 14:44:17
id:Kenju No.2

Kenju回答回数30ベストアンサー獲得回数22006/05/30 11:17:50

ポイント20pt

知識レベルが不明ですが、大体以下のようなマクロで可能です。

あとは適当に編集してください。

Worksheet_changeはイベントなので未納品リストシートに追加してください。

発注日付列はA列ならA1、B列ならB1というように指定してください。

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim 納品日付列 As Integer

  納品日付列 = 5

  If Not Target.Column = 納品日付列 _

   Then

    Exit Sub

  End If

  If ActiveSheet.Cells(Target.Row, 納品日付列).Value = "" _

   Then

    Exit Sub

  End If

  Call macro(Target.Row)

End Sub

Sub macro(ByVal targetRow As Long)

  Dim 納品済みリストシート As Object

  Dim 納品済みリスト行末 As Long

  Dim 発注日付列 As String

  Set 納品済みリストシート = ThisWorkbook.Worksheets(2)

  発注日付列 = "A1"

 '行ごと抹消とデータ行の追加

  ActiveSheet.Rows(targetRow).Cut

  納品済みリスト行末 = 納品済みリストシート.Cells(納品済みリストシート.Rows.Count, 1).End(xlUp).Row

  納品済みリストシート.Cells(納品済みリスト行末 + 1, 1).Insert Shift:=xlDown

  ActiveSheet.Rows(targetRow).Delete Shift:=xlShiftUp

 'ソート

  納品済みリストシート.Activate

  ActiveSheet.Cells.Sort Key1:=Range(発注日付列)

End Sub

id:kitatom

詳細なご回答ありがとうございます。

実際に未納品リストシートのコードに入力してみたのですが、動作が生じません。

次の点、さらにご教授いただけませんでしょうか?

1)未納品リストシート上にある、”納品日”列は、お教えいただきましたコード上では、どこで指定しているのでしょうか?

2)ワークシートに登録するタイプのマクロは初めて使用します。このタイプのマクロをRUNさせるためにしなければならない動作はあるのでしょうか?それとも、ワークシートのコードに登録してしまえば、特にトリガーは必要ないのでしょうか?

以上です。

当方、あまりVBAの知識がないために、

とんちんかんなお尋ねになってしまっていると思います。

いましばらくお知恵を拝借できれば幸いです。どうぞよろしくお願いいたします。

2006/05/30 14:49:06
id:Kenju No.3

Kenju回答回数30ベストアンサー獲得回数22006/05/30 15:21:52

ポイント100pt

オープンのためにポイントを使わせてしまって申し訳ないです。

1)納品日付列の指定について

納品日付列 = 5

という記述があります。ここではE列を指しています。

実際の納品日付列が左から数えて何列目にあるかを見て5の数値を変更してください。

2)Runのための前作業

未納品リストシートと納品済みリストシートが同じブックであり、シートとして分かれていることを確認してください。

納品済みリストシートが左から数えて2番目でない場合は

Set 納品済みリストシート = ThisWorkbook.Worksheets(2)

の()内の数値を変更してください。

マクロの記述方法は、未納品リストのシートで「Alt+F11」、左にあると思われる

未納品リストシート (Sheet1)   という記述を発見したら、右クリック->コードの表示

エディタが開きますのでペーストしてください。

あとは納品日付列を書き換えた時自動実行されます。

id:kitatom

再び、早速のご回答ありがとうございます。

納品日付列 は、L列でしたので 12 としました。またご教授いただきましたRUNのための前作業も行い、L列に日付を入力しても、まったく動作しません。何が悪いんでしょうね?

ところで、もうひとつ質問がふえてしまいました。

3)発注日付列 = "A1"とありますが、実際は、B4セルが項目名で、B5セル以降、下方に向けて実データが続いております。この場合は、発注日付列 = "B1"とすべきなのでしょうか?それとも実データの先頭データにあわせて、発注日付列 = "B5"とすべきなのでしょうか?

何度もお手間いただいてすみませんが、

何卒よろしくお願いいたします。

(ポイントは気にされないでください。)

2006/05/30 15:41:36
id:Kenju No.4

Kenju回答回数30ベストアンサー獲得回数22006/05/30 16:16:56

ポイント100pt

直接ペーストして確認しましたが、行間が空いてるせいかもしれません。

If の次の行が スペース行 Then になってると思いますが、行を詰めてすぐ次の行がThenになるようにして下さい。

あと、マクロの実行が不可になっていないかどうかも一応確認しておいてください。


B4が項目名ですか。その場合はこの記述のままでは意図しない結果になります。

Sub macro(ByVal targetRow As Long)

End Sub

っていう記述がありますが、この部分は削除してください。

代わりに、左のVBAProjectとか書いてあるところで右クリック「挿入」->「標準モジュール」でモジュールを追加して以下の記述をそこに貼り付けてやってください。

Sub macro(ByVal targetRow As Long)

  Dim 納品済みリストシート As Object

  Dim 納品済みリスト行末 As Long

  Dim 発注日付列 As String

  Dim 最左列 As Integer

  Dim 最右列 As Integer

  Set 納品済みリストシート = ThisWorkbook.Worksheets(2)

  最左列 = 2

  最右列 = 12

  発注日付列 = "B1"

 '行ごと抹消とデータ行の追加

  ActiveSheet.Rows(targetRow).Cut

  納品済みリスト行末 = 納品済みリストシート.Cells(納品済みリストシート.Rows.Count, 最左列).End(xlUp).Row

  納品済みリストシート.Cells(納品済みリスト行末 + 1, 1).Insert Shift:=xlDown

  ActiveSheet.Rows(targetRow).Delete Shift:=xlShiftUp

 'ソート

  納品済みリストシート.Activate

  ActiveSheet.Range(Cells(5, 最左列), Cells(納品済みリスト行末 + 1, 最右列)).Sort key1:=Range(発注日付列)

End Sub

最左列は記述のあるもっとも左の列を左から数えて何番目かを指定します。

最右列は記述のあるもっとも右の列を左から数えて何番目かを指定します。

発注日付列はB列であればB1の記述で、このままでいいはずです。

id:kitatom

おっしゃるご指示で、おかげさまで状況が少し進捗いたしました。これでマクロは動く環境であることはお分かりいただけたと思います。

新たな問題としては、以下の通りです。

"未納品リストシート"のL12列に日付を入力しますと、その行はシートから削除されるようになりましたが、左から2番目にあるシートである、"納品済みリストシート"を見てみますと、データが転記されておらず、まったくの空のシートのままとなってしまいます。

ちなみにご指示通りにSubルーチン部分は削除し、標準モジュールに新たにお教えいただいたコードを入力してあります。

その際、最左列と最右列なのですが、発注日と納品日以外にも他の項目もありますので、最左列 = 1、最右列 = 16とそれぞれ設定いたしました。

解決方法がお分かりになりましたらば、

お教えいただければと存じます。

何度も、本当にすみません。

2006/05/30 16:44:18
id:Kenju No.5

Kenju回答回数30ベストアンサー獲得回数22006/05/30 16:59:41

ポイント100pt

行の削除は切り貼りを行ってからなので削除だけされてデータが追加されないのは考えにくいです。(途中でエラーがでると以降の処理はされないはずだからです。

物が見えないので状況が不透明ですが・・・。

シートとシートの間に隠れているシートがあったりしませんか?

文字色が背景色と同一ではありませんか?

シートに保護がかかっていませんか?


といった程度しか考えつきません。

今の状況ではここまでしか提示できません。

物が公開されるか、詳細な情報が開示されればもう少しつっこんで提示できるのですが。。。

id:kitatom

了解いたしました。

ここまでお付き合いいただきまして、

ありがとうございます。

後は自力でなんとかやってみます。

貴兄の迅速なご回答と、たいへんな知見に

敬意を表します。

かさねてありがとうございました。

2006/05/30 17:03:38
  • id:Kenju
    中途半端になってしまいもうしわけありません。

    他に質問等ございましたらこちらのコメント欄で随時答えさせていただきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません