[[20170224135053]] 『セルに#VALUE!等のエラーが出ているときはメッセ=x(Ken) ページの最後に飛ぶ

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

 

『セルに#VALUE!等のエラーが出ているときはメッセージ表示とセルへの入力を順番にできるようにしたい』(Ken)

   サイズ1 サイズ2 長さ寸法 重量結果 
1  ***A  ***B    500      50
2
3
4

Private Sub Worksheet_Change(ByVal target As Range)

   Dim GYO As String
   Dim Si1, Si2, length, weight As Range

    GYO = target.Row

  Set Si1 = Cells(GYO, 2)

   Set Si2 = Cells(GYO, 3)
   Set length = Cells(GYO, 4)
   Set weight = Cells(GYO, 5)

   If WorksheetFunction.IsError(weight) Then
          MsgBox "サイズ1を入力して下さい。"
            Cells(GYO, 2).Select
          MsgBox "サイズ2を入力して下さい。"
            Cells(GYO, 3).Select
          MsgBox "長さ寸法を入れて下さい。"
            Cells(GYO, 4).Select

    End if

End Sub

お世話になります。重量を計算するためのマクロなのですが、重量計算結果のweight = Cells(GYO, 5)がエラーなら一番初めのメッセージ"サイズ1を入力して下さい。"が出てOKボタンを押したらCells(GYO, 2)が自動的に選択されてそのセルの入力が済んで「Enter」キーを押したらまた次のメッセージが出て自動的に選択されたセルへ入力するというふうに順番に繰り返していきたいのですが、上記のマクロではセルごとに順番に入力することができずに最後のセルが自動的に選択されてそこでストップします。

これをCells(GYO, 5)にエラーが出ているときは順番にメッセージが出てセルごとに入力することができるようにするためにはどのようにマクロを組めばよろしいのでしょうか?

どうぞよろしく回答をお願いします。

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


 テーマに対する直接的な回答の前に、このコードは

 ・このシートの、どこかのセル(計算には関係のないセルであっても)に変更が行われれば
  自動実行されます。

  そういうことを意識して、Worksheet_Change を使われましたか?

 ・マクロないでエラーメッセージを出して、そのメッセージへの応答後、操作者に何かをさせようとするなら
  マクロを終了させなければいけません。
  また、連続して、入力を誘導したいのは理解しますが、誘導しても、操作者が別のセルを選択して別の入力をするかもしれません。
  どうしても、そうしたい ということであれば、この3つの項目をユーザーフォーム等で表示して、そこで
  セットで正しい値を入れさせる。正しくなければセルへの転記はしない といったような、まったく別の構えになりますね。

(β) 2017/02/24(金) 14:55


 ところで、入力行の F列なんですが、ここには数式が入っているのですか?
 数式が入っているとしたら、どんな数式か、正確にアップしてもらえますか?

(β) 2017/02/24(金) 14:58


こんにちは

Private Sub Worksheet_Change(ByVal target As Range)

    Dim GYO As Long
    Dim weight As Range

    GYO = target.Row
    Set weight = Cells(GYO, 5)
    Application.EnableEvents = False
    If WorksheetFunction.IsError(weight) Then
        Cells(GYO, 2) = InputBox("サイズ1を入力して下さい。")
        Cells(GYO, 3) = InputBox("サイズ2を入力して下さい。")
        Cells(GYO, 4) = InputBox("長さ寸法を入力して下さい。")
    End If
    Application.EnableEvents = True
End Sub

こういう事では?

ついでに

Dim GYO As String
Dim Si1, Si2, length, weight As Range

はダメです。

(ウッシ) 2017/02/24(金) 15:01


