• ベストアンサー

エクセルのVBA。時間を自動で表示させたい

こんにちは。 よろしくお願い致します。 在庫数が0になった時間をK列に表示したいのですが、うまく出来ません。 H列、I列、J列、K列を使います。 H列は自分で数字を入力しています。 I列はCOUNTIFで他のシートから数字を持ってきています。 J列には「H-I」の数式が入っています。 そしてK列にJ列の数字が0になった時の時間を表示したいです。 どうぞよろしくお願い致します。

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

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

No.1・3です。 >シート3のH列が朝在庫数で、 >I列が販売数、ここにcountifが入っていて、シート1のAE列の名称を数えています。 >J列が現在残っている在庫です。 >K列に販売終了時間を入れたいです というコトは前回のコードはSheet3のシートモジュールにしなければなりませんが、 そのようになっているのでしょうか? その上でそのような状態になるのであれば、別の方法を考えなければなりませんね。 前回のコードは再計算されるたびにマクロが走ってしまいます。 それが原因かもしれません。 別マクロで前回のコードを記載してみてはどうでしょう? もちろん「再計算」されるたびにマクロが実行されるのではなく、コマンドボタン等でご自身でマクロを実行させます。 もう一つ気になるのがCOUNTIF関数の「検索条件」がコマンドボタンをクリックするたびに変わるのでしょうか? もしそうであれば、一旦K列データを消去する必要があるように思うのですが・・・ お手元のSheetの動きがこちらでは判断できませんので、 とりあえずはこの程度で・・・m(_ _)m

katuaki123
質問者

お礼

こんばんは。 なんとか出来ました!!(^^) 何度も質問してしまい、申し訳ございませんでした。 この度は大変助かりました! ありがとうございました。

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

その他の回答 (4)

回答No.5

【回答No.1でほぼ解決】 横から失礼!介入した理由は、それはtom04氏の最初の回答がスーパー正解だと思うからです。 <私のテストでは問題なし!> tom04氏の最初の回答の考え方とコードとをそのまんまコピペしてテスト。すると、全く問題なく動きましたよ。 Private Sub Worksheet_Change(ByVal Target As Range)   With Cells(Target.Row, "K")     If (Cells(Target.Row, "J") = 0) Then       If .Font.Color = RGB(0, 0, 0) Then         .Value = Now()         .NumberFormatLocal = "hh:mm"         .Font.Color = RGB(1, 1, 1)       End If     Else       If Len(.Value & "") > 0 Then         .Value = ""         .Font.Color = RGB(0, 0, 0)       End If     End If   End With End Sub <J列が新たに’0’になったのを知る手がかり=文字色>  これには、時刻の表示色を利用します。 J=0 AND 文字色=RGB(1, 1, 1)・・・表示更新不要 J=0 AND 文字色=RGB(0, 0, 0)・・・Now()を表示 J<>0の時は、時刻が表示されている場合に限って表示を消して文字色を初期化します。 これで、必要最低限のExcelとのアクセスで目的を達成できると思いますよ。

katuaki123
質問者

お礼

こんばんは。 物分りが悪くて申し訳ございません。 先ほど、なんとか出来ました! どうもありがとうございました! また何かございましたら、よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 >列の残りが0になったときに判断できませんか? おそらくそんな感じがしていたのですが・・・ Changeイベントでは数式によって表示されているセルの変化には対応できませんので 別方法です。 今回もシートモジュールにしてください。 K列のセルの表示形式は「時刻」にしておいてください。 尚、データは2行目以降にあるとします。 Private Sub Worksheet_Calculate() Dim i As Long Application.ScreenUpdating = False For i = 2 To Cells(Rows.Count, "H").End(xlUp).Row If Cells(i, "J") = 0 Then If Cells(i, "K") = "" Then Cells(i, "K") = Now() End If Else Cells(i, "K").ClearContents End If Next i Application.ScreenUpdating = True End Sub ※ すでに時刻が入っているセルには手を付けず、J列が「0」でK列が空白のセルのみに「時刻」を表示するようにしています。 (反対にK列に時刻が入っていてもJ列が「0」でない場合はK列データを消去しています) ※ I列の「COUNTIF関数」がどこのセルを対照としているのか判らないので H列の2行目~最終行までループさせています。 データ量が多い場合は若干の時間を要してしまいます。 本来であればCOUNTIF関数の対照セルのChangeイベントにして その行だけの操作にした方が良いのですが、 とりあえずはこの程度で・・・m(_ _)m

katuaki123
質問者

補足

