[[20150516114957]] 『コードの修正』(初老) ページの最後に飛ぶ

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

 

『コードの修正』(初老)

お世話になります。
行方向で10行から27行 列方向で16列から33列 の表の数値の大きさによってう色を変えよと思いコードを書いてみたのですが
 ”参照が不正 もしくは不完全です。”と表示されます。
何が悪いのか御教示して頂けないでしょうか?
宜しくお願い致します。

            Sub 色付け()

            Dim row As Long        '現在行
            Dim col As Long        '現在列
            Dim nrow As String     '現在行のセルの値

            nrow = ""  '変数の初期化

            For row = 10 To 27
            For col = 16 To 33

             nrow = Cells(row, col).Value

             Select Case nrow

             Case Is < 3000
                    .Interior.ColorIndex = 11
             Case Is >= 3000
                    .Interior.ColorIndex = 49
             Case Is <= 2000
                    .Interior.ColorIndex = 47
             Case Is <= 1000
                    .Interior.ColorIndex = 48
             Case Is <= 500
                    .Interior.ColorIndex = 15
             Case Is <= 300
                    .Interior.ColorIndex = 24
             Case Is <= 150
                    .Interior.ColorIndex = 43
             Case Is <= 100
                    .Interior.ColorIndex = 42
             Case Is <= 50
                    .Interior.ColorIndex = 27
             Case Is <= 30
                    .Interior.ColorIndex = 46
             Case Is <= 20
                    .Interior.ColorIndex = 20
             Case Is <= 10
                    .Interior.ColorIndex = 19

             End Select

                  row = row + 1
             Next row
                  col = col + 1
             Next col

      End Sub

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


 >                  row = row + 1
 >             Next row
 >                  col = col + 1
 >             Next col

 row と colの順序が逆転していますよ?

 話は変わりますが、「+1」って必要なんですか?

(半平太) 2015/05/16(土) 13:35


今日は

     With Cells.(row, col)
             Select Case .Value
             Case Is < 3000
                    .Interior.ColorIndex = 11
             ・・・・
              ・・・・
             End Select
      End With

これも必要です。

(ウッシ) 2015/05/16(土) 13:39


半平太様、ウッシ様
ご指摘ありがとうございます。

PCの黎明期に習ったbasicが基本なものでかれこれ40年経ちます。

 なので構文や関数もけた違いに増えて正直理解するのに頭がオーバーフローしています。

ウッシ様のご指摘通り書き換えてみたのですが、

 With Cells.(row, col)のところが赤く反転しています。
実行すると構文エラーになってしまうのですがどの様に対処したらよろしいのでしょうか?
教えて頂けると助かります。

(初老) 2015/05/16(土) 14:37


 横から失礼します。
 Cellsの後の.を取るとエラーが出なくなると思います。あと

 Sub 色付け()

     Dim row As Long        '現在行
     Dim col As Long        '現在列

     For row = 10 To 27
         For col = 16 To 33
              With Cells(row, col)
                   Select Case .Value
                       Case Is < 3000: .Interior.ColorIndex = 11
                       Case Is >= 3000: .Interior.ColorIndex = 49
                       Case Is <= 2000: .Interior.ColorIndex = 47
                       Case Is <= 1000: .Interior.ColorIndex = 48
                       Case Is <= 500: .Interior.ColorIndex = 15
                       Case Is <= 300: .Interior.ColorIndex = 24
                       Case Is <= 150: .Interior.ColorIndex = 43
                       Case Is <= 100: .Interior.ColorIndex = 42
                       Case Is <= 50: .Interior.ColorIndex = 27
                       Case Is <= 30: .Interior.ColorIndex = 46
                       Case Is <= 20: .Interior.ColorIndex = 20
                       Case Is <= 10: .Interior.ColorIndex = 19
                   End Select
              End With
         Next
     Next

 End Sub

 のようにすると若干すっきりするかも?
(se_9) 2015/05/16(土) 15:06

 衝突しましたが。

 With Cells(row,col) ですかね。

 ところで、変数名、row は避けたほうがいいと思います。
 Rangeオブジェクト等のプロパティ名に Row があって、紛らわしくなりますから。

(β) 2015/05/16(土) 15:08


se_9様、β様
返答ありがとうございます。

見よう見まねの世界でコードを書いていますので何が何だか...
細かいところの修正もあるようなので頑張ってみます。

また判らない事がありましたら質問させて頂きます。
勉強になり、また感謝いたしております。
ありがとうございました。

(初老) 2015/05/16(土) 15:28


今日は

スマホで打ってると間違え易くて。
コピペミスでドット付いちゃいました。
(ウッシ) 2015/05/16(土) 15:45


