• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXEL VBA で入力規則を変更するには)

EXEL VBAで入力規則を変更する方法

このQ&Aのポイント
  • EXEL VBAを使用して、入力規則を変更する方法を学びたいです。
  • 現在、去年のデータの入力作業をしていますが、年月日を入力する際に特定の形式で入力しなければなりません。
  • VBAを使用して、セルに既に入力されている年と日付を使って、簡単に日付を入力する方法を知りたいです。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.9

#6です。 #7の補足は両方とも、 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) #8の補足は、 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) と Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 前者は選択セル変化、後者はセルの値変化ですので、異なるイベントプロシージャです。ご確認下さい。

kyon0512
質問者

お礼

あーなるほど、そういう事ですね、わかりました。 本当にありがとうございました。

その他の回答 (8)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.8

#6です 「途中でやめたくなった時」というのは、#6の例で言うとA3:A300の範囲で入力していて、最後まで入力せずに別の場所に移動したとき、記入しかけの"2010/"が残ってしまうため、その対策という意味です。そういう趣旨でも動いていないでしょうか? 補足のコードをみると、入力後のセル移動方向を「右」に設定されている様な気もしますので、その場合は対策不要です。 #7の補足に対してですが、同じイベントプロシージャを2個置く事はできませんので、一つにまとめて、中で条件分岐する必要があります。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents = False If Not Intersect(Target, Sh.Range("C7:E299")) Is Nothing Then SendKeys "%{DOWN}" Else If Not Intersect(Target, Sh.Range("B7:B299")) Is Nothing Then If Target.Value = "" Then Target.Value = "2010/" Application.SendKeys "{f2}" End If End If End If Application.EnableEvents = True End Sub なお、Alt+↓を積極的に使う方法は勉強になりました。

kyon0512
質問者

補足

解答ありがとうございます。 なるほど、Elseで分岐させればよいのですね、 でも下記はNO.5さんの解答なのですが、同じイベントプロシージャを2個置いてこれで動くのですが? Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Not Intersect(Target, Range("C7:E299")) Is Nothing Then SendKeys "%{DOWN}" End If End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents = False With Target If .Column = 2 And IsDate(.Value) Then .Value = DateSerial(Year(.Value) - 1, Month(.Value), Day(.Value)) .NumberFormatLocal = "yyyy/m/d;@" End If End With Application.EnableEvents = True End Sub すみません、宜しくご回答お願いします。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.7

#6です。 Intersect(Target, Target.Parent.Range("A3:A300")) なんて事をしないで、 Intersect(Target, Sh.Range("A3:A300")) でOKでした。意味は一緒ですが... ThisWorkbookモジュールをあまり使わないことが露呈してしまいました。

kyon0512
質問者

お礼

それから、現在下記1.を入れていてその下に教えていただいた2.を入れるとコンパイルエラー、名前が適切ではないと出ます。 1.だけとか2.だけなら動きます。 PrivateSub  End Subでひとつにしても駄目なのですが、何か制約があるのですね。 済みません、お手数ですが宜しくお願いします。 1.Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Not Intersect(Target, Range("C7:E299")) Is Nothing Then SendKeys "%{DOWN}" End If End Sub 2.Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Target.Parent.Range("B7:B299")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "" Then Target.Value = "2010/" Application.SendKeys "{f2}" End If Application.EnableEvents = True End Sub

kyon0512
質問者

補足

下の[If Target.Value = "2010/" Then”] を上の[If Target.Value = "" Then Target.Value = "2010/"] にしてやると動きますが? と書きましたがやはり動きませんね? '下記は途中でやめたくなったとき、"2010/"というゴミが残らない様にするため Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Target.Parent.Range("A3:A300")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "2010/" Then Target.ClearContents End If Application.EnableEvents = True End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.6

こんなので如何でしょうか。ThisWorkbookモジュールに記述します。ご参考まで。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Target.Parent.Range("A3:A300")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "" Then Target.Value = "2010/" Application.SendKeys "{f2}" End If Application.EnableEvents = True End Sub '下記は途中でやめたくなったとき、"2010/"というゴミが残らない様にするため Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Target.Parent.Range("A3:A300")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "2010/" Then Target.ClearContents End If Application.EnableEvents = True End Sub

kyon0512
質問者

補足

