[[20240329112223]] 『VBA 新たに入力されたデータのみ代入』(1250) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『VBA 新たに入力されたデータのみ代入』(1250)

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

入力シートに入力された新たなデータのみをデータ一覧に反映させたいです。

<入力>

  A   B   C    D    E   F    G
1 日付 種類1 種類2  種類3  名前1  名前2 名前3
2 4/1  ○○  ▲▼  □   S藤   Y田
3 4/1  ▲▼          S藤
4 4/3  □◆  ○○  ☆☆  Y田   S木  K島
5 4/4  ☆☆  ○○      S木   K島


<データ一覧>

  A   B   C
1 日付 名前  種類
2 4/1  S藤  ○○
3 4/1  S藤  ▲▼
4 4/1  S藤  □
5 4/1  Y田  ○○
6 4/1  Y田  ▲▼
7 4/1  Y田  □
8 4/1  S藤  ▲▼
9 4/3  S藤  □◆

下記のVBAを作成しましたが一番下(最新行)のデータではなく途中のデータが反映されてしまいました。

Sub test()

    Dim lastrow As Long
        lastrow = Worksheets("データ一覧").Cells(Rows.Count, 1).End(xlUp).Row

    '入力データをデータ一覧に代入
    Worksheets("データ一覧").Cells(lastrow + 1, 1) = Worksheets("入力").Cells(lastrow + 1, 1)  '日付
    Worksheets("データ一覧").Cells(lastrow + 1, 2) = Worksheets("入力").Cells(lastrow + 1, 5)  '名前1
    Worksheets("データ一覧").Cells(lastrow + 1, 2) = Worksheets("入力").Cells(lastrow + 1, 6)  '名前2
    Worksheets("データ一覧").Cells(lastrow + 1, 2) = Worksheets("入力").Cells(lastrow + 1, 7)  '名前3
    Worksheets("データ一覧").Cells(lastrow + 1, 3) = Worksheets("入力").Cells(lastrow + 1, 2)  '種類1
    Worksheets("データ一覧").Cells(lastrow + 1, 3) = Worksheets("入力").Cells(lastrow + 1, 3)  '種類2
    Worksheets("データ一覧").Cells(lastrow + 1, 3) = Worksheets("入力").Cells(lastrow + 1, 4)  '種類3

End Sub

ご教示のほどよろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 [データ一覧]シートと[入力]シートで最終行の位置が違えばそうなるかもしれませんね
 [データ一覧]シートの最終行と、[入力]シートの最終行は、それぞれ別に取得しましょう

 また、[入力]シートの最終行の1行下を参照してもそこは空白のハズなので、何も書き込まれないと思います。
(´・ω・`) 2024/03/29(金) 16:12:44

おそらく以下の4つのイメージが不明なので誰もコメントしようもないのでしょう。
1.新たなデータが入力される前の入力シートのイメージ
2.新たなデータが入力された後の入力シートのイメージ
3.新たなデータが反映される前のデータ一覧のイメージ
4.新たなデータが反映された後のデータ一覧のイメージ

(mm) 2024/04/01(月) 13:11:45


(´・ω・`)様、mm様

返信が遅くなり申し訳ございません。
体調を崩しており確認できておりませんでした。

教えていただいたことを確認しまた返信いたします。
取り急ぎお礼申し上げます。

(1250) 2024/04/02(火) 11:23:03


既に指摘があるように、【新たに入力されたデータ】というのがどれなのか、どのようにすれば特定できるのかが提示されてないのでコメントしづらいですが、発想を変えてその都度【データ一覧】を更新するというのはダメなんでしょうか?

その際、1セルずつ書き込みをするとデータ量によっては時間がかかってしまうので、下記のように配列にデータを集めておいて【一気に書き込む】ことを考えてみてもよいかもしれません。

    Sub 研究用()
        Dim buf As Long, 行 As Long, i As Long, 種類列 As Long, 名前列 As Long
        Dim 配列() As Variant

        With Worksheets("入力")
            For 行 = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
                buf = buf _
                    + WorksheetFunction.CountA(Intersect(.Rows(行), .Range("B:D"))) _
                    * WorksheetFunction.CountA(Intersect(.Rows(行), .Range("E:G")))
            Next 行

            ReDim 配列(buf - 1, 2)

            For 行 = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
                For 種類列 = 2 To 4
                    For 名前列 = 5 To 7
                        If .Cells(行, 種類列).Value <> "" And .Cells(行, 名前列).Value <> "" Then
                            配列(i, 0) = .Cells(行, "A").Value
                            配列(i, 1) = .Cells(行, 種類列).Value
                            配列(i, 2) = .Cells(行, 名前列).Value
                            i = i + 1
                        End If
                    Next 名前列
                Next 種類列
            Next 行
        End With

        With Worksheets("データ一覧")
            .Range("A2:C" & .Rows.Count).ClearContents
            .Range("A2:C2").Resize(UBound(配列) + 1).Value = 配列
        End With
    End Sub

 ※上記は説明用の提示であり、完成品プレゼントの意図はありません。
 ※採用される場合は、【ステップ実行】等により研究の上、理解納得してから必要な部分のみ
  ご自身のコードに組み込んでください。

