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

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

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

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

Q&A

3回答

900閲覧

エクセルマクロでデータを転記するコードについて

tiyo

総合スコア2

VBA

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

0グッド

0クリップ

投稿2021/07/22 09:51

前提・実現したいこと

別ブックにデータを転記するコードを書いたのですが、
下記のコードを動かすと画像の通り最後の値が全体に転記されてしまいうまくいきません
イメージ説明

イメージ説明

下記コードのどこを直せばうまくいくでしょうか
また、できれば新しいブックに転記する際に、自分のコードだと
転記する範囲を指定していますが、最終行を取得する方法?に変えて
範囲をその都度指定しなくて済むようにしたいです。
よろしくお願いいたします。

該当のソースコード

Sub ボタン1_Click() Dim c As Range Set c = Range("C34:C39") Dim d As Range Set d = Range("D34:D39") Dim e As Range Set e = Range("E34:E39") Dim f As Range Set f = Range("F34:F39") Dim i As Integer For i = 1 To d.Cells.Count If d.Cells(i).Value = "〇" Then Windows("転記.xlsx").Activate Dim a As Range Set a = Range("A2:A4") Dim b As Range Set b = Range("B2:B4") Dim g As Range Set g = Range("C2:C4") Dim h As Range Set h = Range("D2:D4") Dim k As Integer For k = 1 To a.Cells.Count a.Cells(k).Value = Date b.Cells(k).Value = c.Cells(i).Value g.Cells(k).Value = e.Cells(i).Value h.Cells(k).Value = f.Cells(i).Value Next k End If Next i End Sub

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

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

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

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

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

guest

回答3

0

最終行の取得方法は大きく2二通りのやり方があります。

その1
変数=cells(rows.count,1).End(xlup).row
rows.countは最終行までジャンプしなさいという命令です。
cells(1048576,1)と指定したのと同じ事です。

その2
変数= Range("A1").End(xlDown).Row

Xlupは「Ctrl+↑」
XlDownは「Ctrl+↓」
のキー操作になります。

上から次の空白セルを見つける方法と下から空白セルを見つける方法になりますが、使い方は
元データの途中に空白があれば、下から上げる。
空白がなければ、どちらでも構いません。
しかし、元データに万が一空白がでるようなケースもあるので、下から上げる方が安全です。

下上げる場合次のようなコードでも可能です。

変数= Range("A1048576").End(xlup).Row
変数= Range("A" & rows.count).End(xlup).row

変数=cells(1048576,1).End(xlup).Row

としても最終行から次の空白セルを取得可能です。

投稿2021/07/26 02:56

shinyakita

総合スコア39

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

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

0

最終行を取得する方法は、

Excel

1Dim Endrow as long 2Endrow =cells(rows.count,1).end(xlup).row

とかです。
アクティブシートの最終行を取得することになりますが、特定のシートの最終行を取得する場合は、Sheets("シート名").cell.... とかになります。

転記についてですが、配列に入れてしまった方が早い気がします。

Excel

1Sub ボタン1_Click() 2Dim a() As Variant 3Dim Endrow As Long 4Dim i As Long 5Dim i2 As Long 6 7Endrow = Cells(Rows.Count, 1).End(xlUp).Row 8 9ReDim a(1 To Endrow, 1 To 6) 10For i = 1 To Endrow 11 For i2 = 1 To 6 12 a(i, i2) = Cells(i, i2) 13 Next i2 14Next i 15 16 17Windows("転記.xlsx").Activate 18i2 = 1 19For i = 1 To Endrow 20 If a(i, 4) = "○" Then 21 cells(i2,1)=Date 22 cells(i2,2)=a(i,3) 23 cells(i2,3)=a(i,5) 24 cells(i2,4)=a(i,6) 25 i2 = i2 + 1 26 End If 27Next i 28End Sub 29

もっと言うと、データ範囲を取得してしまえば、最終行を取得する必要すらありません。

Excel

1Sub ボタン1_Click() 2Dim a As Variant 3Dim i As Long 4Dim i2 As Long 5 6a = Cells(1, 1).CurrentRegion 7 8Windows("転記.xlsx").Activate 9 10i2 = 2 11For i = LBound(a) To UBound(a) 'LBound(),UBound()はそれぞれ配列の最小と最大の要素の添え字を返す関数です。 12 If a(i, 4) = "○" Then 13 cells(i2,1)=Date 14 cells(i2,2)=a(i,3) 15 cells(i2,3)=a(i,5) 16 cells(i2,4)=a(i,6) 17 i2 = i2 + 1 18 End If 19Next i 20End Sub 21

投稿2021/07/25 10:12

OfficeNono

総合スコア15

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

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

0

今のコードでは、"〇" が見つかる都度、毎回 For k = 1 To a.Cells.Count とやって2~4行目に書き出しています。
毎回同じ場所に上書きすることになるので、処理後は最後の結果だけが残るのです。

これを、できるだけ元の形を残して直すとしたら

VBA

1Sub ボタン1_Click() 2Dim c As Range 3Set c = Range("C34:C39") 4Dim d As Range 5Set d = Range("D34:D39") 6Dim e As Range 7Set e = Range("E34:E39") 8Dim f As Range 9Set f = Range("F34:F39") 10Dim i As Integer 11 12Dim k As Integer 13k = 1 14 15For i = 1 To d.Cells.Count 16If d.Cells(i).Value = "〇" Then 17 18Windows("転記.xlsx").Activate 19 20Dim a As Range 21Set a = Range("A2:A4") 22Dim b As Range 23Set b = Range("B2:B4") 24Dim g As Range 25Set g = Range("C2:C4") 26Dim h As Range 27Set h = Range("D2:D4") 28 29a.Cells(k).Value = Date 30b.Cells(k).Value = c.Cells(i).Value 31g.Cells(k).Value = e.Cells(i).Value 32h.Cells(k).Value = f.Cells(i).Value 33 34k = k + 1 35End If 36Next i 37End Sub

のような感じにしたらよいと思います。(k の扱いを変えたのが分かると思います。)

投稿2021/07/22 10:30

編集2021/07/22 10:32
jinoji

総合スコア4592

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問