作業シートを作成中です。次のコードで作業しています。ご指導頂いたコードなので感謝しています。
添付のシートのG35:G39の列に数字が入らない場合にG40=G34(G40=G34-(SUM(G35:G39))
となるが、M40の表示が変らない。(なお、G35:G39セルのどこか1セルに数字を入れた場合は表示が変ります。)
G35:G39セルに空欄のまま何も入れなくて、G40セルの数字の大小により表示される様にしたい。
添付画像のG40セルが2000なのでM40セルは「0」表示なのですが、「セルに指定数字を入力」が表示されたままで変りません。ご指導よろしくお願いします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim g As Long
If Intersect(Target, Range("G35:G39")) Is Nothing Then Exit Sub
If Target(1).Value < 10000 Or Not IsNumeric(Target.Value) Then
'MsgBox ("M" & Target.Row & "セルに 「0」を入力")
Target.Offset(, 4).Value = 0
Target.Offset(, 4).Select
Else
'MsgBox ("M" & Target.Row & " セルに指定数字を入力")
Target.Offset(, 4).Value = "このセルに指定数字を入力"
Target.Offset(, 4).Select
End If
g = Range("G34").Value - Application.Sum(Range("G35:G39"))
If g < 10000 Then '未満の場合、以下ならg<=10000
'MsgBox("M40" & Target.Row & "セルに「0」を入力")
Range("M40").Value = 0
Target.Offset(, 4).Select
Else
'MsgBox("M40" & Target.Row & "セルに指定数字を入力")
Range("M40").Value = "このセルに指定数字を入力"
Target.Offset(, 4).Select
End If
No.6ベストアンサー
- 回答日時:
#5お礼について
#3のご希望と一致しません。
今一度、精査してなさりたい事を纏めて頂けると良いと思います。
不一致箇所
①当初G40セルはG34に合計値を手入力後、同数値を表示します。
①はどのような事を指すのでしょう?
>差引合計値セルはM40ではなくG40なのでG40に修正させて頂きました。
②G35~G39に数値を手入力するとその合計値をG34セル値から引いた数値がM40に表示されます。
>M40に10000以上の場合「このセルに指定数字を入力」と未満の場合に「0」の表示されませんでした。
そのような要件は、#3の補足にはありません。なので、当初あったものを削除いたしました。
#3で 使用要件、実行条件(付けたしで増えている仕様)を精査した方が良いと思います。
に対しての①②②③と理解したのですが、そうではなかったと言う事でしょうか、それとも打ち間違い?
いずれにしても、良いのですが、、
>、M40に10000以上の場合「このセルに指定数字を入力」と未満の場合に「0」の表示されませんでした。
と言う事は、②G35~G39に数値を手入力するとその合計値をG34セル値から引いた数値がM40に表示されます。は、実現できませんが
良いと言う事でしょうか?(M40に表示されるのは、このセルに 指定数字を入力 または 0 です。 引いた数値は表示されません。
良いと言う事であれば、Range("G40").Value = Range("G34") - Application.Sum(myRng) を
if Range("G34") - Application.Sum(myRng) >= 10000 then
Range("G40").Value = "このセルに指定数字を入力"
else
Range("G40").Value =0
end if
とすればよいでしょう。が、、#3と#5を組み合わせて、、
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Set myRng = Range("G35:G39")
If Intersect(Target, Range("G34", myRng)) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Target.Address(0, 0) = "G34" Then
Range("G40").Value = Range("G34") - Application.Sum(myRng)
Call Val_Offset(Range("G40"), myRng)
GoTo Ext
End If
On Error GoTo DelEr
Call Val_Offset(Target, myRng)
Range("G40").Value = Range("G34") - Application.Sum(myRng)
Call Val_Offset(Range("G40"), myRng)
If Target(1).Value = "" Then Target.Offset(, 4) = ""
Ext:
Application.EnableEvents = True
Exit Sub
DelEr:
If Range("G40") = "" Then
Range("G39,M39") = ""
Range("G39:I39").Merge
Range("G40:I40").Merge
Range("G40:I40").Borders.LineStyle = True
Range("G40").Value = Range("G34") - Application.Sum(myRng)
End If
GoTo Ext
End Sub
Sub Val_Offset(Target As Range, myRng As Range)
With Target
If .Value < 10000 Or Not IsNumeric(.Value) Then
.Offset(, 4).Value = 0
Else
.Offset(, 4).Value = "このセルに指定数字を入力"
If Target.Address(0, 0) <> "G40" Then .Offset(, 4).Select
End If
End With
End Sub
夜遅くまでご教授いただき申し訳御座いませんでした。
コードを試行しました。完璧に作動し満足のいく作業シートが完成しました。
私の相談に当初からご教授いただき感謝しています。有り難う御座いました。
No.5
- 回答日時:
#3です。
考えすぎてしまったか、、悪い癖です。
理解していたのとだいぶ違うので、書き直しました。
①当初G40セルはG34に合計値を手入力後、同数値を表示します。
②M40はG35:G39が空欄でも実行します。
②G35~G39に数値を手入力するとその合計値をG34セル値から引いた数値がM40に表示されます。
(G35~G39の数値により、M40の数値は変化します。)
③定数の10000は変更しません。 私の説明が不十分ですみません。よろしくお願いします。
以前あった削除に対してのコードを一応、足しました。(上に詰める場合のみ対応)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Set myRng = Range("G35:G39")
If Intersect(Target, Range("G34", myRng)) Is Nothing Then Exit Sub
Application.EnableEvents = False
Range("G40").Value = Range("G34")
If Target(1).Value = "" Then
Target.Offset(, 4) = ""
GoTo Ext
End If
If Target.Address(0, 0) <> "G34" Then
With Target
On Error GoTo DelEr
If .Value < 10000 Or Not IsNumeric(.Value) Then
.Offset(, 4).Value = 0
Else
.Offset(, 4).Value = "このセルに指定数字を入力"
If Not Intersect(Target, myRng) Is Nothing Then .Offset(, 4).Select
End If
End With
Else
End If
Ext:
Range("M40").Value = Range("G34") - Application.Sum(myRng)
Application.EnableEvents = True
Exit Sub
DelEr:
If Range("G40") = Range("G39") Then
Range("G39") = ""
Range("M39") = ""
Range("G39:I39").Merge
Range("G40:I40").Merge
End If
GoTo Ext
End Sub
いつも有り難う御座います。コードを試行しました。M40に「0」表示しましたので、差引合計値セルはM40ではなくG40なのでG40に修正させて頂きました。→Range("G40").Value = Range("G34") - Application.Sum(myRng)にして試行した結果、M40に10000以上の場合「このセルに指定数字を入力」と未満の場合に「0」の表示されませんでした。ご教授よろしくお願いします。
No.4
- 回答日時:
No.2です。
>G40の数値が変化(基準10000以上、未満で表示が変る。)してもM40セルの表示が変りませんでした。
G40が変化した時とは具体的にどこのセルを弄ったのでしょうか?
或いは別のシートを参照して数式でG34が変化した時ではないですよね?
有り難う御座います。②G34は手入力でその日のデータを合計した数値で、G35~G39セルにG34の範囲にで数値を入力し、①その合計値をG34から差引した数値がG40で変化し、10000を超えた場合と未満に判定した結果がM40に表示される様にしたい。 よろしくお願いします。
No.3
- 回答日時:
こんにちは、
横から失礼します
>G35:G39セルに空欄のまま何も入れなくて、G40セルの数字の大小により表示される様にしたい。
G40セルはどのような操作で数値が変わるのですか?
G34を変更した時であれば、実行トリガーを増やし、対応した処理を追加すれば対応できると思いますが、
使用要件、実行条件(付けたしで増えている仕様)を精査した方が良いと思います。
例えば、G40は合計なのでしないと思いますが、添付図のようにG35:G39が空白でも実行するのか?とか、、
定数 10000 は変更するようにするとか、、、
課題が出てきそうですが、、、取敢えず。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Set myRng = Range("G35:G39")
If Intersect(Target, Range("G34", myRng)) Is Nothing Then GoTo Ext ' 追加変更
Application.EnableEvents = False
If Target(1).Value <> "" Then
If Target.Address(0, 0) <> "G34" Then ' 追加
With Target
On Error GoTo Ext
Call Val_Offset(Target, myRng)
End With
Range("G40").Value = Range("G34") - Application.Sum(myRng)
With Range("G40")
If Application.CountIf(myRng, "<>") = myRng.Cells.Count Then
Call Val_Offset(Target, myRng)
If Application.CountIf(myRng.Offset(, 6), "このセルに指定数字を入力") _
+ Application.CountIfs(myRng.Offset(, 6), "", myRng, "") = 0 _
Then
.Offset(, 4).Select
End If
End If
End With
Else ' 以下追加
Range("G40").Value = Range("G34") - Application.Sum(myRng)
' Range("G40").Formula = "=G34-SUM(G35:G39)"
Call Val_Offset(Range("G40"), myRng)
End If ' If Target.Ad. 対応
End If 'If Target(1)..... 対応
If Target(1).Value = "" Then Target.Offset(, 4) = ""
Ext:
Application.EnableEvents = True
End Sub
Sub Val_Offset(Target As Range, myRng As Range)
With Target
If .Value < 10000 Or Not IsNumeric(.Value) Then
.Offset(, 4).Value = 0
Else
.Offset(, 4).Value = "このセルに指定数字を入力"
If Not Intersect(Target, myRng) Is Nothing Then .Offset(, 4).Select
End If
End With
End Sub
こんな使い方かなと、Select条件を増やしてみました。。
同様な処理が複数出るので纏めました。
Worksheet_Changeなので、Application.EnableEvents = Falseを追加しました。
もし試されてデバッグし途中で終了した場合、Falseのままなので
Sub RESET_EnableEvents()
Application.EnableEvents = True
End Sub
を実行してください。
判り難くなってしまったら、ごめんなさい。
有り難う御座います。ご指導頂いた次のコードを試行しました。
当初全て空欄の時、G34に数値を入れるとG40に正しく数値を判別した表示がでます。その後、品目ごと(G35~G39セル)に数値を入れて行くと最後のM40セルの数値が10000未満になってもM40の表示が変りませんでした。またG列の数値を消して空欄にし数値がG34=G40なってもM40の表示が変りません。
①当初G40セルはG34に合計値を手入力後、同数値を表示します。
②M40はG35:G39が空欄でも実行します。
②G35~G39に数値を手入力するとその合計値をG34セル値から引いた数値がM40に表示されます。
(G35~G39の数値により、M40の数値は変化します。)
③定数の10000は変更しません。 私の説明が不十分ですみません。よろしくお願いします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Set myRng = Range("G35:G39")
If Intersect(Target, Range("G34", myRng)) Is Nothing Then GoTo Ext ' 追加変更
Application.EnableEvents = False
If Target(1).Value <> "" Then
If Target.Address(0, 0) <> "G34" Then ' 追加
With Target
On Error GoTo Ext
Call Val_Offset(Target, myRng)
※ (途中 省略しています。)
End With
End Sub
Sub RESET_EnableEvents()
Applicaition.EnableEvents
End Sub
No.2
- 回答日時:
No.1です。
ちょっと違ったかな?
>If Intersect(Target, Range("G35:G39")) Is Nothing Then Target.Offset(, 4).Select
最後のこれは
If Intersect(Target, Range("G35:G39")) Is Nothing Then End Sub
かな?
有り難う御座います。頂いたコードを試行しました。G40の数値が変化(基準10000以上、未満で表示が変る。)してもM40セルの表示が変りませんでした。教えて下さい。
No.1
- 回答日時:
>g = Range("G34").Value - Application.Sum(Range("G35:G39"))
g = Range("G40").Value
でも良いと後から感じましたが 、今回の質問の場合セル範囲:G35~G39 の値変更がイベント発生のトリガーになってますので
それ以外でのセル値変更ででもとしたいとなると、
Private Sub Worksheet_Change(ByVal Target As Range)
Dim g As Long
If Not Intersect(Target, Range("G35:G39")) Is Nothing Then
If Target(1).Value < 10000 Or Not IsNumeric(Target.Value) Then
'MsgBox ("M" & Target.Row & "セルに 「0」を入力")
Target.Offset(, 4).Value = 0
Target.Offset(, 4).Select
Else
'MsgBox ("M" & Target.Row & " セルに指定数字を入力")
Target.Offset(, 4).Value = "このセルに指定数字を入力"
Target.Offset(, 4).Select
End If
End If
g = Range("G40").Value
If g < 10000 Then '未満の場合、以下ならg<=10000
'MsgBox("M40" & Target.Row & "セルに「0」を入力")
Range("M40").Value = 0
Else
'MsgBox("M40" & Target.Row & "セルに指定数字を入力")
Range("M40").Value = "このセルに指定数字を入力"
End If
If Intersect(Target, Range("G35:G39")) Is Nothing Then Target.Offset(, 4).Select
になるのかも。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルテキストボックスの文...
-
Excelについて
-
EXCELマクロ 保護されているシ...
-
VBAで、貼り付け禁止命令を実現...
-
ダブルクリックすると現在の時...
-
ハイパーリンクされているファ...
-
データが入力されている隣のセ...
-
Windowsで動くVBAがmacOSで動か...
-
Excelのセル内にある図形を削除...
-
Excelのアクティブなセル情報
-
エクセルVBA(実行時エラー438...
-
VBA セルに合わせて移動するが...
-
セル色を5秒間隔で変える
-
エクセルのVBAでダブルクリック...
-
Jtableの特定のセルの背景色や...
-
GrapeCityのSpreadの複数セルの...
-
Excel VBA セルを指定個数ラン...
-
メッセージを1度だけ表示したい。
-
VBAで丸をつけたいです。
-
Excel VBA ダブルクリックで入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データが入力されている隣のセ...
-
EXCELマクロ 保護されているシ...
-
エクセルテキストボックスの文...
-
VBAで、貼り付け禁止命令を実現...
-
Excelについて
-
メッセージを1度だけ表示したい。
-
ダブルクリックすると現在の時...
-
ハイパーリンクされているファ...
-
エクセルVBA セル選択後にカレ...
-
Jtableの特定のセルの背景色や...
-
VBAで丸をつけたいです。
-
エクセルVBA(実行時エラー438...
-
Excelのセル内にある図形を削除...
-
Swing 編集不可でも選択可能なJ...
-
(VBA)アクティブセルを起点に...
-
Excel VBA セルを指定個数ラン...
-
VBA セルに合わせて移動するが...
-
Windowsで動くVBAがmacOSで動か...
-
セル色を5秒間隔で変える
-
Excel VBA ダブルクリックで入...
おすすめ情報