質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

81518閲覧

VBA ある列に何か入力すると他の列に自動的に今日の日付を載せる

syosinsyapurogu

総合スコア64

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

1クリップ

投稿2016/10/28 05:04

編集2016/10/28 08:47

いつもお世話になっております。

VBAのことでは初めて質問させていただきます。なので初歩すぎて呆れるとなるかもしれませんがご了承ください。

私はVBAを触ったことが一度もないのですが、上司の無茶ぶりによりやらされるはめになりました。

今回実装したい機能が三つあるらしく「D列に何か入力されたらH列に今日の日付を載せる」と「E列が変更されたらC列の次の行に移動する」と「エンターキーを押したらカーソルを右に移動」です。エンターキーを押したらカーソルを右に移動ってコードかかなくてもエクセルの元からの機能で右にいきませか?ちゃんとコードを書いた方がよろしいのでしょうか?

D列に何か入力されたらH列に今日の日付を載せる

Private Sub Worksheet_Change(ByVal Target As Range) With Target If Application.Intersect(Range("D4:D10000"), Target) Is Nothing Then Exit Sub If .Count > 1 Then Exit Sub If IsEmpty(.Value) Then .Offset(, 1).ClearContents Else .Offset(, 4).Value = Date End If End With End Sub

E列が変更されたらC列の次の行に移動する

Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 5 'E列が変更されたら---(3) Cells(Target.Row + 1, 3).Select 'C列の次の行に移動する---(4) Case Else End Select End Sub

エンターキーを押したらカーソルを右に移動

Private Sub Workbook_Activate() Application.MoveAfterReturn = True Application.MoveAfterReturnDirection = xlToRight End Sub

上記コードを標準モジュールで書き込み実行してみたのですが、
イメージ説明
このようにコードが実行されず変なウィンドウだけが表示されます。

私のコードはまちがっているのでしょうか?
この機能が載っているサイトなどを教えて頂けても嬉しいです。

どうかご教授お願い致します。

※コードを全てsheet1に書きました。
イメージ説明
そのあと触っていると、下記状態になりました。
イメージ説明

satauki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2016/10/28 05:11

掲載したコードでは問題があるのですか?問題があるならそれを書いた方がよいです。添削をしてほしいというなら、このサイトの趣旨と違ってきてしまいますが、親切な人は答えてくれるでしょう。
syosinsyapurogu

2016/10/28 05:41

ttyp03さん、いつもお世話になっております。修正させていただきました。
coco_bauer

2016/10/28 07:02

Worksheet_ChangeやWorkbook_Activateは、ワークシートのセルが変更されたり、ワークシートがアクティベートされたりした時に自動的に呼び出されます。変なウィンドウは、マクロと関連付けられていないF5キーを押したために「どのマクロを呼び出して良いか判らないので、教えてよ」という意図で表示されたものです。
coco_bauer

2016/10/28 07:03

変なウィンドウは、プログラムに問題があるための表示されたものではありません。
syosinsyapurogu

2016/10/28 07:11

coco_bauerさん、Worksheet_ChangeとWorkbook_ActivateはF5を押して実行しなくてもいいんですね(-_-;)ありがとうございます。
guest

回答3

0

ベストアンサー

上司の無茶な要望に対し、これはできる・これはできない・これはできるけど制約がある、など的確に指摘できるような部下になれると格好いいですね。

①D列に何か入力されたらH列に今日の日付を載せる

こういうことをExcel上で行う場合、通常ならVBAではなくExcel関数で行う思います。

Worksheet_Changeはシート内で変更があるたびに発生するイベントです。
目的であるD列以外の変更でも都度発生し、対象の列ではないから今回はスキップ・・という判断を繰り返すことになります。
当然負荷の高い処理となりますので、避けられるなら避けるべきだと思います。

「H列のセルは未入力のまま使いたい」とか「Excel関数だとセルをいじって数式を替えられてしまうかもしれないからいやだ!」といった特別な理由がなければ、以下のようなExcel関数をH列に記述することも検討してみてください。

H1セル: =IF($D1="","",TODAY())

②E列が変更されたらC列の次の行に移動する

前述の通り、Worksheet_Changeはあまりオススメしたくないのですが、これは避けては通れない道かもしれません。

