[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コードの修正』(初老)
お世話になります。
行方向で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
見よう見まねの世界でコードを書いていますので何が何だか...
細かいところの修正もあるようなので頑張ってみます。
また判らない事がありましたら質問させて頂きます。
勉強になり、また感謝いたしております。
ありがとうございました。
(初老) 2015/05/16(土) 15:28
スマホで打ってると間違え易くて。
コピペミスでドット付いちゃいました。
(ウッシ) 2015/05/16(土) 15:45
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
いろいろな記述の方法が有って高校時代に戻った様にワクワクしてきました。
皆様の指摘の有りましたところは、私なりに解決しておりました。
いずれにせよこの年でプログラムを組むことになるとは思いもよりませんでした。
早速ですが新しい質問をしていますので宜しくお願い致します。
(初老) 2015/05/16(土) 20:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.