早速ありがとうございます! エクセルに入れてみたんですが、処理でフリーズしてしまいました。 何か別の方法はございませんでしょうか? 何度も質問してしまい大変申し訳ございません。 シート1にコマンドボタンが多数あり、これを押すとシート1のAE列にその押したコマンドボタンの名称が入るようになってます。 シート3のH列が朝在庫数で、      I列が販売数、ここにcountifが入っていて、シート1のAE列の名称を数えています。      J列が現在残っている在庫です。      K列に販売終了時間を入れたいです。 なにか良い方法をご教授願います。 よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

色んなやり方があるでしょう。 例えば、[J列監視プロシージャ]に任せるとか・・・。 一定の間隔で対象のJ列を定期的に見回りして<0ならばK列に時間を書きこむ>。 「一定の間隔=30秒」でも別に運用上は問題ないと思います。 もちろん、[J列監視プロシージャ]は常駐ですから、その分、重たくなります。 しかし、大したことはないです。 「一定の間隔=0.01秒」で、入力に応じて図柄を表示。 なんて[常駐プロシージャ]を作りましたが、問題はなかったです。 この利点は、一つ作れば、まあ、色んなケースで応用できること。 それと、面白いというのが一番ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 色々やり方はあると思いますが、 >H列は自分で数字を入力しています。 とありますので、H列にデータ入力した時点で判断しています。 シートモジュールです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long If Target.Column = 8 And Target.Count = 1 Then If Cells(Target.Row, "J") = 0 Then With Cells(Target.Row, "K") .Value = Now() .NumberFormatLocal = "h:mm" End With End If End If End Sub こんなんではどうでしょうか?m(_ _)m

katuaki123
質問者

補足

どうもありがとうございます! H列は販売前に打ってからいじることがないので、J列の残りが0になったときに判断できませんか?

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

