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

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

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

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

Q&A

解決済

1回答

1436閲覧

VBA ある列にenterを押すと、別の列の値を表示する

freia

総合スコア4

VBA

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

0グッド

0クリップ

投稿2021/04/05 01:48

いつもお世話になっております。
excelで下記のことをしたいと思います。やり方を教えていただけますでしょうか?

F3にenterを押すと、D3の値をF3に表示します。
同じくF4にenterを押すと、D4の値をF4に表示します。
これはF10 からF140まであります。
同じく、N列にenterを押すと、L列の値を表示します。

excelのVerは excel 2016

どうかよろしくお願いします。

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

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

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

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

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

K_3578

2021/04/05 02:12

まずVBAなのかExcelなのかはっきりしましょうよ。 そんでもって内容が何一つ具体的に示されてない。下記ヘルプ読んで質問見直してみて下さい。 https://teratail.com/help/question-tips
guest

回答1

0

ベストアンサー

こんにちは。

以下の手順で可能です。

    1. Enterキーの入力を感知
    1. 今選択されているセルを取得
    1. F10〜F140のいずれかであれば
    1. D列の値をF列に転記する

1. Enterキーの入力を感知

Application.Onkeyメソッドを使用することで、特定のキーが入力されたことを感知できます。
参考

注意点

Application.OnKeyは他のシートを開いていても反応してしまうため、
対象のシートが表示されたときにマクロを登録し、対象のシート以外が表示されたときにマクロを解除する…という手法がよく使われるようです。

シートモジュール(シート名はSheet1とします)

VBA

1'Sheet1が表示されたときに実行 2'EnterキーにOnKeyプロシージャを紐づける 3Public Sub Worksheet_Activate 4 Application.OnKey "~", "Sheet1.OnKey" 5End Sub 6 7'Sheet1以外が表示されたときに実行 8'EnterキーへのOnKeyプロシージャの紐づけを削除する 9Private Sub Worksheet_Deactivate 10 Application.OnKey "~" 11End Sub 12 13Private Sub OnKey 14 '色々な処理 15End Sub

ブックモジュール

VBA

1'Sheet1が表示されたときに実行されるプロシージャを、ブックを読込時にも無理やり実行する 2Private Sub Workbook_Open() 3 Call Sheets("Sheet1").Worksheet_Activate 4End Sub

2. 今選択されているセルを取得

ActiveCellプロパティでアクティブセル(現在選択されているセル)の情報を取得出来ます。
参考

3. F10〜F140のいずれかであれば

ActiveCell.Addressプロパティでアクティブセルの位置情報を取得出来ます。

ActiveCell.Address.Rowプロパティ…行番号を取得

今回の場合は、この値が10〜140の範囲にあれば良いですね。
If文を使って、条件式を書いてみて下さい。

ActiveCell.Address.Columnプロパティ…列番号を取得

今回の場合はF列で、Aが1、Bが2、…ときてFが6ですから、この値が6であれば良いですね。
これも同様に、If文を使って条件式を書いてみて下さい。

4. D列の値をF列に転記する

特定のセルの値は Range(v(行番号, 列番号)).Value で取得出来ます。
例えばセルD10の値を取得したければ Range(v(4, 10)).Value になりますが、今回は行番号が変動します。どう書けば良いでしょうか?考えてみて下さい。

セルの値の設定については、先程出てきたValueプロパティに代入すればOKです。
例えばF1の値を「hoge」にしたければ Range(v(6, 1)).Value = "hoge" となります。
同様にこれもどう書けば良いか考えてみて下さい。

投稿2021/04/05 02:11

編集2021/04/05 08:20
Automatic9045

総合スコア313

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

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

freia

2021/04/05 04:37

参考ページを参考し、下記の手順の①ができました。 Application.OnkeyメソッドでEnterキーの入力を感知 手順2、3はどうしたらいいでしょうか?教えた頂けますでしょうか? 今選択されているセルを取得し、F10〜F140のいずれかであれば D列の値をF列に転記する
freia