実装方法も間違っていないと思います。
ただ実際使ってみるとわかりますが、値を消して書き直そうとDELETEキーを押した場合でも次行に移動してしまいます。
ここらへんがうまいこと回避できなければ制約事項になりそうです。

あとD列の判定をVBAで行う場合はWorksheet_Change関数に両方の機能を載せる必要があります。

Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 4 'D列が変更されたら 'H列に日付を表示 If Target.Value = "" Then Cells(Target.Row, 8) = "" Else Cells(Target.Row, 8) = Format(Now(), "YYYY/MM/DD") End If Case 5 'E列が変更されたら Cells(Target.Row + 1, 3).Select 'C列の次の行に移動する Case Else End Select End Sub

③エンターキーを押したらカーソルを右に移動

他の方の指摘にもありますが、Excelのオプション設定を変更することで可能です。
記載されているコードもそのオプションを変更するものです。

ここで注意が必要なのが、「Excelのオプション設定」ということは、ほかのExcelブックを操作する場合にも影響してしまうということです。

対象シート以外では通常通りENTERで下に移動したいのであれば、以下のように記述したほうがいいかもしれません。

'シートがアクティブになった時の処理 Private Sub Worksheet_Activate() Application.MoveAfterReturn = True Application.MoveAfterReturnDirection = xlToRight '右に移動 End Sub 'シートがディアクティブになった時の処理 Private Sub Worksheet_Deactivate() Application.MoveAfterReturn = True Application.MoveAfterReturnDirection = xlDown '下に移動 End Sub

④マクロの実行に関して

今回作成したコードは、全てイベント処理です。
イベントの発生を受けて自動で動作するため、F5キー等で動作させる必要はありません。
ただし、コードは適切な位置に記述する必要があります。

・Workbook_Activateメソッド
これはブックがActiveになった場合に発生するイベント処理です。
コードの記載は、標準モジュールではなく、ThisWorkbookに記述しましょう。

複数のブックを切り替えるなどした時に自動で処理が開始されます。

・Worksheet_Changeメソッド
これはワークシート内で変更があった場合に発生するイベント処理です。
コードの記載は、標準モジュールではなく、目的のワークシート(Sheet1など)に記述しましょう。

シート内の変更を受けて自動で処理されます。

・Worksheet_Activate/Worksheet_Deactivate
私が③で提示したWorksheet_Activate/Worksheet_Deactivateもワークシートのイベントです。
使用する場合は目的のワークシートに記載してください。

シートがActive/非アクティブになったときにそれぞれ発生します。

投稿2016/10/28 06:15

編集2016/10/28 06:30
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syosinsyapurogu

2016/10/28 07:09

jawaさんご回答ありがとうございます。 上司に逆らうなんて絶対にできないです(..) 詳しく丁寧に書いていただき大変恐縮なのですが、 疑問に思ったことがありまして、 これらのコードを一つにまとめてモジュール内に書いてもよろしいのでしょうか? あと、ThisWorkbookってなんですか?(-_-;) 申し訳ないですが、宜しくお願い致します。
jawa

2016/10/28 08:11