(β)さん
早速の回答をありがとうございます。
やはりユーザーフォームになりますか。エンターキーを押すまでは次のメッセージボックスが出ないというふうにしたかったのですが。実はユーザーフォームで入力できるようにしてあるのですが、ユーザーフォームを出しての入力はめんどくさそうなので、ワークシート上で品名のセルをコピー貼付すればそれに関する計算式やドロップダウンリストが自動的に作成できるようにしてあります。しかしこのままでは初めての人は何をどう入力すればわからないので計算結果に#Value等のエラーが出ればMsgboxが出てかつ該当セルが自動的に選択されてそこへ入力すれば良いという風にしたかったのですが、セルごとに連続しての入力はできないようですね。
では計算結果にエラーが出た時にユーザーフォームが出てActiveCellに入力ができるようにしたいと思いますが、例えばエラーが出た時に品名がパイプならこのユーザーフォームが出るようにしたい場合はどのようにすればよろしいでしょうか?

ちなみに重量計算式ですが、色々な条件を加味してるので複雑になりますが、1例を挙げるなら
=ROUND(B2*C2*D2*E2/10^6,2)
これはプレートの重量計算式で
縦寸法×横寸法×板厚×比重(材質等によって自動的に算出されます)/10^6
といった具合です。


ウッシさん
回答ありがとうございます。INPUTBOXも検討したのですが、それぞれのセルには品名によって自動的にドロップダウンリストが入るようになっているので
INPUTBOXはドロップダウンリストが使えないのでやはりユーザーフォームになりますね。


>しかしこのままでは初めての人は何をどう入力すればわからないので
画面にまだ空きがあると思うので、
例を書いて説明しておけばいいかと、
マクロを書いてメッセージボックスを出さなくても、

#Value

こんな意味不明な答えが出てれば、何かがおかしいぐらいは気づいて説明を読み直すと思いますが。。。

敢えてメッセージボックスだしたり、
ユーザーフォームを使わなくても、
シート上の数式で十分な気がします。
(せっかくの表計算ソフトの一番のメインの機能を使って無いような。。。)

マクロを使わなくても、
シートの保護で入力セル以外は触らせない。
入力規則で品名を選択させる。
等を駆使して、
上手い見せ方&入力のさせ方がないかなぁ?
その辺の設計をもう一回見直した方がいいようなきがしないでもないです。。。。
(まっつわん) 2017/02/24(金) 15:47


 基本的にはコメントしたように VBA処理の流れの中で

 マクロ実行
  ↓
 マクロのどこかで実行中断し
  ↓
 ユーザーに、いったん制御をわたし、何か(入力等)をさせる
  ↓
 また、マクロの途中に戻り、以降のコードを実行

 こんな器用なことはできませんので。

 さて、結構難問かも。

 計算結果、F列にエラーがでたとします。
 まず、数式の計算ではエクセルのChangeイベントは発生しません。ですから その数式が参照している別セルのChangeイベントで起動せざるを得ない。
 でも、数式が1つの形で決まっていれば、なんとかできますけど、「1例を挙げるなら」ですから
 必ずしも参照しているセルは、この列とこの列と・・・という判断ができないですねぇ・・

 あれ? ちょっと不思議です。F列の#VALUE の元ネタが、どのセルなのか、計算式によってバラバラなんですよね?
 なのに、なぜ、コードでは B,C,D列のみに再入力させようとしているのでしょうか?
 計算基礎は そのほかにも E列だったり、ほかの列だったり、そういうものもあるんですよね??

 もう1つ、#VALUE だったとして、その原因が、どのセルだったか、それはわかりませんよね。
 B列のセルの値は正しかったかもしれない。それなのに B列に何か入れさせようとする流れですよね?

 それと、きっと意識しておられないと思いますけど、シート上では、うっかりミスも含めて
 複数セルへの同時入力ができます。典型的なのは領域をマウスで選択してDeleteキー。
 もしかしたら、この結果、1つだけではなく、いろんな行のセルが #VALUE オンパレードになるかもしれない。
 そういった場合は、どのような処理の流れを想定していますか?

 ★なんとなく、まっつわんさんが言われるように、エラー値ならセルを赤くするような条件付き書式を
  その数式の元ネタのセルに設定しておけば、それでことたりるような気がしますね。

