• ベストアンサー

EXCELでコロン「:」を使用した時にシリアル値にならないようにしたい

EXCEL2007(他ヴァージョンは分かりません)にて、コロンを使用した時刻を入力すると、勝手に書式が変わって、表示は時刻のままですが、値がシリアル値になってしまいます。これが機能しないようにしたいです。 元々数式が入力されているセルで、必要に応じて時刻を手入力しているので、書式を文字列にするのは不可です(手入力後はマクロで元の数式を入れてます)。 要は通常は数式を使用し、コロン「:」を使用して入力した時は文字列としたいのです。 コロンを使用しないで、例えば15:00を1500のように入力すれば、目的は果たせるのですが、他の(EXCELの知識がない)作業者が使用するファイルのためどちらの入力方法でも稼働するようにしたいのです。同じ理由でシングルクォートの使用も不可です。 条件付き書式やTEXT関数を使用しても、シリアルへの変換後に機能するためかうまくいきませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.13

こんばんわ。 もう解決してるかもしれませんが、ちょっとだけ失礼します。 通常は数式で運用して、入力した時には文字列として扱いたい場合、 どんな値を入力しても構わないなら、(aとかbとかもあり?) 試してもいいかもしれないかなーっと思うのは With Range("A10")   .NumberFormat = "general"   .Formula = "=A1&A2"   .NumberFormat = "@" End With こんな感じで書式を「標準」にして数式を設定したら、 その後、「文字列」にしておく事です。 [f2][enter]などとしてしまうとちょっと...ですが、仕様として耐えれるならこれ簡単です。 さて、以下余談です。 回答#3のokormazdさんのコードを参考にされる場合、 >If isect Is Nothing Then End この部分のEndステートメントには気をつけてください。 何か理由があるのか知りませんが、使用の際はヘルプ参照の事。 VBEのヘルプはクイックアクセス機能があります。 Endにマウスキャレットをあてて[F1]キーです。 それに >Application.EnableEvents = False は >If isect Is Nothing Then End この行の下に持ってってください。 >では最後に、回答頂いたコードが「うまく動かない」「目的を果たせない」 >と判断された場合にはこちらはどのようにアクションすればよいか教えてください。 質疑応答を重ねる事で解決できます。 「うまく動かない」状況、「目的を果たせない」状況をできるだけ詳しく書いてください。 どこが悪いのかわからないのは質問者の方にはよくある事です。 調べる方法さえもわからない方もいらっしゃるでしょう。 その時、回答側が『経験者』であれば、その辺の機微を察し、 適確な質疑を重ねる事でどこに問題があるか探り出す事ができます。 イベントコードの貼り付け先が違ったりする事ってよくある事ですし、 EnableEvents=Falseのままだったりする事もありがちです。 今回のように、そのような可能性がないか回答側から問いかける事で大抵は解決するでしょう。 また、デバッグのやり方を提示して、質問者の方自ら確認できるようにアドバイスする回答者もいるでしょう。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html 文字だけのコミュニケーションってあいかわらず難しいですね。 お互い、言わんとするところがなかなか噛み合わず、ずれてしまう事も多々あります。 なもんで『質疑応答を重ねて試行錯誤する事を続ける事』でしか解消できないと思いますよ。 もうちょっと肩の力を抜けばいいのに。 ...って思ったりなんかしたりする事もないではない...かな :D

shibisei
質問者

お礼

お世話になります。 回答のコードの使い方ですが、 > =IF(A1=191,QRCD!D14&QRCD!D15,"") を > 手入力後はマクロで元の数式を入れてます。 と書いてますので、このマクロに追加すると言うので良いのでしょうか。 今自宅ですので、実際のファイルが手元にないので試せませんが、なんとなくそれでできるような気がします。 明日試してみて結果ご連絡します。 余談の件ですが、クイックアクセス、自宅PC(2002です)では「インストールされていません」と出てしまいました。そもそも#3さんのコードが動かないみたいなので、これも会社のPCで試してみます。 > 質疑応答を重ねる事で解決できます。 なのですが、当初の#3さんの回答に対する補足はそのつもりで書いたつもりだったのですが、どうやら嫌なようにとられてしまって困惑していました。#2さんの回答は、こちらで一生懸命説明しているのに、それは無視され、あるべき姿を押し付けられたような感じがして、ちょっとでした。 今回の質問のやり取りをしているときに、全く別の質問の回答をしました。こちらでは初めの質問の希望どおりにできているのですが「できない」と回答があり、正直少しばかりムッとしました。その後原因は質問者が間違えて設定していることが予想できたのでそれ以上は突っ込みませんでした(質問も締め切られてしまったのでコメントできませんでした)。これも質問者の「できない」は悪気はなかったと思います。ですが、同じようなことを自分もしてしまっているんだと気づきました。 #2さんも#3さんも、初めの私の補足で多分カチンと来てしまったのでしょう。そのせいで話がややこしくなってしまったようです。 今後は補足やお礼の内容に気をつけるようにしたいと思います。 本来の回答の他に、アドバイスまで頂きましてありがとうございました。

