[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAで最終行を取得し、列に値が入ればselect caseで分岐』(ちんぷんかんぷん)
VBAで最終行を取得し、その列のどこかのセルに値が入れば分岐していくっていうのを作りたいと思って試行錯誤しましたがうまくいきません。
どなたかご教授お願い致します。
まず、作ったところまで。。。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim targetA As Range Dim rng As Range Dim MaxRow As Long MaxRow = Sheets("データ").Cells(Rows.Count, 3).End(xlUp).End(xlUp).Row Set targetA = Intersect(Target, Range("C:C")) '変更されたセル(Target)の中のC列の部分(TargetとC列の重複部分のセル)(チェック対象) If targetA Is Nothing Then Exit Sub 'チェック対象がNothingだったら(チェック対象が無かったら)終わり For Each rng In targetA 'チェック対象を順に If rng.Value = "" Then rng.Offset(, -2).ClearContents 'もし注目セルが空白ならセルから2セル(A列)も空白に Next Select Case True Case IsDate(Cells(MaxRow, 3)) = True If Cells(MaxRow, 3).Value >= DateValue("2011/05/21") And Cells(MaxRow, 3) <= DateValue("2012/05/20") Then Cells(MaxRow, 3).Offset(0, -2).Value = "10期" ElseIf Cells(MaxRow, 3).Value >= DateValue("2012/05/21") And Cells(MaxRow, 3) <= DateValue("2013/05/20") Then Cells(MaxRow, 3).Offset(0, -2).Value = "11期" ElseIf Cells(MaxRow, 3).Value >= DateValue("2013/05/21") And Cells(MaxRow, 3) <= DateValue("2014/05/20") Then Cells(MaxRow, 3).Offset(0, -2).Value = "12期" ElseIf Cells(MaxRow, 3).Value >= DateValue("2014/05/21") And Cells(MaxRow, 3) <= DateValue("2015/05/20") Then
Else MsgBox "範囲エラーです。入力を確認してください。", vbCritical End If
Case Else MsgBox "Error" End Select End Sub
とグダグダでここまで作りました。
ここまではなんとか動くのですが、最終行の他の列に値が入ったときにも分岐して動いてほしいのです。
例えばG列に数値が入ったとき、F列が空白でないときH列にF*Gの値を入れたいです。この時、数値以外が入るとメッセージがでてくるとありがたいです。
あと、余談ではありますがシートに数式を入れて計算するのとVBAにて処理をするのはどちらが容量をくわないんですか?どっちの方が処理が速いのか気になりまして・・
どなたかよろしくお願いします
< 使用 Excel:Office365、使用 OS:Windows10 >
ちょっとやりたいことが読み取れないので、まずはこれだけ確認です。
>MaxRow = Sheets("データ").Cells(Rows.Count, 3).End(xlUp).End(xlUp).Row
End(xlUP)が2回続いているのは、意図的なのでしょうか。 2回やっていることで、MaxRowは最終行ではなくなっています。 (´・ω・`) 2020/09/30(水) 15:43
こうなのか...な? かなり想像はいっているので、違うかもしれません Private Sub Worksheet_Change(ByVal Target As Range)
Dim targetA As Range Dim rng As Range Dim MaxRow As Range
Set targetA = Intersect(Target, Range("C:C"))
If Not targetA Is Nothing Then Application.EnableEvents = False For Each rng In targetA.Cells If rng.Value = "" Then rng.Offset(, -2).ClearContents ElseIf IsDate(rng.Value) Then rng.Offset(, -2) = Format(Year(rng.Value) - 2002 - (D >= DateSerial(Year(rng.Value), 5, 21)), "0""期""") End If Next Application.EnableEvents = True End If
Set MaxRow = Me.Cells(Rows.Count, 3).End(xlUp).EntireRow
Set targetA = Intersect(Target, MaxRow, Range("G:G")) If Not targetA Is Nothing Then For Each rng In targetA If rng.Offset(, -2) = "" Then rng.Offset(, 1).FormulaR1C1Local = "=RC[-2]*RC[-1]" Next End If
End Sub (´・ω・`) 2020/09/30(水) 16:38
あ、 数式を入力するところも Application.EnableEvents = False Application.EnableEvents = True で挟んでください。 (´・ω・`) 2020/09/30(水) 16:42
あと、
>下の部分のG列に数値が入ったとき、F列が空白でないときH列にF*Gの値を入れたいです
の部分ですが、数式が反応しませんでした。
(ちんぷんかんぷん) 2020/10/02(金) 11:48
私に状況が解るように説明してもらえたら対応します。 できませんでしただけでは情報が不足なので、これ以上なにもできません (´・ω・`) 2020/10/02(金) 12:17
(´・ω・`)さん 言葉足らずで申し訳ないです... >If rng.Offset(, -2) = "" Then rng.Offset(, 1).FormulaR1C1Local = "=RC[-2]*RC[-1]" ここの部分なんですがどちらかのセルが空白だった場合、計算式の入るセルも空白にしたいのですがどのような記述でしたらよいのですか?
あと
>rng.Offset(, -2) = Format(Year(rng.Value) - 2002 - (D >= DateSerial(Year(rng.Value), 5, 21)), "0""期""")
の部分で5月21日から期を変更したいのですがうまくいかないようです。
例えば今日の日付「2020/10/02」と「2020/05/20」だと期が変わってほしいのですが同じ期が計算されて返ってきます。
「2019/12/31」だと期が変わります。
どうぞよろしくお願いいたします。
(ごくせん) 2020/10/02(金) 16:09
>どちらかのセルが空白だった場合、計算式の入るセルも空白にしたいの 初耳です。 適当に修正して自分の望むようにしてください。
以下、間違いがありました。すみません以下のように修正してください。 結果が正しいかどうか確認してください。2002を加減して調整してください。
誤) rng.Offset(, -2) = Format(Year(rng.Value) - 2002 - (D >= DateSerial(Year(rng.Value), 5, 21)), "0""期""") 正) rng.Offset(, -2) = Format(Year(rng.Value) - 2002 - (rng.Value >= DateSerial(Year(rng.Value), 5, 21)), "0""期""") (´・ω・`) 2020/10/02(金) 16:18
>(D >= DateSerial(Year(rng.Value)
の部分の先頭の「D]が変数の定義がされていないとエラーがでたので勝手に「Date」に変更しました。
もし、間違っていたら訂正お願いします
(ごくせん) 2020/10/02(金) 16:20
(閲覧者) 2020/10/02(金) 19:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.