[[20091214134620]] 『セルに文字を入力したら別セルに自動的に入力した』(ベック) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルに文字を入力したら別セルに自動的に入力した日付を表示』(ベック)

        A    B    C    D    E    F    G
      日付  得意先  コード  商品名  数量   納期  ××× ・・・・・
  6               AAAAA
  7
  8
  9
 10

上記のような表なのですが、D6に商品名を入力すると、A6に入力した日付を自動的に表示させる方法はあるのでしょうか。

=IF(D80="","",TODAY())を入力していたのですが、これだと打ち込んだ日ではなく、常に当日の日付が表示されてしまい困っております。

どなたかご回答宜しくお願いします。

OS=XP Excel=2000


 処理日を定数で入力する必要がありますので、関数では無理があります。
 とりあえずSheetのChangeイベントを使うのが、手っ取り早いかと。

 Private Sub Worksheet_Change(ByVal Target As Range)
     If IsArray(Target) Then Exit Sub
     If Target.Column <> 4 Then Exit Sub
     If Target.Value = "" Then Exit Sub
     Cells(Target.Row, 1) = Date
 End Sub

 (白茶)


白茶様

早速の回答有難う御座います。

関数だと厳しいのですね・・・。

その表には今下記のようなコードが入っているのですが、それと併用するにはどうすれば宜しいでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo err:

   ' ソート
If ((Target.Column = 4) And (Target.Row >= 6)) Then
    Rows("6:" & CStr(ActiveSheet.Cells.SpecialCells(xlLastCell).Row)).Select
    Selection.Sort Key1:=Range("D6"), Order1:=xlAscending
    Cells(Target.Row, Target.Column).Select
End If

    With Target
        If .Count <> 1 Then Exit Sub
        If .Row = 1 Then Exit Sub
        If .Column <> 9 Then Exit Sub
        If .Value = "済" Then
        Application.EnableEvents = False
            n = Worksheets("Sheet2") _
                .Range("I" & Rows.Count).End(xlUp).Offset(1).Row
            .EntireRow.Copy Worksheets("Sheet2").Cells(n, 1)
            .EntireRow.Delete
        End If
    End With

err:

    Application.EnableEvents = True
End Sub

マクロやVBAはすごく初心者なので、申し訳ないです。


 並べ替えの処理が入っているようですので、
 その処理よりも前にやるべきでしょう。
 先頭で良いのではないかと思います。

 (白茶)


白茶様

一番先頭に持って来たんですが、うまくいきません・・・。

Private Sub Worksheet_Change(ByVal Target As Range)
○○○
On Error GoTo err:

○○○の位置に、作って頂いたコードを入力すれば宜しいのですか?

すみません、頭の悪い質問で・・・。


 場所は、On Error GoTo err:
 の下でも上でも良いと思います。

 Private Sub Worksheet_Change(ByVal Target As Range) 

    On Error GoTo err:

     If IsArray(Target) Then Exit Sub       '複数セルを同時に書き換えた場合は処理せず終わる
     If Target.Column <> 4 Then Exit Sub    'D列のセル以外を書き換えた場合は処理せず終わる
     If Target.Value = "" Then Exit Sub     '値のクリアだった場合は処理せず終わる
     Cells(Target.Row, 1) = Date            'ターゲットと同行のA列のセルにシステム日付を入力(目的の処理)

 という処理の流れですから、
 (目的の処理)に到達しないのであれば、余計なエラー回避は外して下さい。

 エラーが起こるのであれば・・・
 それはこちらには見えない部分の話ですので、
 せめてエラーの発生するラインと、その処理に関わるSheet上の状態くらい判らないと
 何とも言えません。

 (白茶)


白茶様

回答ありがとうございます。
しかも解りやすい解説まで付けてくださって。

一度落ち着いて実行してみます。

有難う御座います。


白茶様

出来ました!
改めて有難う御座います。
助かりました。


何度も申し訳ありません。

下記のようなコードで実行したところ、並び替えと日付は大丈夫だったのですが、”済”で指定しているコードの実行が出来なくなりました。
どこが間違っているのか分からず色々触ってみたのですが、教えて下さい。

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo err:

     If IsArray(Target) Then Exit Sub
     If Target.Column <> 4 Then Exit Sub
     If Target.Value = "" Then Exit Sub

   ' ソート
If ((Target.Column = 4) And (Target.Row >= 6)) Then
    Rows("6:" & CStr(ActiveSheet.Cells.SpecialCells(xlLastCell).Row)).Select
    Selection.Sort Key1:=Range("D6"), Order1:=xlAscending
    Cells(Target.Row, Target.Column).Select
End If

    With Target
        If .Count <> 1 Then Exit Sub
        If .Row = 1 Then Exit Sub
        If .Column <> 9 Then Exit Sub
        If .Value = "済" Then
        Application.EnableEvents = False
            n = Worksheets("Sheet2") _
                .Range("I" & Rows.Count).End(xlUp).Offset(1).Row
            .EntireRow.Copy Worksheets("Sheet2").Cells(n, 1)
            .EntireRow.Delete
        End If
    End With