shibisei
質問者

補足

お世話様です。 補足とお礼が逆になってしまいましたが… 教えていただいたコードでばっちりでした。 ActiveCell.FormulaR1C1 = "=IF(R[-22]C[-3]=191,QRCD!R[-9]C&QRCD!R[-8]C,"""")" の代わりに、 With Range("D23") .NumberFormat = "general" .Formula = "=IF(R[-22]C[-3]=191,QRCD!R[-9]C&QRCD!R[-8]C,"""")" .NumberFormat = "@" End With としただけで、私のしたいことがイメージ通りクリアできました。とても簡単で、すっきりしていますし他のコードへの影響もありません。 大変助かりました。 ENDステートメントについてですが、ヘルプの解説に書かれている内容についての注意でしょうか。確かにプログラムが強制終了し、初期化されてしまうようなので、他のマクロと合わせて使う場合は気をつけないといけないということですね。ありがとうございました。 これにてこの質問は締め切ることにします。 ありがとうございました。

その他の回答 (12)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.12

#3です。 「ヤレヤレ・・・」慨嘆です。 「新しいブックのThisbookWorkへ貼り付け」じゃ動くわけないや。 「ThisWorkbook」のことだろうけど。 ThisWorkbookのイベントに「Worksheet_Change」イベントなんて無いもんね。自分で作れば別だが。 「Worksheet_Change」はSheetのイベントだから、Sheet1とかのコードモジュールに貼り付けなければダメでしょう。

shibisei
質問者

お礼

いやはや、大変失礼しました。 ThisWorkbookのWorkbook_SheetChangeイベントとごっちゃになっていました。(それと確かにThisbookWorkではなく、ThisWorkbookでした。) と言うか、こういったイベントはThisWorkbookで使うものとばかり思っていたもので…手持ちの参考書の事例では、どれも「ThisWorkbookを選択し…」という記載があったもので。これはあくまで一つの方法だったのですね。 早速、試してみたところ、新しいブックに適用rangeをA10のみとし、A10に"=A1&A2"、A1に"1"、A2に"2"を入力。A10には"12"が表示されている状態で、A10に"10:00"を入力すると、所定通り文字列の10:00がでました。 ただ、実際のファイルへ適用してみると、他のマクロとの動作に影響が出てしまうこと、他にWorkbook_SheetChangeイベントを設定しているせいか、競合というのでしょうか?うまく動きませんでした。これについてはこちらサイドの問題ですので、コードを見直して対応したいと思います。 色々とありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.11

#3です。 わたしは、#3で回答した後、コメントを控えていました。それは、#3の回答に対するコメントで、「あ~この質問者はバカだ、放っておけ」ということからでした。しかし、Wendt02さんの回答で、「回答頂いたコードが「うまく動かない」「目的を果たせない」 と判断された場合にはこちらはどのようにアクションすればよいか」 というにいたって、放っておけ、というわけにいかないと思いました。 「回答頂いたコードが「うまく動かない」「目的を果たせない」 と、どういう風に判断するのですか。回答者はあなたに回答のコードの評価を依頼しているのではありません。一般にこのようなサイトでは悪意で無ければ、まともなコードを提示するでしょう。悪意のコードでもよいということになれば、こんなサイトは成立しないのではないですか。だとすれば、回答されたコードは質門者の期待にいくらかでも沿うように回答されるはずです。それをほとんど根拠も無く、「うまく動かない」「目的を果たせない」というのはどういう根拠なのでしょう。 自分が勝手に間違った操作をして、期待通りの結果を得られなかったからといってそのコードはダメだとするより先に、自分の操作が間違っていたかもしれないとどうして思わないのでしょうかね。

shibisei
質問者

お礼

お世話様です。 ご指摘の件ですが、もちろん自分の操作が間違いないかの確認はしています。他のファイル(マクロ)の影響がないか、セキュリティの設定は・・・等。コードはコピーして使用していますので、ミスはありません。適用rangeの変更のみです。それでも二回以上試して動かないので、事実を書いたものです。回答者を批判、評価する意思など毛頭ありません。 根拠を問われましても、上記の通りですし、回答の内容に > 理由がいまいち不明なので、これでいいかどうかは、わかりません。 や > 即席で作りましたので、細かい部分は見ていませんが、 等と書かれていますので、「動作確認してないのかな?」とか「バグあって当然ということかな?」という認識でいました。 通常の会話でなら、コードを教えててくれた人へ(あげた人から)、「動かないよ」と言うのは(言われるのは)全く普通のことと思いますが、ネット上の文章になりますので、互いの誤解の発生により気分を害してしまうこともあるかと思います。書き方(マナー?)について至らなかった件は誤ります。申し訳ありません。 前の回答#11のお礼に記載していますが、「3#で教えていただいたコードをコピーして、新しいブックのThisbookWorkへ貼り付け。適用レンジは「A1:A10」を「A10」へ変えている」ことで正常稼動しない(こちら側の)原因として何が考えられるでしょうか。 お分かりでしたらお教え頂きたいと思います。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.10