関連するQ&A

  • エクセルのCOUNTIFについての質問です

    エクセルに関して質問です COUNTIFがうまく使えず困っているので助けてほしいです。 下記のような表を作成し、別シートでカウント結果を反映させたいのですがうまくいきません    A   B   C  1 11:00 13:00 2:00  2 10:00 15:00 5:00  3 12:00 14:00 2:00 A・B列には数値を、C列には(B列-A列)の数式を入力し書式設定h:mmで表記されるようにしてあります。 別シートでC列の2:00の数をCOUNTIFで数えたのですが帰ってくる数字が明らかに少なく計算が合いません。 このような場合どのように対処すればちゃんとカウントされるのでしょうか? ご回答宜しくお願い致します。

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • エクセル関数の自動表示について

    自動表示についてご質問いたします。 シート1 (3月入力時)       A列  B列  C列  D列  E列  F列  G列  H列 1行目  1月   2  10  11  12  30  31  33 2行目  2月   1   2   5   8   9  10  48 3行目  3月   3   5  10  11  30  31  32 4行目  4月   こういうシート1の表があったとします。 シート1で3月入力した時点で、シート2では以下の表があったとします。        A列  B列  C列  D列  E列  F列  G列   1行目    3   5  10  11  30  31  32 と、自動で表示され。 4月(シート1)に数値を入力すれば、シート2の数値が最新数値に自動で入れ替わる・・・と、いう関数を作りたいのですが、いい関数ありますでしょうか? この場合、シート1ではB列~H列の数字の個数は固定(今回は7個)であり、毎回ランダムで数字が入力されていきます。 これをシート2の1行目、A列~G列に最新数値を毎回反映させて、表示したいのです。 どなたか、ご存知の方よろしくお願いします^^;

  • エクセル vba アウトルックで自動メール送信

    vba勉強中です。 初心者のため質問の仕方に不備ありましたらご了承ください。 在庫管理をエクセルで行っています。 使用した日に使用数を入力し当月在庫を管理しているシートがあります。 I列の当月在庫がH列の管理値を下回ったらアウトルックで自動メール送信を考えています。 在庫管理したい品目は40個ほどあります(添付しているファイルは5個としています。) こちらのサイト(https://fastclassinfo.com/entry/vba_outlook_sendmail/)を参考にしていますが、管理値を下回ったらという部分が勉強不足で作成できません。 お手数をおかけしますがお分かりになられる方、よろしくお願い致します

  • エクセルのVBAでシートを追加更新していきたいのですがうまくいきません

    エクセルのVBAでシートを追加更新していきたいのですがうまくいきません…。 すみません、どなたかぜひ教えてください。 エクセルはそこそこ使えますが、マクロ関係はまったくの初心者です。 excel2003で作業しています。 やりたいのは、実行することによって (1)同一ブックの中に同じ形式のシートを追加する。 (シート名は「0」「1」「2」…というように、ただの数字にしています) (2)セル「K4」の数式 「=I4+'( 1 )'!K4」を 「=I4+'( 2 )'!K4」 というように、どのシートでも、直前のシートのセル「K4」の数値と更新したシートのセル「I4」の数値の合計を「K4」に表示する。 (以下、「I5」「K5」、「I6」「K6」…も同様にしていきます) ようにしたいのです。 (2)のために、 Range("k4").Value = "=I4+'(" & Range("j1").Value - 1 & ")'!K4" (「J1」には、「新しいシート名(数字)と同じ数字」が入るようにしてあります) としましたが、 「 =I4+'(1)'!K4 」としたいのに、 「 =I4+'[1](1)'!K4 」 と表示され、うまくいきません。 また、実行するたびに、 「値の更新」ということで、ファイルを指定するよう指示が出ます。キャンセルすると「#REF!」になります。 何が原因なのか、どうすればいいのかがさっぱり分かりません。 身の程知らずなレベルに挑戦しているのかもしれませんが、どなたか助けていただければ幸いです。 よろしくお願いします! (よく分かっていないため、質問の仕方が適当でなかったらすみません…)

  • エクセル関数で列を挿入し同時に数式の列もずらしたい

    数式で =IF(COUNTIF(E1:H1,1)=0,1,IF(MATCH(1,E1:H1,1)=1,1,"")) をJ1に設定してます。 その後 J列に列挿入すると K1に=IF(COUNTIF(E1:H1,1)=0,1,IF(MATCH(1,E1:H1,1)=1,1,"")) がコピーされますが (E1:H1)を列挿入することで(F1:I1)にすることは可能でしょうか 列を増やすことが多々あるため挿入する列数の応じた ずれ方をしていきたいです。 何分に勉強不足のためご教授よろしくお願いします。

  • エクセルの関数について

    エクセルの関数について お世話になります。 エクセルの関数について質問をさせて頂きます。 チェック用の数式として、下記のような場合、 D2とH行に同じ数字があった場合はA2に○を この場合、 =IF(ISNA(MATCH(D2,H:H,0)),"","○") このような数式を使っております。 この数式を少しアレンジして、 D2とH行に同じ数字があった場合はA2に○を、 D2とI行に同じ数字があった場合はA2に×を、 このような数式を作りたいと考えております。 また、 I2とD列に同じ数字があった場合、J2に空白、 同じ数字が無かった場合に×が入る数式として、 [J2]=IF(ISNA(MATCH(I2,D:D,0)),"×","") このようなものを使っています。 こちらも少しアレンジをして、 I2もしくはH2とD列に同じ数字があった場合、J2に空白、 同じ数字が無かった場合に×が入る。 このような数式を作りたいと考えております。 こちらの2点、中々良い数式ができずに悩んでおります。 どなたか、エクセルの関数に詳しい方、良いアドバイスを 頂けると嬉しいです。 どうぞよろしくお願い致します。

  • エクセルでの時間表示

    エクセルで労働時間を管理したいと考えております。 1ヶ月の労働時間が168時間だったので、セルに168:00と入力すると168:00:00と表示されています。 しかし、数式バーを見ると1900/1/7 0:00:00と表示されています。 セルの書式設定は[h]:mm:ssです。 上記内容の数字で計算に使っても差し支えないのでしょうか。 自分としては数式バーのところも168:00と表示されて欲しい気がします。 計算例:時給を掛けて賃金を算出。工程の割合により労働時間を案分など よろしくお願い致します。

  • エクセル2007 ハイパーリンクについて

    シート名は4月だとした時   A   B    C      D  E F G H I J K L M 6  1  田中  港区    1000 7  2  佐藤  品川区   2000 8  3  高橋  江戸川区  3000 9  4  井上  荒川区   4000 10  5  山田  練馬区 と行も列も沢山ある表とします A列には1~順番に数字が入ってますので検索の基準にしたい。 表が大きいので A列を基準としてvlookup関数で検索しジャンプする式を作成したいのですが うまく出来ません 検索する数字をH2にいれた時H3をクリックするとその行に飛ぶ関数を教えて下さい。 =hyperlink(vlookup,h2,a1:a8000,2,false) と入力してもエラーになります。 確かに右クリックでハイパーリンク作成でA1とした場合(book1-sheet1!A1)と 直接入力 =hyperlink("sheet1!A1) では表示される数式が違います 上記数式では駄目と分かりますがどうすればよいのか私の知識では無理です どなたか教えて下さい

  • エクセルの表示関数について

    Sheet1のB11の数字がSheet2のJ11~J500の間に同じ数字が有った場合はSheet2のK11~K500に入っている数字をSheet1のK11に表示させたいのですがどのようにしたらいいですか? しかもJ11~J500の間に複数回Sheet1のB11の数字が出てくる場合もありこの場合は合計金額を表示したいのです。複雑ですが出来ますか? 宜しくお願い致します。