err:

    Application.EnableEvents = True
End Sub


 一応確認です。

 現状、 
 並べ替え後のTargetの値が「済」だった場合に、
 Target行をSheet2のデータ下端に追記して、元を消す。

 という指示に見えるのですが、
 まず以って、やって欲しい処理としてはそれでOKですか?

 並べ替え後のTargetの値を評価するのって、
 あんまり聞かないなぁと思いまして。

 もし、
 「済」と入力した場合に・・・
 という目的だったのであれば、
 並べ替え処理は
 >済”で指定しているコード
 の後に行われるべきだと思いますが・・・

 (白茶)


 現状、 
 並べ替え後のTargetの値が「済」だった場合に、
 Target行をSheet2のデータ下端に追記して、元を消す。

その通りです。


 >その通りです。
 って書いてありますけど。。。

 単純に
  D列に入力されたら並べ替えをする
  I列に「済」が入力されたらSheet2へ移動
 と言う二つのコードじゃないでしょうか?

 並べ替えのコードは「Target.Column = 4」の時しか動きませんし
 Sheet2へコピーするコードは「.Column <> 9」でない時しか動かないですよね。

 (HANA)


はい、D列に文字を打ち込むと50音順に並び替え、
I列に済が入るとSheet2へ移動です。

そして、今回、D列を打った時にA列に自動的に打った日付を表示で書き込ませていただきました。

ですが、50音順の並び替えと、日付は大丈夫だったのですが、済を入力してもSheet2に移動しなくなってしまいました。

分かりにくくて申し訳ありません。


 >分かりにくくて申し訳ありません。
 と言うか
 >その通りです。 
 じゃないでしょ!!
 って事です。

 どうなった時にどうなれば良いのか
 整理が付かない内は、コードは作れないと思いますよ。

 コードを作るための日本語での説明を
 書いてみられてはどうでしょう。

 白茶さんが書いて居られる
     '複数セルを同時に書き換えた場合は処理せず終わる
     'D列のセル以外を書き換えた場合は処理せず終わる
     '値のクリアだった場合は処理せず終わる
     'ターゲットと同行のA列のセルにシステム日付を入力(目的の処理)
 の様な説明です。

 例えばソートの所は
    入力した列番号が 4 で、行番号が 6以上の時
      6行目から最後の行までを選択して
      D6セルの列で並べ替え
      入力した位置のセルを選択
 と言うコードに成っています。

 最初の段階で、D列のセル以外を書き換えた場合は処理せず終わって仕舞ったら
 その後ろに続くI列に「済」が入力されたら。。。
 の処理がされないのは当然ですよね。

 まぁ、そうこうしている内に 何方かが答えを書いてくれるかもしれませんが。

 (HANA)

 先にも申し上げましたが、
 (目的の処理)に到達しないのであれば、余計なエラー回避は外して下さい。

 If <条件> Then Exit Sub

 は、「Exit Sub」な訳ですから、
 複数個所のTargetを想定している場合のエラー回避は、
 想定している全てのTargetに対するエラー回避じゃないと、目的の処理に到達しません。

 If <条件1> Then
     処理1
 ElseIf <条件2> Then
     処理2
 End If

 みたいな分岐にした方が良いかもしれませんね。

 (白茶)


何度も回答有難う御座います。

最近やっとマクロというものを使い始めたばかりなので、勉強不足でした。
全く基礎が入っていないので、教えて欲しいばかりになってしまい申し訳ありません。

もう少し基礎を勉強してみます。

白茶様、HANA様有難う御座います。


 >教えて欲しいばかりになってしまい
 そうですか?
 私は
 >色々触ってみたのですが
 は本当だと思っていますが。。。

 でも、何の展望も無い状態で、めくらめっぽうさわってみても
 良い結果が生まれる可能性も低いと思います。

 どうせみんな、真似したり エクセルに怒られたり
 強制終了させる羽目に成ったりしながら
 コードが書けるように成っていって居ると思います。

 A列に日付を入れるのは
 >>入力した列番号が 4 で、行番号が 6以上の時
 の時で良いんじゃないかと思いますが、どうでしょう?

 ソート後だと、どの行に入力したのか分からなくなりますから
 ソート前に入れる様にするのが良いでしょうけど。

 セルに値を書き込むと「Worksheet_Change」になって
 マクロ内で又マクロが動いてしまうので
 「Application.EnableEvents = False」
 を入れておくのが良いとは思います。

 白茶さんが
 >みたいな分岐にした方が良いかもしれませんね。
 と書いて居られるように、I列に付いても同じように
 IF ・・・・ で統一しておかれるのが良いかもしれません。

 これらの処理に共通で考えなくても良い場面
 (すぐにExitSubして良い条件)も有ると思いますので
 もう一度そのあたりを整理して
 コードを作成されるのが良いと思います。

 (HANA)


HANA様

回答有難う御座います。

焦りすぎてあっちこっち触って余計に分からなくなっての悪循環だったので、
アドバイスして頂いた事を一度、ゆっくり理解しながら解決して行こうと思います。

色々教えてくださって有難う御座います。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.