#3です。 「適用rangeをA10のみとし、A10に"=A1&A2"、A1に"1"、A2に"2"を入力しました。A10には"12"が入力されますが、A10に"10:00"を入力すると、やはり文字列ではなくシリアル値に変更(表示は10:00)されてしまいました。」 あなたの言うことが理解できません。私のコードは、ちゃんと動くはずですが。あなたの言うように実行すれば、(表示は10:00)ではなくて、10:00:00になるはずですが、rangeだけでなく、 mystr = Format(Target.Text, "hh:mm")に換えましたか。そうすれば、表示は10:00になるでしょう。それはいいのですが、表示が10:00ではいけないのですか。どのように表示されればいいのですか。 この表示は、シリアル値ではなくて、文字列のはずですが、これがシリアル値だというのはどうしてわかったのですか。 Application.EnableEventsの場所にも間違いはありません。 もしかすると、このコードを間違えて、実行が途中で止まったりしませんでしたか。そうすると、Application.EnableEvents=Falseのままなので、次に実行しても、イベントが働かないので、シリアルのままになります。その場合は、Application.EnableEvents=Trueをイミディエイト ウインドウで1度実行します。 10:00がシリアル値か文字列かの簡単な判定は、セルの書式を「パーセンテージ」にすれば、シリアル値なら41%とかになり、文字列なら10:00のままです。 「「うまく動かない」「目的を果たせない」と判断された場合には」自分のやり方が間違っているかもしれないと少しは考えてみることも必要ではないですか。「目的を果たせない」というなら、回答者は質問者の質問の内容から判断して回答しているので、もしそれが違っているなら、回答者が理解できるように説明していただかないとわかりません。とにかく、「何をどのように表示」させたいのですか。「10:00」ではダメで、何にしたいのでしょう。

shibisei
質問者

補足

お世話様です。 せっかく回答頂き、「うまく稼働しませんでした」という書き方に気を悪くされてしまったかもしれません。悪気はありませんでした。申し訳ありません。 ですが、もう一度試してみてもうまくいきません。そちらでは正しく稼働しているようなので、やはり何かが間違っているのだと思います。 こちらでは、教えていただいたコードをコピーして、新しいブックのThisbookWorkへ貼り付けただけです。適用レンジは「A1:A10」を「A10」へ変えています。(初めもそうでしたが)セキュリティも「低」に設定し他のファイルも開いていませんので、その他の影響は無いと思います。 この状態でA1へ「10:00」を入力すると「10:00」の表示になります。「10:00:00」ではありません。もちろん「mystr = Format(Target.Text, "hh:mm:ss")」のままです。またシリアル値かどうかの判断ですが、B10セルへ「=A10」を入れ表示形式を標準にしたところ、シリアル値の「0.416667」が表示されましたのでそう判断しました。 試しにA10,B10の書式をパーセンテージにしてみたら、やはり両方42%になってしまいます。 何が悪いのか教えていただければ幸いです。 よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんばんは。 ご質問者さんは、一度、お金を払ってでも、実際に他のプロの方に相談されたほうが良いと思います。掲示板では、プロも素人の方も、自称では話にならないし、また、掲示板では、限界があります。 =IF(A1=191,QRCD!D14&QRCD!D15,"") もともと、この数式とそれぞれのQRCD!D1 とQRCD!D15の内容を公開はしていません。 たぶん、QRCD!D14&QRCD!D15 ここが時間値になるというわけでしょう。 片方が、Hour で、もう片方が、Minute というところでしょうか? おそらく、Excelには、文字列というのは、明示的に、書式「@」や、書式文字列「'」を入れて不活性化させることであって、おそらくは、テキスト値だけの話だと思います。 そして、そこに「:」が入っては困るという話になっているのでしょうけれども、それは、書式で処理すればよいだけの話で、テキスト値に、VALUE関数にして、書式を「hmm」とでもすれば、「:」なしのデータは作れます。 =IF(A1=191,(QRCD!D14&":"&QRCD!D15)*1,"") とし、ユーザー定義の書式を「hmm」または、「hhmm」などとします。書式で、「:」を抜いたものにしておいて、入力の際には、「:」を入れればよいのです。 >これが何らかの理由で修正が必要な場合があるので、同じセルへ入力しないと、作業的におかしな感じがします。 表示の狂いはありません。ただし、数式は消えてしまいますが、数式を消したくなければ、このようにすればよいです。 =IF(A1=191,IF(E1="",(QRCD!D14& ":" & QRCD!D15)*1,E1),"") で、E1に時間値を入れたら、修正するという方法も可能です。 入力規則はあくまでも、入力規則です。その程度のことは事前に見当されてほしいものですが、私の考える範囲では、この件では、入力規則自体も簡単ではないと思います。 >コロンを使用した値が入力できなければ目的は果たせます。 これについては、検討しましたが、簡単ではありません。文字列で入れていれば別ですが、そのような判定を入力規則では出来ないと思います。文字列で入れているという前提では、本末転倒になってしまいます。数字に「:」を入れて、再び数字を入れれば、概ね、瞬間に少数点の数字に変わります。その中身には「:」はありません。単なる数字だけです。私自身で解決方法もありますが、それなら、こちらの考えたVBAを使えばよいのです。 >同様に「違う値が入力できない」コードを作成いただいたようですが、入力規則の方がスマートですし、 スマートとか、いただいたようですとか、感覚的な発言は、慎重にしてください。まったくのVBA初心者の方が、VBAのコードを見ただけで、ダメだしするようことは、どこの掲示板でもマナー違反です。何のために時間を割いて回答を書いているのか分からなくなります。 VBAをお使いになるなら、もう少し、VBAを勉強されることをお勧めしたいと思います。そうそう簡単には、できるようにはなりません。せっかくの貴重な回答をもらったものドブに捨てかねないものです。単にVBAの回答者の回答は、ありきたりの道具を提供しているわけではないことをご理解になると思います。私も、これで終わりにさせていただきます。