2021/04/05 06:57

下記のコードを試しに書きました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) = "F" & Target.Row Then If Range("F" & Target.Row) = "2" Then Range("F" & Target.Row) = Range("D" & Target.Row) End If End Sub 上記のコードの中で、If Range("F" & Target.Row) = "2" Then Range("F" & Target.Row) = Range("D" & Target.Row)  2を入力すると、Dの値をFに入力されます。 2のところはenterキーに代わりたいです。enterキーを押すと、Dの値をFに入力されます。 上記のコードでは無理でしょうか? VBAの素人なので、ご理解して頂けたらと思います。 どうかよろしくお願いします。
Automatic9045

2021/04/05 07:48

Worksheet_Changeプロージャではセルをダブルクリックするなどして編集状態にした場合でしか反応しませんが、要件に適合しますか? 編集状態であるかに関わらずセル上でEnterキーを押したら発火するようにするには、Application.OnKeyを利用する必要があります。 Application.OnKeyに関する注意点を追記しておきます。
freia

2021/04/06 00:13

おはようございます。 丁寧に回答をしていただきどうもありがとうございました。感謝を申し上げます。 下記のコードを書きました。 Public Sub Worksheet_Active() Application.Onkey "~", "採点用紙.Onkey" End Sub Public Sub Worksheet_Deactive() Application.Onkey "~" End Sub Private Sub Onkey() Dim Row As Integer Dim Col As Integer Row = ActiveCell.Row Col = ActiveCell.Column If Col = "6" Then Range("F" & Row) = Range("D" & Row) If Col = "14" Then Range("N" & Row) = Range("L" & Row) If Col = "22" Then Range("V" & Row) = Range("T" & Row) If Col = "30" Then Range("AD" & Row) = Range("AB" & Row) End Sub 思うように動作ができましたが、ファイルを保存し、開きなおしたら動かなくなりました。 ファイルはxlsmとして保存しています。 マクロのセキュリティは「警告を表示してすべてのマクロを無効にする」に設定しています。 どこを直したらいいでしょうか? 教えていただけますでしょうか?どうかよろしくお願いします。
freia

2021/04/06 01:31

おはようございます。 コードを下記のように変えました。 Public Sub Worksheet_Active() Application.Onkey "~", "sheet1.Onkey" End Sub Public Sub Worksheet_Deactive() Application.Onkey "~" End Sub Private Sub Onkey() Dim Row As Integer Dim Col As Integer Row = ActiveCell.Row Col = ActiveCell.Column If Col = "6" Then Range("F" & Row) = Range("D" & Row) If Col = "14" Then Range("N" & Row) = Range("L" & Row) If Col = "22" Then Range("V" & Row) = Range("T" & Row) If Col = "30" Then Range("AD" & Row) = Range("AB" & Row) End Sub 思うように動作ができました。ただし、マクロを押して、Sheet1.Worksheet_Activeの実行を押さないかぎり動作しません。 マクロを押さなくても動作したいんです。 どう修正したらいいでしょうか? 教えていただけますでしょうか?どうかよろしくお願いいたします。
Automatic9045

2021/04/06 07:58 編集

ワークブックのオープン時(Workbook_Open)、Sheet1.Worksheet_Activateを実行するようにすれば良いです。 ブックモジュールからシートモジュールを呼び出すことになるので、Sheet1.Worksheet_ActivateをPrivateからPublicに変えるのをお忘れずに。 追記:質問者さんもSheet1.Worksheet_ActivateをSheet1.Worksheet_Activeとtypoしていませんか?実際のコードが合っていれば良いのですが、一応確認です。
Usirow

2021/04/06 07:55

横からすみません。Worksheet_Activeではなく、Worksheet_Activateではないでしょうか?
Automatic9045

2021/04/06 07:57

本当だ。スマホで打っていたのでtypoしました。修正しておきます、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問