プロが教えるわが家の防犯対策術!

Excel入門用の教材を作っています。
うまくできたら「OK」を表示するように、たとえば次のようなチェック用の式を使っています。

 =IF(A1="あいうえお","OK","")

ところで、関数など数式を入力させる練習問題の場合、入力した数式そのものが正しいかチェックする方法が思い当たりません。

セルに入力した式そのものを文字列として取得できる関数(の組み合わせ)があればよいのですが、可能でしょうか? 次の xxx のようなものです。

 ? =if(xxx(A11)="=sum(A1:A10)","OK","")

もし無理であれば、セルに入力されているのが、単なる数値ではなく式であることを検査する方法でもかまいません。

どうかご教示ください。よろしくお願いします。

A 回答 (5件)

こんにちは。

maruru01です。

仮に、数式がA1にあるとすると、その隣りのB1を選択して、
メニューの[挿入]→[名前]→[定義]で、
[名前]:適当な名前(仮に「数式」とする)
[参照範囲]:「=GET.CELL(6,A1)&LEFT(NOW(),0)」
として[OK]します。
そうしたら、B1に、

=数式

と入力すると、A1に入力されている数式そのものを表示します。
さらに、

=IF(数式="=IF(A1=""あいうえお"",""OK"","""")","○","×")

のようにすれば、数式の内容をチェック出来ます。
ただし、数式の中に「"」が使われている場合は、
「=IF(A1="あいうえお","OK","")」

「=IF(A1=""あいうえお"",""OK"","""")」
と、全部「""」と2つ重ねる必要があります。
別のセルに先頭に「'」を付けて数式を入力しておけば、

=IF(数式=C1,"○","×")

のようにも出来ます。

なお、最初の設定で、B1に対して左隣りのA1を相対参照で指定したので、どこでもいいので、

=数式

と入力すれば、常にこの左隣りのセルの数式を表示します。
つまり、名前定義をする際に選択したセル(B1)と、[参照範囲]で指定した相対参照セル(A1)の位置関係が維持されるということになります。

この回答への補足

その後、いろいろな情報を探しながら、自分なりに理解を深めることができました。

一種の「ユーザ定義関数」を作成していることになるらしいと理解しました。

GET.CELL は Excel4 のマクロ関数で、現在のバージョンではヘルプが付属していないのですね。なんだか残念です。

第1引数の 6 は、第2引数のセルの「数式」を参照するオプションのようですが、「数値」も「文字列」も両方取得できました。つまり、エクセルではどれも「式」として扱われるということかと理解しました。
数値 1234 は、=1234 という式と等価
文字列 あいうえお は、 ="あいうえお" という式と等価

それから、
GET.CELL(6.範囲) だけでは、式が評価されてしまい、式の値が表示されるのですね。
そこで、&LEFT(NOW(),0) と長さ 0 の文字列を結合して、この「ユーザ定義関数」全体が文字列として扱われるようにし、
さらに、
NOW() によって、シートに変更があった際にリアルタイムで再計算される仕組みになっています。

A1 と相対参照にする意味もよく理解できました。これは便利そうです。

Excel の 「名前」の機能はほとんど活用していなかったのですが、その便利さがよくわかりました。

これで回答を締め切らせていただきますが、他の回答者の方も含め、有意義な知識を教えていただき、ほんとうに感謝しています。今後ともお世話になると思います。よろしくお願いします。

補足日時:2004/11/30 16:15
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございました。
ばっちり取得できました。
高度な内容なので、ひととおり理解するのにも時間がかかり、お礼が遅くなりすみません。
ヘルプではGET.CELL関数について検索できないようなので、ネットの情報などを調べたり実験しながら、理解を深めたいと思います。

お礼日時:2004/11/29 18:52

下記を実行すると、回答者がどのセルにどう言う式を設定したかが、一覧表に出せます。

仮にJ,K列に出してます。
実行する前に式が入ってそうな範囲を指定して実行してください。下記では式はI列より左列と仮定。
Sub test01()
Dim cl As Range
i = 1
For Each cl In Selection
If cl.HasFormula Then
Cells(i, 10) = cl.Address
Cells(i, 11) = "'" & cl.FormulaLocal
i = i + 1
End If
Next
End Sub
これをもう少し改善すれば、自動チェックも出来そうですが、上記に留めました。やはり現状を目で見る必要があるだろうと思って。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
HasFormula と FormulaLocal を使うのですね。
自動化は安易にすべきではないというのも参考になりました。

お礼日時:2004/11/29 22:35

#3です



csvではダメです。
txtに変更してください
    • good
    • 0
この回答へのお礼

お答えありがとうございます。
こんな方法もあるんですね。全然知りませんでした。
参考にしたいと思います。今後ともよろしくお願いします。

お礼日時:2004/11/29 20:04

お役に立てればいいのですが



shift+ctrl+@

csv保存

エクセルで立ち上げると再計算になりますが・・・
メモ帳だと数式
    • good
    • 0

例えば回答を記入するセルをC1


前もって回答が書いてあるセルをB1とします
B1とC1のセルの書式設定をテキストにします。
するとB1とC1を比較できます
例えばD1に =if(B1=C1,"OK","NG")など

他に解答を伏せたい場合はマクロを使って以下のような
方法があります。あくまでもテキストでの比較判定となります。

Sub Macro1()

Dim Shiki, Atai As String

'解答を前もって用意する
Shiki = "=If(A1=" & Chr(34) & "あいうえお" & Chr(34) & "," & Chr(34) & "OK" & Chr(34) & "," & Chr(34) & NG & Chr(34) & ")"

'c1の値が解答と同じかどうか判断

Atai = Range("c1").Value
If Shiki = Atai Then
MsgBox ("正解です")
Else
MsgBox ("不正解です")
End If

End Sub

後は応用してください。
    • good
    • 0
この回答へのお礼

丁寧に説明していただきありがとうございました。
解答を伏せる場合のマクロ参考になりました。
今後ともよろしくお願いします。

お礼日時:2004/11/29 18:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!