shibisei
質問者

お礼

お世話様です。 > たぶん、QRCD!D14&QRCD!D15 ここが時間値になるというわけでしょう。 その通りです。ですが、その点については =IF(A1=191,QRCD!D14&QRCD!D15,"") の式を出した時点で説明もしております。 回答頂けるのはありがたいのですが、私の補足をちゃんとお読み頂いているでしょうか。 > 入力の際には、「:」を入れればよいのです。 この点についても、社内全工程で「:」を使わないで統一しているので、この工程でだけ「:」を使うわけにはいかない(表現は異なりますが)と説明しています。 > =IF(A1=191,IF(E1="",(QRCD!D14& ":" & QRCD!D15)*1,E1),"") で、E1に時間値を入れたら、修正するという方法も可能です。 それくらいならレベルの低い私でも考えました。が、時間を入力するセルが複数あるのはおかしいと思いませんでしょうか。その為私のその方法を採用しませんでした。 入力規則に疑問をもたれているようですが、入力値の制限を整数の1~2359にしています(これも記載しています)。 > 数字に「:」を入れて、再び数字を入れれば、概ね、瞬間に少数点の数字に変わります。その中身には「:」はありません。単なる数字だけです。 そうです、「:」を使えば小数点を含んだ数値に変わりますので、整数ではない。つまりけられます。もちろん「24:00」や「48:00」を入力してしまえば入力されてしまいますが、元々発生頻度の少ない入力ミスに対しこれらを入力してしまうといった状況は、きわめて可能性が低いと考えられますので、この手段が有効と判断しました。「フールプルーフなのだから100%でなければならない」と言われるかもしれませんが、何事も100%は難しいものです。 > まったくのVBA初心者の方が、VBAのコードを見ただけで、ダメだしするようことは、どこの掲示板でもマナー違反です。 そうでしたか。それは大変失礼しました。 では最後に、回答頂いたコードが「うまく動かない」「目的を果たせない」と判断された場合にはこちらはどのようにアクションすればよいか教えてください。 よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 >社内において全工程でコロンを使わない(15:00を1500と表す)方法で統一していますので、一か所だけ異なると混乱を招きます。とは言え、派遣などで新しく入ってきた人の場合「時間を現すのはコロンを使う」のが当たり前のはずですから、慣れるまでにコロンを使って入力してしまいこともあるでしょう。 補足を読ませていただいた限りでは、私の話は見えてこないでしょうね。そういう問題というのは、入力者がどうであろうとも、最終的な出力の問題は、シリアル値であろうが、なかろうが、統一すればよい話ですから、本来は、シリアル値に統一させたほうがよいのです。出力データのエラー・フリーにするのは、まったく別問題なのです。もう少し、VBAが上達すれは、何だこんなことか、と分かっていただける話です。ExcelはExcel用のデータに合わせるほうが良いのです。出力用には別にするのです。 >これで誤った値が出力されるのを防止したいので、今回の質問をするに至りました。 おっしゃっている話というのは、見かけ上の問題だと思います。その程度でなら、どうにでもなります。 即席で作りましたので、細かい部分は見ていませんが、違うデータが入ると削除されてしまいます。 ただし、セミコロン(;)までは、受けられます。 '------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   On Error GoTo EndLine   Dim r As Range   Dim myDat As String   '-------------------------------------------   Const IN_COL As Integer = 1 '1列目 ;対象列   '-------------------------------------------   Set r = Intersect(Target, Columns(IN_COL))   If r Is Nothing Then Exit Sub   If Target.Count > 1 Then Exit Sub   If Target.Value = "" Then Exit Sub   Application.ScreenUpdating = False   Application.EnableEvents = False   If InStr(1, Target.Value, ";", 1) > 0 Then     myDat = Replace(Target.Text, ";", ":", 1, , vbTextCompare)   End If   If IsDate(Target.Text) And myDat = "" Then     sTimeChange Target   ElseIf myDat <> "" Then     sTimeChange Target, myDat   ElseIf IsNumeric(Target.Value) Then     Target.NumberFormat = "000" '数値の場合     Target.Value = Target.Value   ElseIf IsNumeric(Target.Text) = False Then     Target.Clear   End If EndLine:   Application.EnableEvents = True   Application.ScreenUpdating = True End Sub 'サブルーチン Sub sTimeChange(arg As Range, Optional myDat As String)   If myDat = "" And InStr(arg.Text, ":") > 0 Then     myDat = (arg.Value)   End If   myDat = Format$(myDat, "hhmm")   arg.Clear   arg.Value = myDat 'ゼロサプレスしないなら、Format$(myDat,"0000") End Sub '------------------------------------------- ただ、入力値がDate型になるのを防ぐだけでも良いはずです。#6さんの日付値を判定する関数があったか忘れましたが、あれば、入力規則も良いかもしれません。