(β) 2017/02/24(金) 15:53


βさん
仰る通り品名によって計算式が変わるようになってたり、入力列が変わったり若しくはプルダウンリストの内容も変わったりするようになってます。
品名によって入力列が変わったりするのでMsgBoxを出してわかりやすくしたかったのですが。

エラー値ならセルを赤くする条件式書式を設定する方が簡単でいいのかも知れません。


>品名によって入力列が変わったりするのでMsgBoxを出してわかりやすくしたかったのですが。
同じ列を使おうとするから難しくなると思います
  A      B      C   D   E     F    G
 形状  材質  径 幅 長さ 厚さ 重量
 平板  鉄       50 1000 3.8  ???
 パイプ ステン 30      2000  1.5  ???

入力欄を間違えた場合もエラーになるわけですから、
(って、そんなに間違えるかわからないですが。。。)
なにか間違えたって解りますよねー。。。。
もちろん条件付き書式設定で強調するのもありでしょうし。。。

どこかに似たような面白そうなテンプレートないか検索してますが、
キーワードがまずいみたいで、なかなかいいの見つかりませんねー
他人がどんなことしてるか見てみるのが
一番参考になるかと思うのですが。。。

(まっつわん) 2017/02/24(金) 16:28


まぁ、形状によって入力欄のロックの位置と塗りつぶしの色の変更くらいは、
マクロで制御してもいいと思います。
(入力可:白、不可:グレーとか)

(まっつわん) 2017/02/24(金) 16:34


 思い付きですけど、シートモジュールに以下のようなコードを書いておけば
 役立つかも。試してみて、うざかったら捨ててください。

 (現在の Worksheet_Change を置換)

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Dim c As Range
    Me.ClearArrows
    On Error Resume Next
    Set r = Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0
    If r Is Nothing Then Exit Sub
    For Each c In r
        c.ShowPrecedents
    Next
    MsgBox "エラーになっています。解決してください"

 End Sub

( β) 2017/02/24(金) 17:03


まっつわんさん
βさん
ていねいなコメントありがとうございます。
やぼ用で至急帰宅しなければならなくなりました。
また明日宜しくお願いします。

まっつわんさん

>シート上の数式で十分な気がします。
>他人がどんなことしてるか見てみるのが
一番参考になるかと思うのですが。。。

サンプルはいろいろ検索してみたのですが、ほとんどシート上の数式を使ったものだけでVBAを使用したものはみつかりませんでした。またシート上の数式だけですとプレートの計算式用、配管の計算式用とそれぞれシートを分けるか若しくはシート内でページを分けるかしなければならず、かえって煩雑なワークシートとなります。

VBAだと1シート内の同ページ内で品名を配管、プレート、若しくは穴あきプレートと変えればそれに応じた計算式、プルダウンリスト、比重、1m当たりの単重量を出すことができます。

あとは例えば穴あきプレートなら削除する面積の計算式の元数値をどこに入力すればよいか等をMsg等で示してかつ該当セルに自動的に移動できれば他の人にもわかりやすく十分使用できるものになると思ったのですが。

入力しないセルには自動的に[-]が入るようにしていたのですが、わかりづらいので言われるように入力不可のセルにはグレーで塗りつぶし、かつロックを掛けるようにしたほうがいいですね。


 ( β) 2017/02/24(金) 17:03 のコードはいかがでしたか?

( β) 2017/02/27(月) 09:40


 すみませんが回答ではありません。
 コメントを書く時は編集からではなくコメント欄から書いてください。
(bi) 2017/03/01(水) 09:04

( β)さん
おはようございます。
現在、重量計算の容量がきちきちで「プロシージャが不足しています。」のメッセージが出てくるためあまり重要でないコードは削除して作成を進めている状態です。なのでコードを元から入れ替えるような作業は大変なので、

