[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『表示』(Excel2003)
A B C 1 - 済 0 2 未 100 3 未 0 4 未 500 5 ○ 済 500 6
上のような表があるとして、A列に「○」か「-」を表示させるようなマクロを作りたいと思っています。
A列に「○」が入る条件としてB列に「未」、C列に0以上の数字が入っている場合のときに「○」が表示されるように、
A列に「-」が入る条件として、B列に「未」、C列に0の数字が入っている場合のときに「-」が表示されるように、
C列が空白の場合はA列も空白にしたいと思っています。
C列に数字の合計の入力がされているところまでを自動で行いと思って居るのですが、それって可能ですか?
それとも何行から何行目までとう指定が必要なのでしょうか?
色々と教えてください。宜しくお願いします。
こんなことでしょうか?(ROUGE) With Range("C1", Range("C" & Rows.Count).End(xlUp)) .Offset(, -2).Value = Evaluate("IF(" & .Address & "="""","""",IF(" & _ .Offset(, -1).Address & "=""済"",IF(" & .Address & "=0,""-"",""○""),""""))") End With
衝突ー 関数案です。
IF関数でできると思います。 まず条件を整理しましょう。 表と文章が合ってないので、表から判断します。
T C列が""(空白)またはB列が「未」の時、"" U B列が「済」且つC列=0の時「-」 V B列が「済」且つC列>0の時「○」
A1=IF(OR(C1="",B1="未"),"",IF(B1="済",IF(C1>0,"○","-")) ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ T U
ケース外 C列がマイナスの場合「-」 C列が入力されていて、B列が未でも済でもない場合「FALSE」 となります。 (とおりすがっ太)
>ROUGHさん 早速の回答ありがとうございます。 A1にしか表示されないですね。
A列全てを「○」か「-」を表示させたいと思っています。 全てといってもC列の合計の数式が入っているところまでです。 既にA列のセルに何かしら文字が入っている場合は飛ばして結構です。 一行ずつ隣り合ったB列とC列を見て、条件に合うものだけに「○」か「-」を表示できればと思っています。
説明不足ですいません。(>_<)
(Excel2003)
>とおりすがっ太さん 回答ありがとうございます。
B列が「未」且つC列=0のとき「-」 B列が「未」且つC列>0のとき「○」 C列が空白の場合はB列は済でも、未でもA列は空白です。
ボタン化したいと思って居るいるので、マクロではどのようになるのか 教えて頂きたいと思います。
本と説明不足ですいません。
(Excel2003)
因みに関数で表記するとこんな感じです。 ここではB1が未以外のときは空白で表示されています。
A1=IF(AND(B1="未",C1=0),"-",IF(AND(B1="未",C1>0),"○"," "))
(Excel2003)
ROUGHさんのコードを参考に自分なりに作成してみました。 ん〜こんなやり方でいいのでしょうか・・・・。
Sub test()
Dim i As Integer
With Range("A1") For i = 0 To 37 .Offset(i, 0).Select If .Offset(i, 1).Value = "未" And .Offset(i, 2).Value > 0 Then .Offset(i, 0).Value = TextBox1
ElseIf .Offset(i, 1).Value = "未" And .Offset(i, 2).Value = 0 Then .Offset(i, 0).Value = "-"
Else End If Next End With
End Sub
しかし、このままでやると0と空白が区別しません。空白も0とみなされてしまいます。 それを解消する方法ってあるのでしょうか? アドバイス宜しくお願いいたします。
(Excel2003)
空白かどうかでしたら >ElseIf .Offset(i, 1).Value = "未" And .Offset(i, 2).Value = 0 Then の部分を ElseIf .Offset(i, 1).Value = "未" And .Offset(i, 2).Value = "" Then ~~~~~~ でしょうか? (momo)
>momoさん 回答ありがとうございます。
ElseIf .Offset(i, 1).Value = "未" And .Offset(i, 2).Value = "" Then .Offset(i, 0).Value = ""
その方法も試してみたんですが空白ではなく「-」が入力されちゃうんですよ。 きっとどこかが違うのかとは思うんですが・・・。 それが分からないんですよ。
普通なら上記の方法で問題ないとは思うんですが、なぜなんでしょうね。
(Excel2003)
> A1にしか表示されないですね。 そんなことはありません。 試されたシートのC列に数値は入っていましたか? 入っていないのだとすればA列には何も表示されないでしょう。 提示された条件では少なくとも検証していますし、期待される結果も得られています。 できないの一言で済まされるのは心外です。 (ROUGE)
>ROUGEさん 気を悪くして申し訳ございません。 C列に数値は入ってます。 いろんな数字を入れて、B列にも未の場合と済の場合をちゃんと入力してありました。 その中で検証してみて、A1しか表示されなかったので、そう答えたまでです。 私のやり方が間違っていたのでしょうか?
(Excel2003)
> C列が空白の場合はA列も空白にしたいと思っています。 > 既にA列のセルに何かしら文字が入っている場合は飛ばして結構です。 ここが矛盾。
Sub test() With Range("b1", Range("b" & Rows.Count).End(xlUp)).Offset(, -1) .Value = Evaluate("if(" & .Address & "="""",if(" & .Offset(, 1).Address & _ "=""未"",if(" & .offset(,2).address & ">0",""○"",""-""))," & .address & ")") End With End Sub (seiya)
>ROUGEさん わかりました。 私の説明が悪かったようですね。
A B C
1 - 済 0 2 未 100 3 未 0 4 未 500 5 ○ 済 500 6
A列に文字が「○」、「-」が入っている場合もあり、空白の場合に上記の条件を満たしている場合に「○」や「-」を表示させたかったのです。
私の説明が悪かったようです。 申し訳ございませんでした。
(Excel2003)
>seiyaさん 回答ありがとうございます。 A列に文字が入っている場合はC列に必ず数字が入っている状態です。
(区切り記号または)というコンパイルエラーが表示されます。
(Excel2003)
"がひとつ余計でしたか?
Sub test() With Range("b1", Range("b" & Rows.Count).End(xlUp)).Offset(, -1) .Value = Evaluate("if(" & .Address & "="""",if(" & .Offset(, 1).Address & _ "=""未"",if(" & .offset(,2).address & ">0,""○"",""-""))," & .address & ")") ' ^^ End With End Sub (seiya)
>seiyaさん ありがとうございます。
しかし、この方法でも、0と空白は区別しないんですね。 やはり空白も0とみなされてしまうんでしょうか?
(Excel2003)
これでは?
Sub test() With Range("b1", Range("b" & Rows.Count).End(xlUp)).Offset(, -1) .Value = Evaluate("if(" & .Address & "="""",if(" & .offset(,2).address & "<>"""",if(" & _ .offset(,1).address & "=""未"",if(" & .offset(,2).address & ">0,""○"",""-"")," & .address & _ "),"""")," & .address & ")") End With End Sub (seiya)
>seiyaさん コンパイルエラーになっちゃいます。(>_<)
(Excel2003)
""=""未"", が "="未"", コード修正済み (seiya)
>seiyaさん お手数をおかけしてすいません。
デバック発生です。 型が一致しませんというエラーメッセージが表示されます。
(Excel2003)
もう一箇所 .offset(,2) → .offset(,2).address 修正済み (seiya)
>seiyaさん ありがとうございます。 空白のところは空白で表示されるようになりました。 感激です。
どうやったのでしょうか? コードがちょっと私には理解出来なくて・・・。 今後のために教えて頂けないでしょうか?
(Excel2003)
Eavaluate method を使用して解決しています。
If(A1="",If(C1<>"",If(B1="未",If(C1>0,"○","-"),A1),""),A1)
という数式をA1:Ax(B列の最終行)まで計算しています。
(括弧の中の実際の数式は If(A1:Ax="",If(C1:Cx<>"",If(B1:Bx="未",If(C1:Cx>0,"○","-"),A1:Ax),""),A1:Ax) になります。)
この数式をそのままA1に挿入すると循環参照で計算されませんが Evaluate methodを使用して、計算結果をメモリー上の配列に それぞれの計算結果を一旦格納してからA列に出力しています。
[[20070212134849]]『Evaluate Method の研究』
参考まで (seiya)
>seiyaさん 色々とありがとうございます。 数式がそのまま使える方法があるとは知りませんでした。
まだまだ勉強不足です。 全然詳しくはないなりに色々と試してみても駄目でしたので、 本と助かりました。
回答してくださった皆様ありがとうございました。
(Excel2003)
>seiyaさん あっ因みに、0と空白の区別ってどうやったのでしょうか?(笑)
そこだけ教えてくださいませんか?
(Excel2003)
そのために If(A1="",If(C1<>"",If(B1="未",If(C1>0,"○","-"),A1),""),A1) を提示したのですが...
対象は .offset(, 2).address ですので、数式の中を 確かめてください。 .offset(,2).address & "<>"""" (seiya)
>seiyaさん なるほど、そういうことでしたか。 お手数かけてすいませんでした。 納得しました。(>_<) ありがとうございます。
(Excel2003)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.