shibisei
質問者

お礼

お世話様です。何度もありがとうございます。 > 出力データのエラー・フリーにするのは、まったく別問題なのです。 は分かっています。 > シリアル値であろうが、なかろうが、統一すればよい話ですから、本来は、シリアル値に統一させたほうがよいのです。 についても先にも書いていますが分かっています。 ですが、(これも書いてありますが)初めに使用されるデータが文字列なんです。「文字列→シリアル」への返還は不可欠です(理由は説明しました)。同じ数式を使用する限り、文字列を使用しなければなりません。するとシリアルで入力すると「シリアル→文字列→シリアル」と二重に変換が必要になります。これはばかげています。もちろん同じ数式を使わず、別数式を使用すればいいのかもしれませんが、これもスマートではありません。そこで初めの質問である「キャスティング無効化」が「簡単にできるのであれば」と思いここで質問させて頂きました。結果的に簡単ではないことが分かりましたが。 真の目的は「誤出力の防止」です。そのための手段としてキャスティング無効化を考えましたが、別の手段として#6さんにアドバイス頂いた入力規則が有効と思いました。コロンを使用した値が入力できなければ目的は果たせます。 同様に「違う値が入力できない」コードを作成いただいたようですが、入力規則の方がスマートですし、エラーメッセージも簡単に出せるのでこちらを採用しようと思います。 色々と面倒おかけしました。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.7

結局、 1.15:00であろうが1500であろうが、文字として入って欲しい 2.後で、VBAで「式」を入れるので、書式は「文字列」では困る(標準にする) という事ですよね で、VBAを考えてみました 15:00と入れた時点で、EXCELが勝手に書式を「時間」にするのはどうしようもないので、VBAで強制的に戻します 書き込むセルを仮に「A2」としています Changeイベントに記述します --------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$A$2" And Cells(2, "A") < 1 Then     Application.EnableEvents = False     mt = Hour(Cells(2, "A"))     mm = Minute(Cells(2, "A"))     Range("A2").NumberFormatLocal = "@"     Cells(2, "A") = mt & mm     Range("A2").NumberFormatLocal = "G/標準"     Application.EnableEvents = True   End If End Sub --------------------------- 2行め後半で、書式が「時間」に変わったかどうかを判定してますが、ちょっと怪しいです シリアル値が24:00までは1以下であることを利用していますが、24:00以上の値を入れるとミスります あと、書式は、一旦「文字列」にして書込んでから「標準」に変えてます これによって、「1500」が文字として書き込める様です

shibisei
質問者

お礼

回答ありがとうございます。 試しに新しいブックで使ってみましたが、うまく動きませんでした。 VBA技術乏しいもので、何が悪いのかさっぱり(^_^;) それと、申し訳ないのですが、ワークシートチェンジイベントは、他の動作で使用し(QRコードを読み込んだ後、所定のセルへカーソル移動)、動作後無効化しているので、使えません(と思います)。 ありがとうございました。

  • sekkii
  • ベストアンサー率50% (13/26)
回答No.6

知識の乏しい私が口をだすのはおこがましいのですが… 「データの入力規則」を使ってはどうかな?と思いました。 見当違いでしたらごめんなさい。。

shibisei
質問者

お礼

