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

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

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

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

Q&A

解決済

2回答

484閲覧

転記の簡素化とワークシートプロシージャの制御

kohan

総合スコア9

VBA

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

0グッド

0クリップ

投稿2020/10/25 13:23

編集2020/10/25 15:44

起こっている現象は、画像を更に追加しましたが、1列なら、そのまま数値を追記していってくれるのですが、
2行になると、なぜか、最後尾の5が分身してしまいます、、
教えていただいたとおりに、Targetを使ってみてると、いきなりは、分身しなくなりましたが、やはりある回数以上になると、こういう分身が起こります、、なぜでしょうか、、

イメージ説明イメージ説明

イメージ説明
イメージ説明
画像説明
下段の画像のワークシートに構文をworksheet_changeにて作っております。←計算表シート
その数値を上段のシートに転記しています。←出目回数シート
いつもお世話になっております。
worksheet change にて、以下の構文を回すと、数値の変化に合わせて、他の列も同時に転記してしまうという状況の解決方法で困っています。
数値が変化した個所のみを列に追記していくようにしたいのですが、selectionchangeにしても標準モジュールにして治りません、
また、今の自分ではこれ以上の簡素化することはできないですが、こういう複数分岐する場合にどのように簡素化できるのか、方法ってあるのでしょうか?もし差し支えなければご教授いただければ幸いです。

数値の変化とは、右辺のセルの数値が常に変化しており、その数値を左辺に転記しているのですが、他のセルの数値の一つにでも変化がああれば、左辺にすべての右辺が代入されるという状況です。。

Private Sub Worksheet_Change(ByVal Target As Range) Const maxcolumn = 39 ' 'Dim j As Long 'Dim n As Long 'Dim t As Long 'Dim lastrow As Long ' 'With Worksheets("出目回数") ' For j = 2 To maxcolumn ' lastrow = .Cells(Rows.Count, j).End(xlUp).Row ' n = lastrow + 1 ' If j = 3 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("D9").Value '1 ' If j = 4 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("D6").Value '2 ' If j = 5 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("D3").Value '3 ' If j = 6 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("E9").Value '4 ' If j = 7 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("E6").Value '5 ' If j = 8 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("E3").Value '6 ' If j = 9 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("F9").Value '7 ' If j = 10 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("F6").Value '8 ' If j = 11 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("F3").Value '9 ' If j = 12 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("G9").Value '10 ' If j = 13 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("G6").Value '11 ' If j = 14 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("G3").Value '12 ' If j = 15 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("H9").Value '13 ' If j = 16 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("H6").Value '14 ' If j = 17 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("H3").Value '15 ' If j = 18 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("I9").Value '16 ' If j = 19 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("I6").Value '17 ' If j = 20 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("I3").Value '18 ' If j = 21 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("J9").Value '19 ' If j = 22 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("J6").Value '20 ' If j = 23 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("J3").Value '21 ' If j = 24 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("K9").Value '22 ' If j = 25 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("K6").Value '23 ' If j = 26 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("K3").Value '24 ' If j = 27 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("L9").Value '25 ' If j = 28 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("L6").Value '26 ' If j = 29 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("L3").Value '27 ' If j = 30 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("M9").Value '28 ' If j = 31 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("M6").Value '29 ' If j = 32 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("M3").Value '30 ' If j = 33 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("N9").Value '31 ' If j = 34 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("N6").Value '32 ' If j = 35 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("N3").Value '33 ' If j = 36 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("O9").Value '34 ' If j = 37 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("O6").Value '35 ' If j = 38 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("O3").Value '36 ' If j = 39 Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("B3").Value '0 'Next 'End With ![![イメージ説明](c171146cfabedf143323ca7297da886f.png)](cea8886a94d901e16163401274982853.png) コード

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

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

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

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

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

meg_

2020/10/25 14:09

仕様がよく分からないので、シートイメージを画像で追加してもらえませんか?
kohan

2020/10/25 14:14

はい。では、イメージ画像を追加いたしますね。
meg_

2020/10/25 14:29

・どっちの画像がどっちのシートですか? ・Worksheet_Change()はどっちのシートに設定してあるんですか?
kohan

2020/10/25 14:36

失礼いたしました。説明補足いたします。
meg_

2020/10/25 14:41

Private Sub Worksheet_Change(ByVal Target As Range) の「Target」が値が変わったセルとなります。 > 数値が変化した個所のみを列に追記していくようにしたい とのことなので、この「Target」セルの値(Target.Value)を転記すれば所望の動作になるのではないでしょうか?
kohan

2020/10/25 15:00

具体的な例としては、以下のように修正すれば数値が変化した個所のみを転記するということで解釈は間違っていませんか? If j = 3 And Target=Worksheets("計算表").Range("D9").Value Then Worksheets("出目回数").Cells(n, j) = Worksheets("計算表").Range("D9").Value
meg_

2020/10/25 15:22

Worksheets("計算表").Range("D9")の値が変わったときに、このセルの値をどこにコピーしたいのですか?
kohan

2020/10/25 15:25

Worksheets("出目回数").Cells(n, j) でIf j = 3 なので、3列目の最後尾にコピーしたいです。
guest

回答2

0

ベストアンサー

下記は「D9」セルの例です。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3 If Target.Address = "$D$9" Then 4 With Worksheets("出目回数") 5 .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 1, 3).Value = Target.Value 6 End With 7 End If 8 9End Sub

また、今の自分ではこれ以上の簡素化することはできないですが、こういう複数分岐する場合にどのように簡素化できるのか、方法ってあるのでしょうか?

これについては転記元のアドレスから転記先のアドレスが計算で決まれば簡潔に記述することはできますが、関連がなくバラバラであれば出来ないでしょう。

投稿2020/10/25 15:45

編集2020/10/25 15:50
meg_

総合スコア10760

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

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

kohan

2020/10/26 09:33

すごいですね。。。。脱帽です、、よろしければ、解法(式の立て方)を教えてくださいませんか?
guest

0

また、今の自分ではこれ以上の簡素化することはできないですが、こういう複数分岐する場合にどのように簡素化できるのか、方法ってあるのでしょうか?

今回の場合ですと、Targetの情報より、jの値を以下のように計算できます。

VBA

1 r = Target.Row 2 c = Target.Column 3 4 j = (c - 3) * 3 + 3 - r / 3 5

ですので、Ifの連続のところは

VBA

1 r = Target.Row 2 c = Target.Column 3 4 j = (c - 3) * 3 + 3 - r / 3 5 6  Worksheets("出目回数").Cells(n, j) = Target.Value 7

のように簡略化できますね。

投稿2020/10/26 07:45

Usirow

総合スコア364

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問