プロが教えるわが家の防犯対策術!

よろしくお願いします。いつもgooの皆さんには大変お世話になっています
以下の問題がなかなか解決できずにいます
せっかくの休日ですが、どなたかわかる方おりましたら教えてください

データの範囲はA列の1行から10行とします
(実際は100行近くになります)

ここにサーバーから読み込んだデータが随時更新されます
その値は0か1です

今回は、データ範囲にキーボードから0か1を入力してテストします

式はできるだけセルに書きたいです
式で処理できないことはマクロでやるとして

以下を実現するには、マクロと式はどう書いたら良いでしょうか?
(式だけでできれば一番良いのですが・・・)
どなたか教えてください

1、A列のどこかの行に1が入力されたら隣のB列のセルに on と表示させます
2、A列のどこかの行に0が入力されたら隣のB列のセルに OFF と表示させます
3、A列の空白の行の隣のB列のセルは何も表示しません ""(空白)です
4、A列に1が入力された行が4行あれば、その隣のB列に表示されている on の文字も4行です

このとき、一番最後にA列に1が入力された行だけ、C列に LASTと表示させるには
マクロと式はどう書いたら良いでしょうか?

今回A列にはキー入力しますが、実際はA列はサーバーから常時読み込んで表示するので
マクロはPrivate Sub Worksheet_Calculate()に書くことになるかと思います
エクセルはA列の値によっていろいろな計算をしますので

以上です。よろしくお願いします

質問者からの補足コメント

  • 私の説明がヘタでお手数かけています

    「最後に1が入力された」とは
    「時間的に最後に1が入力された行」のことです

    最初からこのように書けば良かったのですが
    知恵が足りなくて迷惑をかけています
    お許し下さい

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/12/23 16:28
  • 思いつきました
    時間的に最後ということは、入力された同じ行のどこかのセルに、その時間を記録して
    時間的に最後かどうかをfor next などで1行から10行まで回って
    調べればよいのでしょうか?

      補足日時:2015/12/23 16:33
  • 補足させていただきます
    A列には同じ行でも何度もデータを入れます

    仮にキー入力手順1→2→3であれば
    1、A列1行目に1→B列1行目が on表示→C列1行目がLAST表示

    2、A列5行目に1→B列5行目が on表示→C列5行目がLAST表示→C列1行目のLAST表示は消える

    3、A列1行目に1→B列1行目が on表示→C列1行目がLAST表示→C列5行目のLAST表示は消える

      補足日時:2015/12/23 17:27
  • HAPPY

    何度もありがとうございます。私のミスでした。マクロが止まっていたようです
    保存終了後開いてA列に1を入力すると見てびっくり、なんとばっちりです

    時間的に最後のLASTだけ残ります。時間的とは言っても、時間なんか関係ないんですね
    このトリックお見事です。やられました。うれしいような、がっかりしたような
    でもやっぱりうれしいです

    ああ、今までどれだけ苦労したことか。
    今まではフラグを使うことしか頭になくて、
    でも、条件が一致するとそのフラグも変わってしまって
    フラグのフラグが必要かとも思ったりして

    あっぱれ、お見事です
    ああ、こんな簡単な理屈だったんですねえ
    もう9割がた完成しているのであともう少しです
    ありがとうございました。深くお礼申し上げます。きょう質問してよかったです
    助かりました
    ありがとうございました

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/12/23 18:47

A 回答 (5件)

>指示通りにしましたが何も変化がありません


あれま~、どうしてでしょうかね。
一応、コードを説明しておきますね。
1、シート名のタブを右クリック、コードの表示をクリック
それぞれのシートにシートモジュールがあるので、そこに記述します。
標準モジュールではありません。
Private Sub Worksheet_Change(ByVal Target As Range)
↑このシートでセルの値に変更があったら実行するイベント

If Target.Column = 1 Then
↑もし、変更があったセルの列が A列だったら
If Target.Value = 1 Then
↑もし、変更があったせるの値が 1 だったら