なるほど、そうですね! 入力値を整数にして1~2359にしてやれば、コロンを入力した値を入力してもメッセージ出して、誤入力の防止できますね。 発想の転換です。 関数使って、隣のセルへメッセージ表示させようかと思っていたところですが、入力規則使った方がスマートです。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#2の回答者です。 >ミス防止や効率化のためにEXCELの関数とVBAで自動化したものです。 補足された内容で、残念ながらシングルクォート不可の因果関係自体は理解出来ませんでしたが、ただ、なんとなく事情は想像できます。 ちょっと長くなりますが、私の経験談から書かせていただきます。何かの参考になれば幸いです。 まったくExcelを知らない人に使わせようという前提なら、今のスタイルは、まったく違うだろうと思います。特に、中高年の人に使わせようとすると、まったく想定できない使い方に出会うことがあります。それで、それを教えようと、入力を見ていたりしても、プライドを傷つけるというのか、怒り始めるので、手が付けられないのです。それを急ぐので若い人に頼んだら、仕事を奪うのか、と言い始めます。それも、1週間程度、パソコン教室に通ってもらっても、おまけに、私の使っていた設計用のテキストを無断で持ち出しても、その程度でした。それなのに、自分の言葉が、東京の方言でさえ気がつかないので、IMEが変換できないと言うレベルの人でした。本当に困ってしまいました。 若い人は、パソコン教室に行くこともなく、1週間、毎日、PCの前でなんとなく遊んでいるなって放っておいたら、もう、1年やっていた人よりも、上手にできるようになっていました。私は、その人があまりに早く覚えてしまい、怖くなってしまいました。 ご質問者さんの抱いているイメージと、Excelを使わせるというイメージとにギャップがあることなんだろうと思います。私は、十数年も、こんなQ&A掲示板のサポートで、時々、表計算の機能を使わせない、というリクエストを言う人に時々出会うことがあります。キャスティングは、Microsoft 系の表計算としての、利点であり欠点でもあります。この機能は、1980年代からの機能ですから、今更、しょうがないです。 もし、VBAのある程度の技術力があるなら、数式との組み合わせ、という方式は、完全にやめたほうが良いようです。入力アプリケーション・システムという形にして、Excelのセルやコマンドは、ほとんどさわらせないという方式にします。 UserForm にするのか、#4さんでもサンプルが出ていますが、埋め込み型のテキストボックスや他のコントロールに入力する方法で作ったほうがよいです。場合によっては、Excelのメニューなどは、一切隠して、ボタンで保存、終了まで作ってしまいます。もちろん、シートタブも隠して、ボタンのクリックでシートの切り替えを作ります。 本来、Excelを使う人が、1500 と 15:00 自体を分からないというのでは、まったく話にならないと思います。しかし、1500で入れようが、15:00で入れようが、どちらでも「シリアル値」になるという条件自体は、ある程度マクロの技術があれば簡単なことですが、「シリアル値」自体を不可というのでしたら、それは、基礎的な誤解だと思います。 #2で書いたように、シリアル値であろうがなかろうが、セルに表示している限りは、VBAでは関係ありません。表示していない、というなら、表示自体を時間書式にしなければなりません。 これは、VBAの技術の低い人とトラブルになったことですが、ユーザーが入力した値を、完全、エラー・フリーで、その値をデート型に代入して設計できるかどうかは、技術力の差そのものです。こんなことは、最初は教わらなくては自分で開発するのは容易なことではありません。これには、多くの先人たちが、ああでもないこうでもないとした技術なのですから。 今のご質問から予想されるスタイルは、まったく新しくしないと、Excelを知らない人には使えるようなアプリケーションにはならないと思います。それを、どうするかは、ご自身がお決めなってください。こういう限られた掲示板では、手取り足取りということは出来ません。 #3さんのマクロをダメだししたようですが、少し直せば、こうしたQ&A掲示板での回答としては、目的自体はご質問者さんの満足するものが得られるように思います。また、入力の間違いに対して、補正できるようにするか、エラー表示するかレベルなら、簡単だと思います。ただし、VBAを扱うなら、最低限、シリアル値不可などという話はやめていただきたいです。時間表示している以上、文字であろうが、シリアル値であろうが、そんなことは、まったく関係ないのですから。 >VBAは、自動マクロ記録を中心に参考書をめくりながら作成するレベルです。 それは難しいかもしれません。私自身は、設計自体の問題を言っているので、考え方が違います。Excelを使えない人を対象にするのなら、ある程度の範囲で、たかがExcelでも、クラスの設計から始めないといけないようです。それでも、Excelを使う限りは、十分だと言えるものはありえないかもしれません。 お手本となる材料は、お手元にないのだろうと思います。ここの掲示板のどこを探してもないと思います。ここは設計自体を教えることはありません。いくつかのVBA専門掲示板のダウンロードサイトなどには、VBEがプロテクトせず公開してくれているものがありますから、それを参考にされてもよいと思います。目からウロコのコードの流れが分かります。 =IF(A1=191,QRCD!D14&QRCD!D15,"") これの程度のものは、VBAで簡単に組み込めるはずでず。どの程度、私が想定できているか分かりませんが、これが、シリアル値がどうとかいう話と結びつけてしまったことが、話をややこしくしているように思います。たぶん、VBAでは、シリアル値でも、そうでなくても、そんなことは関係ないということは、理解されていないと思います。いくら、言葉を尽くしても、技術的なものですから、経験的には、この種の内容で理解してもらったことはないので、あまり深追いはしません。この種の質問に対して、仮にピンポイントの解答をしても、あまり意味がないように思います。 具体的な内容が出せないのは、今のご説明では、せっかくしていただいたにも関わらず、回答者として、理解できていないということです。しかし、それは、たぶん今の流れでは、こちらが納得するのは無理のようですから、それについてはご容赦願います。

shibisei
質問者

補足

