• ベストアンサー

マクロで入力規則を設定すると日付が文字列になる不具合が・・・・

エクセル2000です。 以下はG10セルに手作業で「入力規則」を設定するところをマクロの記録で残したものです。 リストは、2008/11/1,2008/11/5,2008/11/30 と yyyy/m/d 形式で手入力しましたが、なぜか記録では 11/1/2008,11/5/2008,11/30/2008 と m/d/yyyy 形式になっています。 手作業で設定した入力規則は正しく作動し、セルに表示されるドロップダウンリストも手入力どおり yyyy/m/d になっています。 ところが、記録したこのマクロをそのまま作動させると、今度はリストは m/d/yyyy になり、しかも日付ではなくなんと文字列になってしまうのです。 マクロを手直しし、 xlBetween, Formula1:="11/1/2008,11/5/2008,11/30/2008"を xlBetween, Formula1:="2008/11/1,2008/11/5,2008/11/30"にしても同じ結果( m/d/yyyy かつ文字列)となります。 なにがいけないのでしょうか??? Sub Macro4() ' ' Macro4 Macro ' マクロ記録日 : 2008/10/31 ユーザー名 : MerlionXX Range("G10").Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="11/1/2008,11/5/2008,11/30/2008" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "指定日" .InputMessage = "" .ErrorMessage = "リストの中から選んでね。" .IMEMode = xlIMEModeDisable .ShowInput = True .ShowError = True End With End Sub

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは^^ Formula1 に指定する文字列の先頭に ひとつ、","を付け加えると解決する筈です。 (必要なら、セルを.Clearしてから実行してみてください) (書式の表示形式は標準のままでも既定の日付表示になる筈) 随分前から、そういうものとして身に付いてしまっているので、 何故そうするのか、は、残念ながら、 今となっては私にはわかりません。すみません。 .Modifyでリストだけ変更する場合も同様です。 たぶん、同じ質問について考えたのだと思います(^^; 私はたぶん、スルーです。 では、また

merlionXX
質問者

お礼

さっそくありがとうございました。 試したところ、おっしゃる通りでした。 でも、なんででしょうね、不思議です。

その他の回答 (2)

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

こんばんは。 余計なことかもしれませんが、最近、同じような設置のコードを書いたばかりです。しかし、私は、そのようなコードを考えたことがありません。 VBAの原則として、「ワークシートはワークシートに任せる」というのがあります。 (誰の原則論とか、突っ込みはしないでくださいね。) VBAとワークシートは完全には一致してきません。 たぶん、Formula1 には、ローカルモードがないのか、セルとの結びつきがないのだと思います。それでは、実用度が低いのではないでしょうか。固定値なら良いのですが、日付の場合は、元々変動しますから、マクロでは、こういう場合、設置しにくいように思うのです。 >日付ではなくなんと文字列になってしまう それに、おっしゃっているように、その入力規則のセルには、日付認識(シリアル値)をしていません。 ですから、私が最近書いた方法は、 予め、AA1:AA3 に日付を書いておいて、以下のようにします。 =TODAY() =WORKDAY(TODAY(),10) =WORKDAY(TODAY(),20) Formula1:="=" & Range("AA1:AA3").Address のような数式を入れます。それを入力規則のリストに入れます。

merlionXX
質問者

お礼

Wendy02さん、いつもありがとうございます。 「ワークシートはワークシートに任せる」という原則ですか。 勉強になります。 ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

補足です。 Formula1:=",2008/11/1,2008/11/5,2008/11/30" (既定がyyyy/m/dの場合) ってことです。失礼。

merlionXX
質問者

お礼

ご丁寧にありがとうございます。 m/d/yyyyの場合は、 Formula1:=",11/12008,11/5/2008,11/30/2008" ではだめのようです。 不思議です。

関連するQ&A

  • エクセル入力規則のマクロについての質問です。

    エクセル入力規則のマクロについての質問です。  excel2003 os=WindowsXP の環境です。  E列の10行目から57行目、I列の10行目から60行目に1から9999までの数字のみ入力可能の条件を設定しようと下記のプログラムを作ったのですが、全く動いてくれません。ご教授のほどよろしくお願いします。  Private Sub Worksheet_Activate() Range("e10:e48").Select With Selection.Validation .Delete .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="0", Formula2:="9999" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "入力制限があります" .InputMessage = "" .ErrorMessage = "登録は9999までしか登録できません。9999以下のの数字を入力下さい。" .IMEMode = xlIMEModeAlpha .ShowInput = True .ShowError = True End With Range("i10:i60").Select With Selection.Validation .Delete .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="0", Formula2:="9999" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "入力制限があります。" .InputMessage = "" .ErrorMessage = "登録は9999までしか登録できません。9999以下のの数字を入力下さい。" .IMEMode = xlIMEModeAlpha .ShowInput = True .ShowError = True End With End Sub

  • エクセル2010で入力規則をVBAで記述

    エクセル2010で入力規則をVBAで記述したいです。 まずは、マクロの自動記録すると以下のコードが保存できました。 Selectionをrange("A1")に変更したのですが、エラーが出てきました。 With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="東京,ニューヨーク" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True End With 調べると Operator:=xlBetweenではなくて、Operator:=xlEqualだと思うのですが、 それでもだめでした。

  • マクロで入力規則の他の設定を残しIME制御のみ変更

    お世話になります。 Excel2013を使用しています。 今マクロで、選択したセルの入力規則にIME制御(On/OFF)をセットするマクロを作成したいと考えております。 最初、自動記録したものをそのまま保存して使っていましたが、 それを利用すると、選択したセルの入力規則の他のルールまで上書きされてしまっていることに気づきました。 具体的には、たとえば、入力規則の「入力値の種類」を「リスト」にして、値を「東京,大阪,名古屋」に設定し、この3種類をプルダウンリストから選べるようにしていたセルに上記のマクロを実行すると、IMEの自動切り替えはうまく変わっていたのですが、 入力値の種類で「リスト」にしていた設定までもが「すべての値」に上書きされてしまっていました。 自動記録したマクロでは、 With Selection.Validation .Delete .Add Type:=tp, AlertStyle:=xlValidAlertStop, Operator _ :=xlBetween .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .IMEMode = xlIMEModeHiragana ・・・(1) .ShowInput = True .ShowError = True End With となっていましたので、(1)以外の他の部分が余計なのかと思い、 Selection.Validation.IMEMode = xlIMEModeHiragana としましたところ、エラーが発生していました。 そこで、いろいろ調べて With Selection.Validation .Delete .Add Type:=xlValidateInputOnly .IMEMode = xlIMEModeHiragana End With としてみましたが、やはり「入力値の種類」が「すべての値」おに書き換わってしまっていました。 恐らく.Deleteのところで「リスト」の設定が一旦クリアされているように思うので、そこを消したいのですが、消すと、どうやら.Deleteがないといけないらしくエラーが発生してしまいます。 「入力値の種類」を「リスト」のまま残しつつ、IME制御の設定だけをマクロから変更する このような場合のうまいやり方がございましたら、お教え願えますでしょうか。 よろしくお願い致します。

  • ExcelVBA2000で入力規則の設定

    こんにちは。 ExcelVBA2000を使用して入力規則を設定しようと思うのですが、エラーが発生してしまい困っています。 ”1004 アプリケーション定義またはオブジェクト定義のエラーです。” が発生します。 ↓マクロの保存で取得できた内容は With Selection.Validation .Delete .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=AND(A1=JIS(A1),LENB(A1)<=70)" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True End With なのですが、これを再び実行させようとすると、エラーが発生します。 ご存知の方いらっしゃいましたら宜しくお願い致します。

  • エクセルのマクロの手直し

    お世話になります。 以下はエクセルの入力規則(リスト)をマクロに記録したものです。(マクロ名はリスト) 下の例では、C列の33~44行にリストの項目が入力されています。 この $C$33:$C$44 の範囲を、C33~C列のうちデータが入力されている一番最後の行(行番号が最大) までとするにはどうすればいいのでしょうか。(先頭のC33は不変) ちなみにこのリストは数字だけでなく文字も含めて考えます。 いったん一番下の行番号を、影響のない他のセルに表示させてから、マクロに記録しても可。 Excel2000です。 よろしくお願いします。 Sub リスト() ' ' リスト Macro ' マクロ記録日 : 2002/7/23 ユーザー名 : ' ' Range("D51:D70").Select ActiveWindow.SmallScroll Down:=-9 With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=$C$33:$C$44" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True End With Range("C45").Select End Sub

  • Excelマクロで、入力規則のリストに既に定義された名前を入れたい

    入力規則のリストに、既に定義された名前を可変的に入れたいと考えています。 具体的には、以下のFormula1の中身を変数等を利用して、参照先を変化させたいのです。 .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop,Operator:=xlBetween, Formula1:="=$A$1:$A$10" 既に範囲に対して名前が定義されているので、それを利用する(というか利用しなければならない)制約があるのですが、単に文字列変数を入れるだけでは参照してくれないようです。 何かアイディアがあれば教えてください。

  • 入力規則 日付をリストのプルダウンで選択したい

    エクセルの入力規則をVBAでやる時に日付をリストのプルダウンで選択したいのですが Sub test() With Range("A1").Validation .Delete .Add Type:=xlValidateList, Formula1:="2014/1/1,2014/1/2" End With End Sub をすると、 1/1/2014 1/2/2014 にとプルダウン上で表示されてしまい、なおかつ文字列になってしまいます。 .Add Type:=xlValidateList, Formula1:=#1/1/2014# & "," & #1/2/2014# .Add Type:=xlValidateList, Formula1:=Format(#1/1/2014#, "yyyy/mm/dd") & "," & Format(#1/2/2014#, "yyyy/mm/dd") これでも同じでした。 2014/1/1 2014/1/2 と表示させるにはどうすればいいでしょう?

  • Excel VBA:エクセルのマクロで入力規則を設定する際のアラートの扱いがわからず困っています

    エクセルでINDIRECTを使った入力規則設定をマクロで行う際の、アラートの扱いがわからず困っており、お教えいただけると幸いです。 例えば、A列に日付、B列にその日付に行った都道府県名、C列にはB列で選択した都道府県に属する自治体名を入れる場合を考えます。 そのために、  ・北海道、青森、…という具合に都道府県名のリストに、あらかじめ『都道府県名』と言う名前をつけたものを作成しておく。  ・洞爺湖、阿寒湖、釧路、…という北海道の自治体名リストにあらかじめ『北海道』と言う名前をつけたものを作成しておく。  ・弘前、八戸、十和田、…という青森県の自治体名リストにあらかじめ『青森』と言う名前をつけたものを作成しておく。   :(以下同様) と言う準備をしたあと  -B列の入力規則ダイアログボックスで、入力値の種類を『リスト』、元の値として『=都道府県名』とすることでドロップダウンリストから都道府県名を選ぶことが出来ます。  -C列の入力規則ダイアログボックスで、入力値の種類を『リスト』、元の値として『=INDIRECT(B1)』とすることでドロップダウンリストから自治体名を選ぶことが出来ます。   C列の規則を設定する際にB列にまだ都道府県名が入っていない場合は『元の値はエラーと判断されます。続けますか?』と言うアラートが出ますがOKを押して続行。 とすれば、C列のドロップダウンリストでB列で選択した都道府県に属する自治体名が選べることになります ここまでは、教科書などにも書いてある内容なので問題はないのですが、これをマクロ化すると問題が発生します。 上記の入力規則の設定をマクロで記録し、実行すると  『実行時エラー'1004'.アプリケーション定義またはオブジェクト定義のエラーです。』 が発生します。エラーの起こっている場所はC列の入力規則定義部分の .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:="=INDIRECT(B1)" のようです。 B列に都道府県名が入った状態ではエラーとはならないので、マクロ記録時に『元の値はエラーと判断されます。続けますか?』が出てOKとした部分が 何らかの問題となっているとは思うのですが、対処方法がわからずに困っております。 ちなみに、On Error Resume Nextを入れておいたとしても、エラーでマクロが中断されることはなくなりますが、入力規則の設定は行われないので対処方法にはなりません。 質問が長くなり恐縮です。 コピーペーストなどで入力規則の設定が消えてしまうことがあるので、ブックの立ち上げ時に入力規則の再定義をしたいと考え、このような質問となりました。 対処方法おわかりの方、ご教授いただけると大変助かります。 なお、環境はwindowsXP、excel2003です。 よろしくお願いいたします。

  • 一つの列に2つの入力規則を使いたい。

    B列にはプルダウンで選択するために入力規則で、リストで名前定義を使っているのですが、 また 「そのB列に隣接するA列のセルに何か入力されてないと、 B列に入力できない」 「=入力規則のユーザー設定、COUNTA(A1)=1」 とういう2つのことをしたいです。 でも、入力規則は1つしか出来ないですよね? こうゆう場合はどうすればいいのでしょうか? マクロでしょうか? よろしくお願い致します。

  • マクロ 入力規則は残し文字のみ削除

    A2:G50まで文字が入力されており、そのうちD2:E50まで入力規則も 設定しています。 マクロを実行した時、A2:G50の文字のみ削除したいのですが、  Range("A2:G50").Select  Selection.ClearContents とすると入力規則まで消えてしまいます。 入力規則だけ残すにはどの様にすれば良いのでしょうか?

専門家に質問してみよう