Range("C1:C100").Value = ""
Target.Offset(0, 2).Value = "LAST"
↑C列を空白にして、変更があったセルに二つ右を LAST
と云う意味のコードです。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとう

度々ありがとうございます
マクロは私がなにか間違ってるのかと思いますので
まだまだチェックしてみますが
理屈はやっとわかりました

最初に、その都度、全部に””を書き込んで
次に変更があったセルにLASTを書き込むんですね

これはいい方法です
これで私が狙った方法が可能ですね

ここまでずいぶんかかったのですが
以外に簡単な方法でできました

やはり、この辺は発想の問題ですね

マクロが狙った通りにならないのは私のチェックが足りません
結果を後ほど報告します
トータルで今までに1か月はこれをやっていますので解決は近いですね
頑張ります

お礼日時:2015/12/23 18:27

>「最後に1が入力された」とは


>「時間的に最後に1が入力された行」のことです
ご希望の動作になるか不明ですが
1、シート名のタブを右クリック、コードの表示をクリック
2.VBエディターが起動したら

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If Target.Value = 1 Then
Range("C1:C100").Value = ""
Target.Offset(0, 2).Value = "LAST"
End If
End If
End Sub

を張り付けて閉じるで
A列に 1を入力してみてください。
    • good
    • 0
この回答へのお礼

休日の貴重な時間に教えていただきましてありがとうございます
説明がヘタで皆さんに迷惑をかけています

指示通りにしましたが何も変化がありません

お礼日時:2015/12/23 17:19

NO2です。

失礼しました訂正です。
>一番最後にA列に1が入力された行だけ
C1セルは =IF(A1=1,IF(COUNTIF(A$1:A1,1)=COUNTIF(A:A,1),"LAST",""),"")
この回答への補足あり
    • good
    • 0
この回答へのお礼

私の説明がヘタで何度もお手数おかけします

上から順に1を入れてくるとLAST表示されますが
上にもどって、空白の5行目に1を入れてもLAST表示されません

説明がヘタですみません

お礼日時:2015/12/23 16:25

念のため、質問を勘違いしていないかの確認ですが


>1、A列のどこかの行に1が入力されたら隣のB列のセルに on と表示させます
は、以下の様な事でしょうか
 A  B
 1  ON
 0  OFF
 1  ON
 0  OFF
・・・
B1セルに =IF(A1="","",IF(A1=1,"ON","OFF")) 下へコピーです。
C1セルに =IF(COUNTA(A:A)=ROW(),"LAST","") 下へコピーでは如何でしょうか。
    • good
    • 0
この回答へのお礼

休日の貴重な時間に教えていただきましてありがとうございます

>以下の様な事でしょうか
はい、そうです

私の説明がヘタで狙った動きを説明できていません

仮に今、C列10行目がLASTと表示されているとき
A列5行目を0にして、再度1にしたら
または、何も入力されていないA列5行目に1を入力したら
LAST表示は5行目だけであってほしいのですが・・・

説明不足で2度手間をおかけします

お礼日時:2015/12/23 16:10

行数が固定なのでしたら該当行のB列のセルには、、、


=IF(A1=1:"ON":IF(A1=0:"OFF":""))

同じくC列のセルには、、、
=IF(A1=1:"LAST":""))

といった感じの式を書けばよいのではないでしょうか?
上記の式はシートの1行目のB列とC列の物ですが、実物の最初の行にこれと同様の式を書き、あとはこれを下方向にコピーすれば書かれておられる1.~4.の機能は実装終了です。

あれ? そういゆうことではなくて???
    • good
    • 0
この回答へのお礼

ありがとう

休日に親切におしえていただいてありがとうございます
最初エラーになったので:を,にしたら答えがでましたが

私の説明が下手で希望する結果になりません

A列が1のセルは、同じ行のC列はLASTと表示されますが
最後にLASTになった行だけ残して、それ以前にLASTと表示されていた行は
空白にしたいのですが・・・

つまりC列でLASTと表示されるのは1行だけになります

お礼日時:2015/12/23 15:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!