[[20200930141703]] 『VBAで最終行を取得し、列に値が入ればselect cas』(ちんぷんかんぷん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

申し訳ございません。
やりたいことは、C列に日付を入れたらA列に何期かというのを自動で入れたいのと、C列を消去するとA列も消去されるようにしたかった感じです。
そこに追加で他のG列なども読み取れて分岐できるのかなと思い、質問させていただきました。
おっしゃってくださるとおり、
.End(xlUp)は1回だけで大丈夫です。誤記でした。
(ちんぷんかんぷん) 2020/09/30(水) 15:58

 こうなのか...な? 
 かなり想像はいっているので、違うかもしれません
 
    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

(´・ω・`)さんありがとうございます。
返信遅れました。
日付を入力したらいけました。そのセルを消すとA列のセルも消せました。しかし、5/20を境に期を変更したいのですが、実装できませんでした。
2019年や2020年のように年を変更するとできたのですが。。。

あと、
>下の部分の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.