電子書籍の厳選無料作品が豊富!

Excel マクロについて詳しい方、ご教示ください。

『行数が毎回変わる元データの、A列に「1」と入っている行のみ、先データの各セルにコピペし印刷したい』のですが、うまくいかず行き詰まっています…。
どのようにすればいいでしょうか?

①元データのタイトル行を除きたい
②A列に「1」と入っている場合のみコピペ印刷したい

以上がメインの悩みで、以下はサブ的な悩みなのですが、

③元データ、先データのセル共に連続していない為、全箇所1個1個指定しているが可能ならコンパクトしたい
④元データシリアル値→先データ元号の数字のみの表記にしたい

よろしくお願いいたします。


ーー以下マクローー

Sub テスト()

Dim lastRow As Long
Dim i As Long

'データのA列の最終行取得
lastRow = Sheets("元データ").Range("A" & Rows.Count).End(xlUp).Row

'1行目からlastRow行目まで繰り返し
For i = 1 To lastRow

'データをセット
Sheets("先データ").Range("EA2").Value = Sheets("元データ").Range("B" & i).Value
Sheets("先データ").Range("EL2").Value = Sheets("元データ").Range("C" & i).Value
Sheets("先データ").Range("EW2").Value = Sheets("元データ").Range("D" & i).Value
※計60箇所ある為省略

'印刷プレビュー
Sheets("先データ").PrintPreview

Next
End Sub

質問者からの補足コメント

  • ②について、読み返してから伝わりにくい表現だったかもと思った為、補足致します。

    A列に1と入っている場合のみ、その入っている行をコピペ印刷したいです。
    例えば全体的な行数としては10行あったとしても、A3・A5・A8にしか1が入っていなければコピペ印刷するのは3・5・8の行のみで良いです。

      補足日時:2024/11/23 02:05

A 回答 (2件)

こんにちは



>①元データのタイトル行を除きたい
 → タイトル行が1行目なら、2行目から処理を行えばよいです。
   1行目のままでも、タイトル行のA列が1でなければ、②の処理で
   省かれることになります

>②A列に「1」と入っている場合のみコピペ印刷したい
 → 1行ずつ処理しているのですから、A列の値を読んで1でなければ
    処理をスキップすれば良いでしょう

>③全箇所1個1個指定しているが可能ならコンパクトしたい
 → セル位置を配列等にセットしておいて、それを参照しながらループ
   するような仕組みにすれば、繰り返しで処理にすることが可能です。

>④元データシリアル値→先データ元号の数字のみの表記にしたい
 → セル位置が固定なのか、不定なのかによっても異なります。
   IsDate関数で日付かどうかの判断が可能と思いますので、セル位置が
   不定の場合は、各セルの処理時にチェックします。
https://learn.microsoft.com/ja-jp/office/vba/lan …
   位置固定の場合は、そのセルだけ処理すれば良いですね。
   値そのものを変えてしまう方法と、値はそのままコピペしておいて
   先データの表示書式を変更する方法とが考えられます。
   (印刷するだけなら、後者で良さそうに思います)
   位置固定の場合、予め先データの書式設定をしておくことで、
   マクロでの処理は不要にできるでしょう。


なお、ご質問にはありませんけれど、シート名を毎回記述するのは煩雑なので、WIth構文を利用したり、シートを一旦変数に代入しておいて利用するなどとしておく方がコードが短くなり視認性が良くなると思います。

上記を反映すると、全体的に以下のようなイメージにできると思います。
(④に関しては内容がよくわからないので、省きました)

Dim sht As Worksheet, pos
Dim rw As Long, n As Long

pos = Split("EA2 EL2 EW2"," ")
Set sht = Sheets("先データ")

With Sheets("元データ")
 For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
  'A列の値をチェック
  If .Cells(rw, 1).Value = 1 Then
   'データをセット
   For n = 0 to 2 ' 例示の範囲のみ繰返し(=3箇所)
    sht.Range(pos(n)).Value = .Cells(rw, n + 2).Value
   Next n

   '印刷プレビュー
   sht.PrintPreview
  End If
 Next rw
End With
    • good
    • 0
この回答へのお礼

助かりました

説明を含む丁寧なご回答ありがとうございます!

①に関してはそりゃそうだ…となりまして、間抜けな質問してしまったことが恥ずかしい限りです…!

また、ループでの処理やシート名をwith構文使うなどコードが短くなる知恵をくださりとても為になりました。
追記頂いた空き行を利用する方法も、今回はこれから各セルに入れてく作業するのは手間だったのでやりませんでしたが、そもそも最初からそのようにしていればと発想力に感動しました。

④に関しても、formatで処理したら出来たので解決致しました。

この度は丁寧でわかりやすいご回答を、本当にありがとうございました!

お礼日時:2024/11/23 19:22

No1です。



連投失礼。
③に関しては、もう少し簡単な方法を思いつきました。

一回の印刷に必要なデータは、元データの1行分だと思いますので、先データの印刷対象外の空き行(例えば100行目)を利用する方法です。

先データの値が可変のセルには(例えばEA2セル)
 =B100
のように、100行目を参照する式をあらかじめセットしておきます。

このような仕組みにしておくことで、印刷対象の行の値を、先データの100行目にまとめてセットすれば、自動的に印刷内容に反映できることになります。
この方式であれば、個々に値を転記する必要はなくなりますので、マクロに記述する内容は、1行分をまとめて転記するだけにできます。


Dim rw As Long

With Sheets("元データ")
 For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
  'A列の値をチェック
  If .Cells(rw, 1).Value = 1 Then
   'データをセット
   Sheets("先データ").Rows(100).Value = .Rows(rw).Value
   '印刷プレビュー
   sht.PrintPreview
  End If
 Next rw
End With
    • good
    • 0

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

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


おすすめ情報

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