余計なことですけど、
最初のいずれかマッチして
3つ目以降には到達しないと思われます。
        Case Is < 3000: .Interior.ColorIndex = 11
        Case Is >= 3000: .Interior.ColorIndex = 49

どっちかというと、今の逆の順序(正確ではないです)で
列挙していくほうがいいんじゃないですか?
(γ) 2015/05/16(土) 16:14


 無理に Withを使う必要もないかもしれません。

 書き方の一例です。

 Sub 色付け()
    Dim row As Long        '現在行
    Dim col As Long        '現在列
    Dim c   As Long        ' 色

    For row = 10 To 27
        For col = 16 To 33
            Select Case Cells(row, col).Value
                Case Is <= 10:      c = 19
                Case Is <= 20:      c = 20
                Case Is <= 30:      c = 46
                Case Is <= 50:      c = 27
                Case Is <= 100:     c = 42
                Case Is <= 150:     c = 43
                Case Is <= 300:     c = 24
                Case Is <= 500:     c = 15
                Case Is <= 1000:    c = 48
                Case Is <= 2000:    c = 47
                Case Is < 3000:     c = 11
                Case Else:          c = 49
            End Select
            Cells(row, col).Interior.ColorIndex = c
        Next
    Next
 End Sub

(γ) 2015/05/16(土) 16:41


 γさんの仰るとおりですね!!
 Case文(If 〜 Elseif文も)は、条件順序を間違えると正常に作動しない場合がありますね!!

 Case文は、黎明期のBasic(N88Basic)には、命令がないですね 便利ですよ
 あっ、かろうじて On 式 Gosub ラベル、ラベル というのがあったかなあ?

 昔のBasicにはなかった For Each 〜 In 〜 Nextや
 簡単に配列を作る Array関数 Excelならではの検索関数Matchなど を使った別解です。

 Option Explicit 'モジュールの先頭にこの2行を記述してください
 Option Base 1   'これがないとこの例では 誤動作します
 Sub 色付け2()
     Dim rng As Range
     Dim fary As Variant
     Dim aary As Variant
     Dim ans  As Variant
     Dim cl As Long
     fary = Array(3000, 2000, 1000, 500, 300, 150, 100, 50, 30, 20, 10)
     aary = Array(11, 47, 48, 15, 24, 43, 42, 27, 46, 20, 19)
     For Each rng In Range(Cells(10, 16), Cells(27, 33))
        With rng
           cl = 49
           ans = Application.Match(.Value, fary, -1)
           If Not IsError(ans) Then
              If .Value <> fary(ans) Or ans <> 1 Then cl = aary(ans)
           End If
           .Interior.ColorIndex = cl
        End With
     Next
 End Sub

 私も27,8歳ぐらいに独学のN88Basicでした。30年ぐらい前です。

 N88Basicの経験があれば、初めの一歩からの方より、覚えることは少ないですよ
 たぶん・・・。

( ichinose) 2015/05/16(土) 18:09


 >>Case文(If 〜 Elseif文も)は、条件順序を間違えると正常に作動しない場合がありますね!!

 そうですね。
 コードは煩雑になりますが、以下のように書くと、まぎれが少なくなるというか、意図どおりかどうかが
 目で見て判断しやすくなるかもしれませんね。
 (数字が正の整数という前提ですが)

 Sub 色付け2()
    Dim row As Long        '現在行
    Dim col As Long        '現在列
    Dim c   As Long        ' 色

    For row = 10 To 27
        For col = 16 To 33
            Select Case Cells(row, col).Value
                Case 1 To 10: c = 19
                Case 11 To 20: c = 20
                Case 21 To 30: c = 46
                Case 31 To 50: c = 27
                Case 51 To 100: c = 42
                Case 101 To 150: c = 43
                Case 151 To 300: c = 24
                Case 301 To 500: c = 15
                Case 501 To 1000: c = 48
                Case 1001 To 2000: c = 47
                Case 2001 To 2999: c = 11
                Case Else: c = 49
            End Select
            Cells(row, col).Interior.ColorIndex = c
        Next
    Next

 End Sub

(β) 2015/05/16(土) 18:52


γ様、β様、ichinose様
ありがとうございます。

いろいろな記述の方法が有って高校時代に戻った様にワクワクしてきました。
皆様の指摘の有りましたところは、私なりに解決しておりました。
いずれにせよこの年でプログラムを組むことになるとは思いもよりませんでした。
早速ですが新しい質問をしていますので宜しくお願い致します。

(初老) 2015/05/16(土) 20:59


コメント返信:

[ 一覧(最新更新順) ]


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