【お題】NEW演歌

このVBAをEXCEL起動=実行ではなく、セルの値が変わったら累計も変更と、前日までの累計しかでないのを当日か31シート分表示できるようにしたいです。
Private Sub Workbook_Open()
Dim k As Long
With Worksheets(1) '「1」Sheetのみの操作
.Range("R58") = .Range("R58")
.Range("R73") = .Range("R73")
End With
For k = 2 To Day(Date) - 1
With Worksheets(k)
.Range("R58") = Worksheets(k - 1).Range("R58") + .Range("I58")
.Range("R73") = Worksheets(k - 1).Range("R73") + .Range("I73")
End With
Next k
End Sub

A 回答 (2件)

```


Private Sub Worksheet_Change(ByVal Target As Range)
Dim k As Long
Dim date As Date

date = Date

If Target.Column = 58 Then
For k = 2 To Day(date) - 1
With Worksheets(k)
.Range("R58") = Worksheets(k - 1).Range("R58") + .Range("I58")
End With
Next k
ElseIf Target.Column = 73 Then
For k = 2 To Day(date) - 1
With Worksheets(k)
.Range("R73") = Worksheets(k - 1).Range("R73") + .Range("I73")
End With
Next k
End If
End Sub
```

このコードを実行すると、セルの値が変わった時点で、前日までの累計が更新されます。また、当日か31シート分表示されるようになります。
    • good
    • 0
この回答へのお礼

プロサージャが無効ですとなってしまいます。

お礼日時:2023/07/06 11:57

こんにちは



コードしかご提示が無いので、処理の実質的な意味がわかりませんけれど・・

>起動=実行ではなく、セルの値が変わったら累計も変更と、
処理のタイミングを「セルの値が変わったら」にしたければ、ThisWorkbookモジュールに
 Workbook_SheetChange
イベントとして記述しておけば、そのタイミングで実行されるようになります。

ただし、処理の中で値の書き換えを行っているので、この処理が原因でChangeイベントが発生してしまいますので、処理中はイベントの発生を停止しておく必要がありそうです。
https://learn.microsoft.com/ja-jp/office/vba/api …

また、シートのどこが変わってもイベントは発生しますので、(多分、処理したい起因関係はわかっているのでしょうから)その範囲での変更であることをチェックしておく方が効率が良いです。


>前日までの累計しかでないのを当日か31シート分表示できるようにしたいです。
何がどうなっているのか不明ですけれど、「31シート迄」というのであれば
>For k = 2 To Day(Date) - 1
となっているのを
 For k = 2 To 31
とすれば、処理対象シートは「31」シートまでになります。
当日までなら To Day(Date) ですね。

ただし、セルに記入していますので、元のセルに関数式等が設定されているような場合には、その関数機能は削除されてしまいます。
それでも問題がないようになっているのかどうか、全体の仕組みが不明なので当方ではわかりかねます。
(前日までと言うのは、これを考慮してのことではないかと想像しますけれど・・?)


※ ご提示の処理だけを見る限りでは、「シート間の単純な加算」のように思えますので、対象セルに予めそのような関数式を設定しておけば、VBAなど使う必要もない処理のように思われます。
例えばシート2のR58セルに
 =Sheet1!R58 + I58
の式を設定しておけば、VBAを利用しなくてもエクセルが自動計算してくれます。
(シートの名称が不明なので、上式では「Sheet1!」としてありますが、実態に合わせる必要があります)
    • good
    • 0
この回答へのお礼

>For k = 2 To 31
とすれば、処理対象シートは「31」シートまでになります。
当日までなら To Day(Date) ですね。
でやりたいことができました。ありがとうございます。

お礼日時:2023/07/06 08:20

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


おすすめ情報