上司は敵というわけではないので、逆らうのではなく指摘(報告)してあげるのですよ(^-^; 「この部分はできそうだけど、これはExcelの機能では厳しいです。」という感じです。 ThisWorkbookについてですが、 >コードを標準モジュールで書き込み実行してみた とのことですのでVBAの開発画面(VBEと呼ばれます)は起動できていますよね? (Excelのリボンメニュー「開発」タブから「VisualBasic」アイコンで起動します。) このVBE画面にプロジェクトエクスプローラというウィンドウが用意されています。 (非表示になっている場合は「表示」-「プロジェクトエクスプローラー」で表示できます。) プロジェクトエクスプローラーはブック毎のツリー表示になっています。 「VBAProject(ブック名)」の下に、「Microsoft Excel Objects」と「標準モジュール」というフォルダアイコンがぶら下がっていると思います。 標準モジュールにコード記載した際は、この「標準モジュール」の中の「Module1」などにコードを記載されたのではないかと思います。 シートやブックのイベントを記載する場合、「Microsoft Excel Objects」の中に各ブックに含まれるシートが並び、最後にThisWorkbookというのが表示されていると思います。 [⇒参考](https://sites.google.com/site/compositiosystemae/home/vbaworld/gatetovba/vbe/projectexplorer) この中からイベント処理を記述したいシートや、ブックの場合はThisWorkbookを開いて、その中にコードを記載してください。
syosinsyapurogu

2016/10/28 08:45

jawaさん 言えるようにがんばります(*_*) 大変丁寧に教えて頂き誠にありがとうございます。 おかげさまでちゃんと思った通りの動きをしてくれました!! っと思ったのですが後一点だけうまくいかないことがあって、 D列に何か入力したらH列に日付を表示するなのですが、 一行目は上手くいくんですけど、二行目いこうから「########」と表示されます(*_*) そのマスをダブルクリックして見たらちゃんと日付ははいってるんですけど。。。 申し訳ありませんが宜しくお願い致します(-_-;)
syosinsyapurogu

2016/10/28 09:05

jawaさん とても不思議な現象です。 なんとなく画面サイズを85%にしたら全部表示されました!!だけど85%以外だと「#######」になってしまいます。1行目はずっと表示されています。
jawa

2016/10/28 09:49

####表示となるのは、書式設定の形式で表示しようとしたけどセル幅に納まらない場合です。 正しく表示される行と####で表示される行で、書式設定に違いがないか確認してみてください。 ・フォントの種類 ・フォントサイズ ・セルの書式設定(日付形式'2016/10/28'など) どうしても正しく表示できない場合、正しく表示できるセルをコピーして、正しく表示できないセルに「書式設定の貼り付け」を行うと表示できるようになるかもしれません。 ご確認ください。
syosinsyapurogu

2016/10/31 00:40

無事解決できました! 大変丁寧に教えていただき誠にありがとうございました!
guest

0

いくつかアドバイス

D列に何か入力されたらH列に今日の日付を載せる

足らないとしたら、D列入力後に空欄にしたら日付を消すかどうかの処理ですね
今はそのままだと誰も消さないので残ります

E列が変更されたらC列の次の行に移動する

前述の「D列に何か入れたら~」の処理も Worksheet_Change を使っていましたのでぶつかります
Target が D列だったら、E列だったら、という感じに処理を分ければよさそうです

エンターキーを押したらカーソルを右に移動

このマクロを動かすエクセルを開いているとき、他のエクセルも開いたりしますか?
このままだとすべてのエクセルでカーソル移動が右になります

恐らくなにかの入力作業をするためのエクセルだけ、右移動させたいのでしょう
であれば Workbook_Deactivate を使って下移動に戻してあげましょう

エクセルの設定を使ってしまうとすべてのエクセル操作に影響してしまうので
それを望まないのであればマクロ対応しかないと思います

がんばってください


syosinsyapurogu さん、業務とはいえいきなりvbaプログラミングすることとなり大変ですね

このサイトを通して1から10までを説明し理解してもらうのはとても難しいと思います
ある程度はご自身で勉強し、せめて コントロール部品(ボタン)を置いて 記述したマクロ関数を割り当てて実行できる worksheet/workbook/モジュールの違いがわかる、といったころまでたどり着いた方が、今後このサイトで回答をもらうのもスムーズになると思います

勉強:例えばこんなサイトで
Excel VBA 入門講座
Excelでお仕事 VBA基本 ← こっちはVBA案件を請け負った時に大変お世話になったサイト

投稿2016/10/28 05:43

編集2016/10/28 07:54
takito

総合スコア3116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syosinsyapurogu

2016/10/28 06:06

takitoさん、初めましてお世話になります。 うーん、難しいそうです(*_*) 一番お聞きしたいのですが、コードを書いてF5を押して実行しても 質問の方に追加しました画像のウィンドウがでてきますこれって実行されてないってことですよね?汗
syosinsyapurogu

2016/10/28 09:00

takitoさん わざわざサイトを教えて頂いて申し訳ないです(-_-;)
guest

0

エンターキーを押したら右セルに移動ですが、
Excelのオプションを開いて詳細設定の箇所にEnterキーを押したら、セルを移動するに方向が指定できます。

投稿2016/10/28 05:16

MP430

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syosinsyapurogu

2016/10/28 05:41

やはりエクセルの設定で変えれるからVBAでわざわざ設定しなくてもいいみたいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問