プロが教えるわが家の防犯対策術!

以下のマクロのコードや内容・条件をご覧ください。動きます。
次に図をご覧ください

book1の【A1からI1】までを、book2の【B6からJ6】に転記をしたいです
しかし、book2の【B13からJ13】に転記されてしまいます
理由は、マクロが最終行をA列の13行目と判断している為です
番号のデータがある為です

これを、赤矢印の場所へ転記できるようにしたいです
ご存じの方、よろしくお願いします


【利用条件】
・転記先ファイルは共有
・複数人にて利用

【マクロ内容】
・データを転記する
・book1のA1からI1までを、book2の【最終行】に転記
・最終行は、データが歯抜けであっても、1番最後の行に
 あるデータを最終行と判断する


【コード】
Sub 転記()


Dim ws1 As Worksheet
Dim wb2 As Workbook
Dim ws2 As Worksheet


Dim maxrow2 As Long
Dim row2 As Long
Dim i As Integer


Set ws1 = Worksheets("転記元")

For i = 1 To Workbooks.Count

If Workbooks(i).Name = "book2.xlsx" Then '転記先のブック。


Set wb2 = Workbooks(i)

End If

Next

Set ws2 = wb2.Worksheets("転記先") '転記先シート

maxrow2 = ws2.AutoFilter.Range(ws2.AutoFilter.Range.Count).Row '転記先のブックB列

row2 = maxrow2 + 1

ws2.Cells(row2, 2).Resize(1, 8).Value = ws1.Range("A1").Resize(1, 8).Value '転記元から転記先へ7セル分を転記.a1から7セル分。天気先。1列目から。

ws1.Range("I1").Copy ws2.Cells(row2, 10).Resize(1, 1)

wb2.Save '転記先のブックを上書き

End Sub

「【マクロ】book1からbook2への適」の質問画像

A 回答 (2件)

No1です。



似た様な回答をした記憶があったので・・
これでしょうかね?
https://oshiete.goo.ne.jp/qa/13639237.html


もしそうなら、どうやら文章では意味が通じないようなので、以下にサンプルを。
※ 関数等で計算結果がブランクになっているセルは、空白セルとは見做しません。
(こちらも空白セルと見做したい場合は、チェック条件を変えれば良いです)

Sub Sample()
Dim rw As Long
Const col = "B" ' 最終行判定対象列

With Workbooks("book2.xlsx").Worksheets("転記先")
rw = .Cells(2, 1).CurrentRegion.Rows.Count + 1
While rw > 1 And IsEmpty(.Cells(rw, col))
rw = rw - 1
Wend
MsgBox col & "列の最終行は " & rw & "行です"
End With
End Sub
    • good
    • 0

こんばんは



>理由は、マクロが最終行をA列の13行目と判断している為です
理由がわかっているのなら、そこを修正すれば良いです。

ご提示のコードでは「オートフィルタの範囲」の最終列を求めて、それを最終行と判断しています。
実行時の状況がわかりませんけれど、
1)必ず、オートフィルタが設定されている。(いない場合は無いのか?)
2)フィルターがかかっている状態(=非表示の行が存在する)である可能性がある。
などの状況によって変わってくるかもしれません。

・フィルタが設定されていても、非表示のセルがない状態であれば、通常のEnd(xlUp)で最終行を求める方法で、A列以外(=必ず値のある列)で参照することが可能でしょう。

・フィルタの状態を「全て表示」の状態にしてもかまわなければ、同様に上記の方法が使えます。
一旦、AutoFilter.ShowAllData を実行すれば全ての行が表示されますので・・
https://learn.microsoft.com/ja-jp/office/vba/api …

・フィルタが設定されているのか/いないのか不明で、かつ、非表示の行があるかもしれないというような場合は、下から順にセルの値を調べてゆけば良いでしょう。
(意味合いとしては、End(xlUp)と同様ですが、個々にセルを調べることで非表示のセルも対象にできます)
こちらの場合は、スタートをRow.Countにすると無駄が多いので、UsedRange+1 行目から上に調べてゆくのが効率的と思います。
(表の内容によっては、CurrentRegion の方がさらに有効かもしれません)


※ ちなみに、ご提示のコードの場合、シートにフィルタが設定されていないとエラーになると思われます。
    • good
    • 1
この回答へのお礼

いつもご返答ありがとうございます
フィルターは、しぼりが、入っている場合とない場合があります。非表示の行はないです、usedrange+1ですね

出きるか、わかりませんが、やってみます

アドバイスありがとうございます

お礼日時:2023/11/09 22:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A