[[20120405122229]] 『セルの値が0.08以下or1以上なら削除』(くろたろう) >>BOT

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

 

『セルの値が0.08以下or1以上なら削除』(くろたろう)
 Excel2007・WinXp/SP3

 BOOK(WORK.xlsm)に6シート、同じようなレイアウトで
 64列×700行程度データが入っています。
 (A:C列は見出し、1行目は日付、全セル表示形式は標準)
 実際は全シートに処理を行いますが、今回はその部分は省きます。 

 D2以降のセルの値が「0.08以下」or「1以上」なら削除したいのですが
 以前、こちら
[[20110704170912]]
 の質問でseiyaさんに教えていただいた
 「Evaluate」を使用してみようと下記のコードを書いたのですが
 エラー値が入ってしまいます。

 なにか根本的な事を間違えているのか、それとも簡単な記述ミスなのか
 悩みこんだんですが分からず仕舞いです。

[[20070212134849]]

 の、「Upper」の扱いのご説明あたりが関係するのかな〜
 配列になってないのかな〜等と探ってはみましたが…

 どのように記述すれば実現出来るか、ご教示いただけないでしょうか。
 どうぞ、よろしくお願いいたします。

 Sub MyDel2()

 Dim maxrow As Long, maxcol As Long
 Dim i As Long, j As Long
 Dim x As String

 With ActiveSheet
    maxrow = .Cells(.Rows.Count, 1).End(xlUp).Row
    maxcol = .Cells(1, .Columns.Count).End(xlToLeft).Column

    With .Range(.Cells(2, 4), .Cells(maxrow, maxcol))
        x = .Address
        .Value = Evaluate("if(OR(" & x & ">1," & x & "<0.08),""""," & x & ")")
    End With
 End With
 End Sub

 ちなみに、Forの入れ子でやりたい事は実現出来ているので、勉強の為の質問です。

これは、実際に期待する式を配列数式として同じサイズの別範囲に
入力してみると原因が分かります。

x.address="$D$2:$J$7" だとすると、
このマクロの結果は
=IF(OR($D$2:$J$7>1,$D$2:$J$7<0.08),"",$D$2:$J$7)
をCtrl+Shift+Enterで確定する場合の結果と同じはずです。

この配列数式の場合、
$D$2:$J$7>1、$D$2:$J$7<0.08の論理配列にひとつでもTRUEがあれば
OR関数の部分がTRUEになってしまうので、結果は全て""となるはずです。
(だから「エラー値が入ってしまいます」というのはかえって不思議なのですが)

        .Value = Evaluate("if((" & x & ">1)+(" & x & "<0.08),""""," & x & ")")

とすると、期待する結果が得られますか?
(みやほりん)


 みやほりんさん、レスをありがとうございます。

 .Value = Evaluate("if((" & x & ">1)+(" & x & "<0.08),""""," & x & ")")
 を入れてみましたが、同じ結果となりました。

 質問文に足りなかった部分を追記します。
 ・エラー値は「#VALUE!」が全セルに入ります。
 ・値は「0.131871012478333」といった数値か、nullです。

 0.115229673	0.071536178	0.102046779
 0.125989364	0.126171048	0.126354024
 0.126624797	0.136122989	0.137136804
 0.143860692	0.143051701	0.142711573

 引数の種類が正しくない…?うんむむむ?
 値にスペース等は入っていないようです。
 他に確認する事がありましたらお願いいたします。
 (くろたろう)


 ちなみに、みやほりんさんの式をシート上でCSEで確定したところ
 希望の結果が返りました。
 もう少し検証してみます。
 (くろたろう)

こちらではうまく機能しています。
コードは先に提案した一文を修正した以外は手を付けていません。
こちらで作成した数値はRAND関数を使用した0〜2の間の小数を含む乱数です。

当方、2003で検証しているので、Excel2007ではEvaluateの仕様が違うとか・・・
(配列を受け付けないなど)

 Sub test()
 [a1:a3] = [b1:b3<>1]
 End Sub

新規シートで上記を試してみてTRUEやFALSEがA1:A3に表示されるかどうか。
(みやほりん)


 みやほりんさん、引き続きありがとうございます。
 どうも、R1C1表示になっていた為にエラーになっていたようです。
 アドレスが参照されなかったんですね。

 64列を数える為に変更した為にエラーが起こっていたとは…
 いつも、変な躓きをして恥ずかしい限りですが、
 配列式の考え方のふわふわしてる部分(課題)も見えた気がします。
 ありがとうございました!
 (くろたろう)

コメント返信:

[ 一覧(最新更新順) ]


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