計算結果がエラーの時は赤文字にする、
入力しないセルはグレー、かつハイフォンにする。
ある条件下ではMsgを出して入力セルに移動する。

を工夫して進めていこうかと思っています。βさんがせっかく考えて下さったコードはまた次の機会に検討してみたいと思ってますのでご容赦下さい。

(まっつわん)さん

重量計算書は「Excelで作成する設計計算」(だったと思います。正しい書籍名はのちほどお知らせします)の本を参考にしたり、

サイトは「Excelで作る鋼材重量表」
http://www.vector.co.jp/soft/win95/business/se249340.html
(このサイトで作成しているものは品名、種類によって計算式を切り替えることができないのでかなりごちゃごちゃした計算式になってます。)

あとは歯車メーカーや材料メーカーのサイト等に載っている計算式を参考にしたりしました。

(ken) 2017/03/01(水) 09:16


 >>コードを元から入れ替えるような作業は大変なので、・・・・コードを元から入れ替えるような作業は大変なので

 使う、使わない は ken さんの判断ですから、私がどうこういう筋合いじゃないですが
 少しコメントしておきます。

 アップしたものは、アイデアとして、こういったものもあるけど、これは、間違い発見の役に立つのか
 たたないのか、間違いの修正に役に立つのかたたないのか、それを確かめてもらうために、

 『現在の Worksheet_Change を置換』とコメントしたもので、たとえば新規ブックのシートにエラーになる数式、エラーにならない数式を書いておいて
 そのシートのどこかを変更すれば、エラーになっている数式に対して、ある種の表示をおこなう。

 それを、確かめてもらいたかったという意図です。

 使えそうなら、現在のコードの中に、アップしたブロックを埋め込めばいいわけで、その処理負荷は微々たるものですし
 それによってメモリーがどうこう という話にはならないと思います。

 なので、やってみたけど、こういうところが、こうこうの理由で、ちょっと今回の要件にはマッチしないといった
 レスをいただきたかったですね。

(β) 2017/03/01(水) 09:46


βさん
申し訳ないです。教えていただいたコードの意味がよくわかっておらず、また重量計算書の作成編集作業で能力的にいっぱい、いっぱいの状態で問い合わせながらの検証をする余裕がないのが正直なところです。
とりあえず重量計算書を完成させて一息ついて余裕ができてから検証してみて使えるようなら順次変更してみようと思ってますのでご容赦下さい。
(ken) 2017/03/01(水) 10:43

>(このサイトで作成しているものは品名、
>種類によって計算式を切り替えることができないので
>かなりごちゃごちゃした計算式になってます。)
数式だとそうなりますが、
そういうものだと思えば、何がだめなんだろうという感じです。
数式を切り替えることができないってこともないでしょう。
セルを分けて、計算式をそいれぞれ置いておき、
別のセルでどの計算式の答えを採用するかという式を作ればよいように思います。

Excelで作る鋼材重量表>
ありがとうございます。参考になりました^^
基本表引きして、表を埋める感じですかね?
数式で参照する以外、用がなければ、シートの非表示をすればよくないですか?
ユーザーフォームの代わりにシートを使うのもありと思います。。。
なんにしても、アイデア次第かと^^

VBAでアプリっぽくするなら、
ユーザーフォームで操作者が変なことをしないように、
ガッツリ制御できると思います。
数式とVBAと上手くバランスとって出来るといいですね。

(まっつわん) 2017/03/01(水) 11:25


(まっつわん)さん

 遅くなりましたが参考とした書籍名を連絡します。私の勘違いでしたが、重量計算は載っていません。
『Excelで解く機械設計計算』<工業調査会>です。
 各種機械設計計算をExcelに導入する時にはわかりやくて参考になると思います。
(Ken) 2017/03/03(金) 10:11


コメント返信:

[ 一覧(最新更新順) ]


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