Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
数式の入ったセルのマクロ
投稿日時: 18/04/12 13:19:15
投稿者: 園 日暮

いつもお世話になります。
 
下記のマクロはA2セルに文字が入るとK2に今日の日付が入るマクロです。
A3 K3など同じようにです。
 
ただA2に何もないときはうまく行くのですが、
A2に数式が入っていているとK2に日付が表示されません。
 
※A2には =名簿作成!B2 です。
 
下記のマクロをどのようにすればうまくできるかご指導をお願いできませんでしょうか。
 
 
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Then Exit Sub
 
    Application.EnableEvents = False
 
    If Target.Value = "" Then
        Target.Offset(0, 10).Value = ""
    Else
        Target.Offset(0, 10).Value = Date
    End If
    Application.EnableEvents = True
 End Sub

回答
投稿日時: 18/04/12 15:36:20
投稿者: めんたん

最初から数式の入っているセルはあらかじめブックを開いたときに日付を入れるのはどうですか?
 
Sub Auto_open()
    Intersect(Sheets("hoge").UsedRange, Sheets("hoge").Columns("A:A")). _
    SpecialCells(xlCellTypeFormulas).Offset(, 10).Value = Date
End Sub

回答
投稿日時: 18/04/12 16:09:30
投稿者: WinArrow
投稿者のウェブサイトに移動

> Private Sub Worksheet_Change(ByVal Target As Range)
このイベントプロシジャは、セルの「値」が変化した時に
起動されるプロシジャです。
 
このプロシジャの先頭に
>If Target.Column <> 1 Then Exit Sub
というコードがあります。
これは、「値」が変化したセルがA列以外はスキップするコードです。
そして数式がはいっているA2には、数式が入っているから、
手操作で「値」を変更することはないですyね?
>=名簿作成!B2
のセルは変わった時に初のだけA2のが変化します。
 
このプロシジャは、どのシートに記述されていますか?
例え、名簿作成というシートに記述されていたとしても、
先頭の行でスキップしてしまいます。
 
「名簿作成!B2」のどのような値がはいっているかわかりませんが、
>If Target.Value = ""
このコードは有効なですか?
 
 

投稿日時: 18/04/12 16:09:58
投稿者: 園 日暮

ご指導をありがとうございます。
データーを入力毎に今日の日付を入れたいのです。

回答
投稿日時: 18/04/12 16:18:25
投稿者: WinArrow
投稿者のウェブサイトに移動

誤字脱字があるので、訂正します。
 
> Private Sub Worksheet_Change(ByVal Target As Range)
このイベントプロシジャは、セルの「値」が変化した時に
実行されるプロシジャです。
  
このプロシジャの先頭に
>If Target.Column <> 1 Then Exit Sub
というコードがあります。
これは、「値」が変化したセルがA列以外はスキップするコードです。
そしてA2には、数式が入っているから、
 手操作で「値」を変更することはないですよね?
>=名簿作成!B2
のセルは変わった時だけA2のが変化します。
  
このプロシジャは、どのシートに記述されていますか?
 例え、名簿作成というシートに記述されていたとしても、
 先頭の行で、B2セルが変化してもスキップしてしまいますから、
A2が変わったことにはなりません。・・・・つまり、あなたが意図して通りには 実行されません。
 
A2が変わったということは
=名簿作成!B2
が変わったということです。
ですから、名簿作成!B2が変わったかを判断する方がよいのでは?
 
名簿作成!B2にも数式が入っているのかしら?
 
 
「名簿作成!B2」のどのような値がはいっているかわかりませんが、
>If Target.Value = ""
このコードは有効なですか?
 
 

投稿日時: 18/04/12 16:31:34
投稿者: 園 日暮

ありがとうございます。
 
私が言うA2とは、
 
シート名は 「名簿」 です。
 
このA2に入っている数式は 「=名簿作成!B2」ですが
 
=IF(E2="","",INDEX(表!A:A,MAX(INDEX((表!$A$2:$F$16=C2)*ROW($A$2:$F$16),)))&INDEX(表!$1:$1,
MAX(INDEX((表!$A$2:$F$16=C2)*COLUMN($A$2:$F$16),)))&TEXT(COUNTIF($C$2:C2,C2),"-000"))
 
上の数式でIDを作成
あ か さ た   04
か き く け こ 01
一番最初なので 001
 
故に
高橋さんの IDは 0401-001 となるものです。
 
「=名簿作成!C2」 は UserFormt より入力です。
例 高橋 和美 の場合 タ と入れたものです
 
 
 
 
 
 
 
 

回答
投稿日時: 18/04/12 16:56:50
投稿者: WinArrow
投稿者のウェブサイトに移動

↑の説明は理解できません。
 
>データーを入力毎に今日の日付を入れたいのです。
 
データーを入力しているのは、どのシートなんですか?
また、数式ではなく、手入力しているセルの列は、なんですか?
 
 

回答
投稿日時: 18/04/12 17:03:51
投稿者: WinArrow
投稿者のウェブサイトに移動

再掲
WorkSheet_Changeイベントでの
Targetセルは、数式によって「値」が変化しても
イベントが発生しないことがあります。
Targetは、手入力しているセル、又は、入力規則等のセルを対象にしましょう。

回答
投稿日時: 18/04/12 17:49:55
投稿者: めんたん

シートモジュールを2つ用意したらいいのでしょう?
 
シートA用が最初に書かれている
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Then Exit Sub
中略
 
End Sub
 
で、シート"名簿作成"用が
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0,0) = "B2" Then
 
中略
 
End Sub
 
でいいのでは?

投稿日時: 18/04/12 19:10:20
投稿者: 園 日暮

お騒がせしました。
 
入力規則 数式の入ってない空白 というアドバイスがヒントに
Q列を追加して入力規則にしました。
 
 
下記で解決しました。
 
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column <> 17 Then Exit Sub
 Application.EnableEvents = False
 Target.Offset(0, 1).Value = Now
 Application.EnableEvents = True
 End Sub
 
 
色々とお手数かけ申し訳ありませんでした。
ありがとうございました。
ヒントが解決の糸口でした。