丁寧な回答ありがとうございます。 当方VBAに技術力ありませんので、UserForm等は現状考えておりません。いずれは身につけようと思ってはいます。 > VBAを扱うなら、最低限、シリアル値不可などという話はやめていただきたいです。時間表示している以上、文字であろうが、シリアル値であろうが、そんなことは、まったく関係ないのですから。 とのことですが、やはりこちらの説明が不足しているようです。 本来の使い方であれば、おっしゃる通りだと思います。 しかし、今回私が作成したファイルで初めに入力するロット情報ですが、日時がシリアル値ではなく、文字列情報なのです。これをシリアルに変換して経過時間を算出しています。ロット情報そのものを変えればいいのかもしれませんが、親会社の作成したQRコード内の情報のため変更することができません。 QRコードの情報でも、手入力した際の時刻でも、同じ数式で経過時間を算出するために(初めの質問の目的が果たせないなら、ここを変えることになると思いますが)、キャスティングを無効にしたいのです。 時刻入力に全てコロンを使用すれば解決すると考えられるかもしれませんが、社内において全工程でコロンを使わない(15:00を1500と表す)方法で統一していますので、一か所だけ異なると混乱を招きます。とは言え、派遣などで新しく入ってきた人の場合「時間を現すのはコロンを使う」のが当たり前のはずですから、慣れるまでにコロンを使って入力してしまいこともあるでしょう。これで誤った値が出力されるのを防止したいので、今回の質問をするに至りました。 どうやら、難しいようなので、別の手段を考えてみることにします。 ありがとうございました。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.4

こんなのはどうでしょう... 図参照 その1 コントロールツールボックスからテキストボックスを D2 の辺りに貼り付けています コードの表示で、 changeイベントに Private Sub TextBox1_Change()   Cells(2, "A") = "'" + TextBox1.Text End Sub とします その2 作業セル(B5とC5)を使って、時と分を分けて入力してもらいます A5 には =B5&":"&C5 と入れておきます

shibisei
質問者

お礼

回答ありがとうございます。 作成いただいたサンプルその1で、A2に相当するセルへ =IF(A1=191,QRCD!D14&QRCD!D15,"") が入力されており、これが通常、ロットの時刻情報を現しています。 これが何らかの理由で修正が必要な場合があるので、同じセルへ入力しないと、作業的におかしな感じがします。 その2ですが、 時と分を分けて入力するのは効率が悪い気がしますし、上と同じ理由でうまくありません。 こちらの目的が不明瞭なようで、面倒おかけします。#5の回答へ補足しておりますので参照ください。 別の手段を考えようと思います。ありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

「手入力後はマクロで元の数式を」 ということなので、VBAはいくらか使えるのだと思います。 で、 何でこのようにしなければならないのか理解に苦しみますが、 どうしてもというなら、 下記のようにすればよろしいのではと思います。 理由がいまいち不明なので、これでいいかどうかは、わかりません。 そのシートモジュールに、イベントプロシージャ、 Private Sub Worksheet_Change(ByVal Target As Range) Dim isect As Range, mystr As String, c As Integer Application.EnableEvents = False Set isect = Application.Intersect(Range("A1:A10"), Target) If isect Is Nothing Then End c = InStr(Target.Text, ":") If c > 0 Then Target.NumberFormat = "@" mystr = Format(Target.Text, "hh:mm:ss") Range(Target.Address) = mystr End If Application.EnableEvents = True End Sub 適用rangeは適宜変更のこと。

shibisei
質問者

補足

理由については、下の回答に補足しましたので参照ください。 VBAは、自動マクロ記録を中心に参考書をめくりながら作成するレベルです。系統だって勉強したわけではないので素人に毛が生えた程度とお思いください。 ですので、お書き頂いたコードについてなんとなくしか分かりません。 ワークシートのチェンジイベント使って、入力したセルの値に合わせて型を変更している様ですが、Application.EnableEventsのtrueとfalseの位置が悪いのでしょうか?うまく稼動しません。 試してみたのは、適用rangeをA10のみとし、A10に"=A1&A2"、A1に"1"、A2に"2"を入力しました。A10には"12"が入力されますが、A10に"10:00"を入力すると、やはり文字列ではなくシリアル値に変更(表示は10:00)されてしまいました。