(もこな2) 2024/04/02(火) 22:30:32


(´・ω・`)様

説明不足の質問に答えていただきありがとうございました<m(__)m>

mm様

ご指摘ありがとうございます。

<入力シート>
  A   B   C    D    E   F    G
1 日付 種類1 種類2  種類3  名前1  名前2 名前3
2 4/1  ○○  ▲▼  □   S藤   Y田
3 4/1  ▲▼          S藤
4 4/3  □◆  ○○  ☆☆  Y田   S木  K島

4行目までは既に入力されています。

5 4/4  ☆☆  ○○      S木   K島
5行目(4/4のデータ)を入力しマクロを実行するとデータ一覧シートの最終行に追加したいです。

<データ一覧シート>
  A   B   C

 1 日付 名前  種類
 2 4/1  S藤  ○○
 3 4/1  S藤  ▲▼
 4 4/1  S藤  □
 5 4/1  Y田  ○○
 6 4/1  Y田  ▲▼
 7 4/1  Y田  □
 8 4/1  S藤  ▲▼
 9 4/3  Y田  □◆
10 4/3  Y田  ○○
11 4/3  Y田  ☆☆
12 4/3  S木  □◆
10 4/3  S木  ○○
11 4/3  S木  ☆☆
12 4/3  K島  □◆
13 4/3  K島  ○○
14 4/3  K島  ☆☆
15 4/4  S木  ☆☆
16 4/4  S木  ○○
17 4/4  K島  ☆☆
18 4/4  K島  ○○

14行目までは既に入力されておりマクロ実行で15〜18行目に追加したいです。

もこな2様

コメントありがとうございます。
その都度全て更新でも構いません。ただ数年分のデータがあります。
配列にデータを集めておいて【一気に書き込む】というのはどういうことでしょうか?

(1250) 2024/04/04(木) 16:21:39


 1行入力してマクロ実行という運用ということなら、

 Public Sub Test()
    Dim InputWS As Worksheet, ListWS As Worksheet
    Set InputWS = Worksheets("入力")
    Set ListWS = Worksheets("データ一覧")

    Dim InputNewRow As Long, OutputRow As Long
    InputNewRow = InputWS.Cells(Rows.Count, 1).End(xlUp).Row
    OutputRow = ListWS.Cells(Rows.Count, 1).End(xlUp).Row + 1

    Dim KCol As Long, NCol As Long, i As Long
    For KCol = 2 To 4
        If InputWS.Cells(InputNewRow, KCol).Value = "" Then Exit For
        For NCol = 5 To 7
            If InputWS.Cells(InputNewRow, NCol).Value = "" Then Exit For
            ListWS.Cells(OutputRow, 1) = InputWS.Cells(InputNewRow, "A").Value
            ListWS.Cells(OutputRow, 2) = InputWS.Cells(InputNewRow, KCol).Value
            ListWS.Cells(OutputRow, 3) = InputWS.Cells(InputNewRow, NCol).Value
            OutputRow = OutputRow + 1
        Next
    Next
 End Sub

(hatena) 2024/04/04(木) 18:00:48


既に解決していると思いますが何点か。

■1
>5行目(4/4のデータ)を入力しマクロを実行する
要は、(消されてしまいましたが)半平太さんが予測されたように【入力】シートの最終行を転記すれば良いわけですね。
それでは、(´・ω・`)さんのアドバイスは理解できましたか?

 それが理解出来たら解決する話のようにも思えますが・・・・

■2
>【一気に書き込む】というのはどういうことでしょうか?
提示したとおりです。

 .Range("A2:C2").Resize(UBound(配列) + 1).Value = 配列
 ↑で一気に書き込んでいる

■3
配列はよくわからないので使いたくないという場合でも、1セルずつ書き込むのではなく、1セットずつコピペするというアプローチ(3×3=最大で9回)にするのも有効だとおもいます。
(1セルずつ書き込んだとしても最大27回ですから好みで決めてよいレベルかと思います。)

    Sub 研究2()
        Dim 行 As Long, 種類列 As Long, 名前列 As Long

        With Worksheets("入力")
            行 = .Cells(.Rows.Count, "A").End(xlUp).Row

            For 種類列 = 2 To 4
                For 名前列 = 5 To 7
                    If .Cells(行, 種類列).Value <> "" And .Cells(行, 名前列).Value <> "" Then
                        Union(.Cells(行, "A"), .Cells(行, 種類列), .Cells(行, 名前列)).Copy _
                        Worksheets("データ一覧").Cells(.Rows.Count, "A").End(xlUp).Offset(1)
                    End If
                Next 名前列
            Next 種類列
        End With
    End Sub

 ※繰り返しになりますが、上記は説明用の提示であり完成品プレゼントの意図はありません。
 ※採用される場合は、【ステップ実行】等により研究の上、理解納得してから必要な部分のみ
  ご自身のコードに組み込んでください。

(もこな2 ) 2024/04/05(金) 14:59:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.