大変ありがとうございます。 皆さんこんなのをすらすらと思いつくのですから、ホントに凄いですね。 それで上は動きますね、下は動かない様なのですが? 下の[If Target.Value = "2010/" Then”] を上の[If Target.Value = "" Then Target.Value = "2010/"] にしてやると動きますが? それから途中でやめたくなった時と言うのはどういう意味なのでしょう? ゴミが残らない様にするためと? 宜しくお願いします。

noname#187541
noname#187541
回答No.5

No.3です。 私が提示したマクロでは、すべてのセルで日付を入力すれば2010年になるようにしています。 A列のみで行いたいということであれば If IsDate(.Value) Then を If .Column = 1 And IsDate(.Value) Then としてください。 要するに、ここの部分で入力した内容やセル番地(今回は列のみ)を判断しています。

kyon0512
質問者

お礼

お世話になりました。 M-SOFTさんの解答もすばらしかったのですが、もう一人の方のは セル上で2010/と勝手に出てくれたのですみませんが、あちらに20P差し上げました。 ありがとうございました。

kyon0512
質問者

補足

解答大変ありがとうございます。 出来ました。 意味はわかりませんが、これを基に勉強したいと思います。 ほんとうにありがとうございました。

回答No.4

>A3のセルにきたら"2010/"が既にはいっており、 >続けて"4/1"とか"4/28"とか日付だけを入力すればよいように A3セルまたはセル範囲に 2010/ で[Ctrl]+[Enter] 入力するときは [F2]キーを押してから入力する >2年分、24シート、1シート300行くらいありますので、 もう入力済みなの? 質問と異なる。。。 同形のシートだとして対象シートをすべて選び、 対象の列(行)を選択する。 [Ctrl]+[H]置換 2011/ → 2010/ [すべて置換]

kyon0512
質問者

補足

解答ありがとうございます ちょっと、意味が??? まだ2ヶ月分しか入力はしていません。 それとやはり2010/8/9の日付として入れて、このデータも使用したいので ちょっと、意図とは違うようです。 せっかく解答いただいてすみません。

noname#187541
noname#187541
回答No.3

こんにちは。 VBAを使っても「入力規則」では無理。 「2010年で入力する」ではなくて「入力した日付を2010年にする」とします。 具体的には、シートのChangeイベントを使います。すべてのシートであれば、ThisWorkbookのSheetChangeイベントを使います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  Application.EnableEvents = False  With Target   If IsDate(.Value) Then      .Value = DateSerial(Year(.Value) - 1, Month(.Value), Day(.Value))      .NumberFormatLocal = "yyyy/m/d;@"   End If  End With  Application.EnableEvents = True End Sub どうでしょうか。

kyon0512
質問者

お礼

大変大変、ありがとうございます。 そうですね、出来てますね。さすがですね、しかしどのセルも全部2010/**/**となってしまいます。 例えばA列を指定するには”Range("A2,A300").Selectこれでいいのでしょうか?”を入れたらよいんですよね? Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents = False With Target If IsDate(.Value) Then .Range("A2,A300").Select .Value = DateSerial(Year(.Value) - 1, Month(.Value), Day(.Value)) .NumberFormatLocal = "yyyy/m/d;@" End If End With Application.EnableEvents = True End Sub と色々入れてみますが、出来ません。 よろしくお願いします

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

去年のデータを入力するためだけに、わざわざVBAを設定することもないと思います。 このようなケースで最も簡便な操作方法は、すべてのセルに「4/1」のように入力してひとまず今年の日付として入力し、最後に、空白セルに「365」と入力して右クリック「コピー」、昨年の日付にしたいセルを(Ctrlキーを押しながらすべて)選択し、右クリック「形式を選択して貼り付け」で「減算」してください。

kyon0512
質問者

補足

VBAにすると何行にもなり、かなりややこしいでしょうか? 7行か8行のモジュールで出来るならThisWorkbookで指定してやれば良いかと。 2年分、24シート、1シート300行くらいありますので、簡単に出来るのでしたら VBAの方が良いかと思いまして。 リストボックスでマウスで▼をクリックしなくても表示されるのを教えて頂きましたが 凄く便利で、重宝してますし、24シートコピーして減産してって作業はチョット・・・。 せっかく解答していただいたのにすみません。 宜しくお願いします。

  • mks1902
  • ベストアンサー率40% (11/27)
回答No.1

BVAじゃないですが DATE関数で出来ます セルB3に年号 セルC3に月 セルD3に日 =DATE(B3,C3,D3)

kyon0512
質問者

お礼

解答ありがとうございます。 セルが3つに分割されるのはチョット、具合悪いです。