[[20200726080540]] 『Select Caseについて』(まな) ページの最後に飛ぶ

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

 

『Select Caseについて』(まな)

Private Sud Worksheet_Change(ByVal Trget As Rang)
Dim c As Renge
Dim s As Renge

For Each c In Target

 SelectCase c.Column
 Case 8
  Sheets("Sheet2").Cells((c.Row-5)*3+2,c.Column-1).Value=c.Value
 End Select
Next

Select Case c.Column

 Case 1: s = "Aさん"
 Case 2: s = "Bさん"
 Case 3: s = "Cさん"
 Case Else: s =""
End Select
End Sub

オブジェクト変数またはWithブロック変数が設定されてません
になってしまいます、どう変えれば良いですか、教えてください。

シート1のH列に1を入力、シート2のG列に1は表示されますがAさんと表示したいです
よろしくお願いいたします。
未熟です

< 使用 Excel:Excel2007、使用 OS:Windows7 >


■1
>オブジェクト変数またはWithブロック変数が設定されてません
細かいスペルミスは置いといて、「Sheet2」という名前のシートは存在しますか?
また、「(c.Row - 5) * 3 + 2」が0以下になるとマズイとおもいます。
さらに、「End Select」が余分にあるのと、「Next」の位置がおかしいです。

■2
>シート1のH列に1を入力、シート2のG列に1は表示されますがAさんと表示したいです
ちょっと理解できませんが、推測含めて上記の部分を修正してみるとこんな感じでしょうか?

    Private Sub Worksheet_Change(ByVal Target As Range)
        Stop 'ブレークポイントの代わり
        Dim c As Range
        Dim s As Range

        If Not Intersect(Target, Range("H6", Cells(Rows.Count, "H"))) Is Nothing Then
            For Each c In Intersect(Target, Range("H6", Cells(Rows.Count, "H")))
                Set s = Sheets("Sheet2").Cells((c.Row - 5) * 3 + 2, "G")

                Select Case c.Value
                    Case 1: s.Value = "Aさん"
                    Case 2: s.Value = "Bさん"
                    Case 3: s.Value = "Cさん"
                    Case Else: s.Value = ""
                End Select
            Next c
        End If

    End Sub

(もこな2 ) 2020/07/26(日) 09:55


まなさん、もこな2さん、こんにちは。
2回目の、
Select Case c.Column の cが、
For Each c In Target
Next
 の外にあるからではないでしょうか?
(uu) 2020/07/26(日) 10:20

もこな2さん、お礼のお返事遅くすみません。
バッチリ、感激です、ありがとうございました。
あと1つだけお願いです、シート1のH列に1を入力でシート2のG列に表示
これをシート1のK列にに1を入力でシート2のJ列に表示、シート1のN列に1を入力でシート2のM列に表示
3列とびとびにするには、教えていただいたコードを3回ぶん書けば良いのでしょうか?

(まな) 2020/07/26(日) 15:46


>3列とびとびにするには、教えていただいたコードを3回ぶん書けば良いのでしょうか?
たぶん違うと思いますが、提示したコードをよく研究すれば自力で答えにたどり着けると思います。

ポイントはIntersectメソッドの役割を理解するところじゃないでしょうか。

 【参考】
http://officetanaka.net/excel/vba/tips/tips118.htm

また、元のコードのように、「c.Column-1」でもよいと思いますが、一つ左のセルを表現するならば、対象セル.Offset(0,-1)という書き方も可能ですね。

(もこな2 ) 2020/07/26(日) 17:05


もなこ2様
参考を読みましたが、ピントきません。
行列がクロスしている セルですよね。
If Not Intersect(Target, Range("H6:K6:N6", Cells(Rows.Count, "H:K:N"))) Is Nothing Then
            For Each c In Intersect(Target, Range("H6:K6:N6", Cells(Rows.Count, "H:K:N")))
ではおかしいですし、
If Intersect(Target, Range("H:K:N"), Rang) Is Nothing Then 
ちょっと難しいです、助けてください。

(まな) 2020/07/27(月) 19:03


スマホからなので要点だけ。
↓が何を返すのか、考えてみてください。
 Intersect(Target, Range("H:H,K:K,N:N"), Rows("6:" & Rows.Count)) 

(もこな2) 2020/07/27(月) 20:10


ありがとうございます、いまPCに向かえないので、後日返事します
がんばってみます。
(まな) 2020/07/27(月) 20:32

こんばんは、まなです。
いまいちのみこめていません、
 Intersect(Target, Range("H:H,K:K,N:N"), Rows("6:" & Rows.Count)) 
配列?何でしょうか。
(まな) 2020/07/28(火) 18:59

もう少し分解したほうが分かりやすかったかもしれません。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Stop 'ブレークポイントの代わり
        Dim 監視対象 As Range
        Dim 操作対象 As Range
        Dim c As Range
        Dim s As Range

        Set 監視対象 = Intersect(Range("H:H,K:K,N:N"), Rows("6:" & Rows.Count))
        MsgBox 監視対象.Address(External:=True)

        Set 操作対象 = Intersect(Target, 監視対象)        
        If Not 操作対象 Is Nothing Then
            For Each c In 操作対象
                Set s = Sheets("Sheet2").Cells((c.Row - 5) * 3 + 2, c.Column - 1)

                Select Case c.Value
                    Case 1: s.Value = "Aさん"
                    Case 2: s.Value = "Bさん"
                    Case 3: s.Value = "Cさん"
                    Case Else: s.Value = ""
                End Select
            Next c
        End If
    End Sub

ちなみに、intersectメソッドは「行列がクロス」ではなく、指定したセル範囲の重なる部分を返します。
(もこな2 ) 2020/07/28(火) 21:07


ありがとうございます、なんとかひもといとみます数日待ってください
帰宅後PCに向かう時間がありません、また返事致します、ごめんなさい。
(まな) 2020/07/28(火) 21:38

要は、6行目以下、かつ、H,K,N列しか処理対象にしたくないけどその指定に悩んでいるわけですよね。
その場合、アプローチとしては、
 (1) ループ処理に入る前にH,K,N列以外を排除しておく
 (2) ループ処理の中でH,K,N列のみ処理をする

のどちらかになろうかと思います。
(1)については既に提示してますが、(2)ならばこんな感じにでしょうか。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Stop 'ブレークポイントの代わり
        Dim 操作対象 As Range
        Dim c As Range
        Dim s As Range
        Dim MyRNG As Range

        Set 操作対象 = Intersect(Target, Range("H6:N" & Rows.Count))
        If Not 操作対象 Is Nothing Then
            For Each c In 操作対象
                Select Case c.Column
                    Case 8, 11, 14
                    '「c」に取り出されたセルが、H,K,列ならば処理する
                        Set s = Sheets("Sheet2").Cells((c.Row - 5) * 3 + 2, c.Column - 1)

                        Select Case c.Value
                            Case 1: s.Value = "Aさん"
                            Case 2: s.Value = "Bさん"
                            Case 3: s.Value = "Cさん"
                            Case Else: s.Value = ""
                        End Select
                    Case Else '←下記の理由により省略可能
                        '「c」に取り出されたセルが、H,K,N列でないときは何もしない
                End Select
            Next c
        End If
    End Sub

(もこな2 ) 2020/07/29(水) 07:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.