関連するQ&A

  • excel 時刻の引き算の結果と、直接入力とはシリアル値が違う

    お世話になります。 たとえば、 15:00 - 14:30 = 0:30 これを書式を変更してシリアルで見ると、0.0208333333333333 0:30 直接入力した場合は シリアルで 0.0208333333333334 となり、見た目同じなのにシリアルが違う為、 あとでこの二つをVlookup などで再利用しようとしたとき 結びつきません。 どちらにあわせてもよいので、 同じ結果にしたいのですが、 どのような方法があるでしょうか? できれば、時刻 - 時刻  という数式のうちに、 何か書式を変えるような式があるならそれを入れて、 結果を、直接入力した結果と同じにしたいです。 よろしくお願いします。

  • エクセル2010で条件付き書式の方法

    エクセルの「D列」に文字列として数字が入力されています 例 23_2 30_3 56_1 等です この「D列」で左から2文字を判断して太文字あるいはフォント色を変更いたい場合 (条件書式ルールで 「数式を使用して、書式設定をするセルを決定」 を選択) 30_3 と入力されたセルの書式を変更したい場合・・ その時の数式の入力なのですが =LEFT(D1,2)="30" としたのですが機能しません どのように数式を打ち込めば良いか教えてください

  • Excel &で他セルを参照させた時の時刻の表示がシリアル値になってしまう

    あるセルに、他の複数のセル内容を、&でつないで表示させたいのですが、 その表示させたい内容のひとつが時刻で、それがどうしてもシリアル値で 表示されてしまいます。時刻のままで表示させたいのですが・・・。 元のセルは今、書式設定は「時刻」になっており、 それを「文字列」にしてしまっても良いのですが、 その場合でも、半角数字:半角数字という書式を維持させたいです。 関数で処理しようと、 HourとMinuteを使う、Timeを使う、なども考えたのですが、 今ひとつスマートでないと思われました。 書式設定などで処理できるならばそれで一番良いのですが・・・。

  • エクセルで時間入力10:30の:コロン省略したい。

    始業と終業の時間を入力し勤務時間を計算しております。 始業時間はA1に8:30 終業時間はB1に17:00と入れております。 コロン(:)を省略できるととても楽になります。8:30は830と入力、17:00は1700と入力して 表示にはコロンが入り、セルの書式としては時刻と認識し時間計算が出来ればありがたいです。 よろしくお願い致します。

  • EXCELのシリアル値と文字列

    職業柄時間のデータが正しく入力されているかEXACT関数を使って様に検証しています。具体的には Aの列-指示のデータ Bの列-入力したデータ Cの列-比較結果 という具合です。 今までは両方のデータが時刻の書式だったためうまくいっていたのですが、この指示のデータの方が文字列で入力されてきてしまい、EXACT関数では全てFALSEになってしまいます。 例えば12:00:00と言う場合 Aの列-12:00:00=0.5 Bの列-12:00:00=0.5 Cの列-TRUE だったのが、Aの列が文字列になってしまったため Aの列-12:00:00=12:00:00 Bの列-12:00:00=0.5 Cの列-FALSE になってしまいます。現状ではAの列の書式設定を時刻にしてからそのセルをダブルクリックすれば解決することは分かりましたが、なんせデータが膨大な量なので困っています。よろしくお願いします。

  • Excelのシリアル値について

    シリアル値の日付を、シリアル値ではない文字列の形に変更したいのですが、入力しないで直す方法はありますか? 例:2009年3月21日(シリアル値:2009/3/21) ↓   2009年3月21日(シリアル値:なし)

  • Excelでの時刻入力

    初めて質問を投稿します。 私は仕事でよくExcelを使うのですが、 Excelで時刻入力する際、通常は”15:00”というように入力しますが、 時刻の入力数が多過ぎて、毎回わざわざ”:(コロン)”を入れるのに手間がかかってます。 ”1500”と入力するだけで時刻を入力できる方法ってあるんでしょうか? その入力した時刻データを使って、別セルに関数で計算をさせてるんですが、 シリアル値で入ってないと当然計算ができないので困ってます。 セルの書式設定とかでどうにかできたりするんでしょうか? いい方法をご存知の方、どなたか教えて頂ければ嬉しいです。

  • Excelでのセルの書式の変更時の挙動

    Excel2000で,あるセルに文字列の書式を指定しておき,たとえば「=1000+300」と入力するとそのまま表示されます。 その入力されたセルの書式を数値に変更しても表示は変わりません。しかし,数式バーで1回Enterすると「1300」が表示されます。 このセルの書式をまた文字列にしても「1300」のままです。ここで,また数式バーで1回Enter(もしくはセルをダブルクリック)すると「=1000+300」に戻ります。 一連の表示変更をセルの書式変更などのメニューコマンドのみで実現する方法をご存じの方は教えてください。

  • Excelのことですっごく困ってます!!!!

    エクセルでオートフィル機能を使うと連続データの入力や文字列などをコピーしたり出来ますよね!! そこで質問なんですが、数百の数値が入力されていて指定したセルに数式を入力してオートフィル機能を実行すれば簡単に全部にその数式が適用されるとは思うのですが、数百の数値の中に文字列が入力されている場合「0」か「エラー」が入力されてしまうと思うのですが、文字列だけを飛ばして数値入力されている行だけに数式を適用されるようにすることは出来ないのでしょうか???? データが限りない数あります。文字列の行に入力されてしまう「0」や「エラー」を消すだけでもかなりの数になってしまうのです。期限のあるものなのですごく困ってます!! エクセルの詳しい方大至急助けてください!!!!!!!!!!

  • EXCELの関数について教えてください。

    EXCELの関数について教えてください。 A列のセルに「18:00 」or 「18:30」 or「19:00」 or「19:30」と入力するとB列のセルに「8:00」と表示され、「17:30」と入力すると「7:00」と表示される方法を教えてください。 セルの書式の表示形式は「文字列」ではなく「時刻」に設定したいです。 多分IF関数をつかうを使うのではないかと思うのですが、書式が「時刻」のためかうまくいきません。 よろしくお願いします。

専門家に質問してみよう