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

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

複数行のデータを他シートに複写する際、複写先の行番号を指定する方法についてご教示ください。

現在、「計算表シート」のO列のセルに「1」を入力した行のデータを1件ずつ「日誌シート」の9行目」に複写して印刷しています。

今後は「計算表シート」のO列のセルに「日誌」シートの9行目から順番に複写する行番号を1から順番に入力して対象となる行データを1枚に印刷したい思います。

具体的には、O列のセルに1と入力した行データは、「日誌シート」の9行目(8+1行)、2と入力した行データは10行目(8+2行)、3と入力した行データは11行目(8+3行)としたいのです。
ただし、O列のセルに入力した番号は上から1,2,3と連続しておらず、2,1,3,5,4 という感じでバラバラです。

If ws.Cells(i, 15).Value = 1 Then を  If ws.Cells(i, 15).Value <>”” Then
.PrintOut Copies:=1 を Next i の次行に移動して Worksheets("日誌")PrintOut Copies:=1

に変更し、更に一行ずつ、iのセルに入力されている数字を8に追加して「日誌」シートの複写先の行を指定するのかと考えましたが、コードの書き方が分かりません。

Sub 日誌記入()
Dim ws As Worksheet
Set ws = Worksheets("計算表")

Dim i As Long
For i = 4 To 19
If ws.Cells(i, 15).Value = 1 Then
With Worksheets("日誌")
.Cells(9, 4).Value = ws.Cells(i, 4).Value
.Cells(9, 5).Value = ws.Cells(i, 5).Value
.Cells(9, 6).Value = ws.Cells(i, 7).Value
.Cells(9, 7).Value = ws.Cells(i, 8).Value
.Cells(9, 8).Value = ws.Cells(i, 9).Value
.Cells(9, 9).Value = ws.Cells(i, 11).Value
.Cells(9, 10).Value = ws.Cells(i, 12).Value
.PrintOut Copies:=1
End With
End If
Next i
End Sub

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

  • 皆様、説明不足の内容で申し訳ありませんでした。写真を添付しました。

    写真の左側が計算表、右側が日誌のシートです。取引先別に10種類の商品のうち7種類の受払額を日誌シートに複写します。
    計算表のO4:O19のセルに日誌シートの9行目からの複写順序を入力。
    現在は、全て「1」を入力して日誌シートの9行目に1件毎に複写して印刷しています。
    これを6件、指定した順序(4行目→10行目…)で日誌シートの9行目から14行目までに複写しますす。

    以下のコメントは、私の頭の整理です、ご放念下さい。
    If ws.Cells(i, 15).Value = 1 Then を  If ws.Cells(i, 15).Value <>”” Then
    .PrintOut Copies:=1 を Next i の次行に移動して Worksheets("日誌")PrintOut Copies:=1

    「Excel VBA 複数行の他シート複写」の補足画像1
      補足日時:2020/11/14 00:09

A 回答 (6件)

#3,4です


表組み云々は、置いといたとして 内容を変更する場合、わかり易いように?#3をご提示のコードに沿って書くと(.PrintOut 以外#3の内容と同じです)
Sub 日誌記入()
Dim ws As Worksheet
  Set ws = Worksheets("計算表")
  Dim i As Long, ii As Long
  With Worksheets("日誌")
    For i = 4 To 19
      If ws.Cells(i, 15).Value <> "" Then
        ii = ws.Cells(i, 15).Value + 8
        .Cells(ii, 4).Value = ws.Cells(i, 4).Value
        .Cells(ii, 5).Value = ws.Cells(i, 5).Value
        .Cells(ii, 6).Value = ws.Cells(i, 7).Value
        .Cells(ii, 7).Value = ws.Cells(i, 8).Value
        .Cells(ii, 8).Value = ws.Cells(i, 9).Value
        .Cells(ii, 9).Value = ws.Cells(i, 11).Value
        .Cells(ii, 10).Value = ws.Cells(i, 12).Value
      End If
    Next i
  '        .PrintOut Copies:=1
  End With
End Sub

O列の数値入力を間違えたり、使う人を考えると表組み自体を作り直すか、何かキーワードで抽出するとか、フィルタをかけるとかリストボックスで選択して書き込むとか、、課題がありそうですが、中々あるものを改修するのは面倒かも知れませんね。
    • good
    • 2
この回答へのお礼

今回は大変ありがとうございました。

「複写先(日誌シート)の行番号の指定はどうするのか」という疑問は、
「ii = ws.Cells(i, 15).Value + 8」で定義して「Cwlls(ii,〇).Vallue」とすることで解決しました。

複写元シートの列番号(値)をArray関数で一度に格納する方法も教えていただきました。何とか、仕組は分かりました。 

また、前提となる日誌シートの書式自体も見直してみました。
日誌シートの商品数を複写元の計算表シートの商品数10と同じにして、0も含めて全て複写すれば先行きのメンテ負担も軽減できます。

以下のコードで業務を試行してみます。

Sub 日誌記入4()
Dim ws As Worksheet
Set ws = Worksheets("計算表")
Dim i As Long, ii As Long
With Worksheets("日誌")
For i = 4 To 19
If ws.Cells(i, 15).Value <> "" Then
ii = ws.Cells(i, 15).Value + 8
.Cells(ii, 4).Resize(, 10).Value = ws.Cells(i, 3).Resize(, 10).Value
End If
Next i
.PrintOut Copies:=1
End With
End Sub

お礼日時:2020/11/14 09:51

わかりませんね


転記が固定セルなのか
順序付けは サーチが必要なのかもわかりません
    • good
    • 0
この回答へのお礼

ありがとうございます。
最後まで説明不足で申し訳ありませんでした。

「複写先(日誌シート)の行番号の指定はどうするのか」という疑問は、
「ii = ws.Cells(i, 15).Value + 8」で定義して「Cwlls(ii,〇).Vallue」とすることで解決しました。

お礼日時:2020/11/14 09:52

#3です


結果で良いのかも知れませんので
.PrintOut Copies:=1 を Next i の次行に移動して、処理の結果をプリントするのが、多分、正解かもです。。
    • good
    • 0

こんばんは、


よくわかりませんが、>O列のセルに入力した番号は上から1,2,3と連続しておらず、2,1,3,5,4 という感じでバラバラです。
なので、If ws.Cells(i, 15).Value <>”” Then でバラバラを回避して
セルの値で抽出先行数を設定すると言う事でよろしいでしょうか?

そのように解釈した場合、下記の様でどうでしょう?
>.Cells(9, 4).Value = ws.Cells(i, 4).Value部分も纏めてしまったので分かり難いかも知れません。
また、定数で指定しているので、限定的になってしまいますね。

Sub 日誌記入()
Dim ws As Worksheet
  Set ws = Worksheets("計算表")
  Dim i As Long, j As Long
  Dim ii As Long
  Dim WsCol() As Variant
  WsCol = Array(4, 5, 7, 8, 9, 11, 12)
  For i = 4 To 19
    If ws.Cells(i, 15).Value <> "" Then
      ii = ws.Cells(i, 15).Value + 8
      With Worksheets("日誌")
        For j = 4 To 10
          .Cells(ii, j).Value = ws.Cells(i, WsCol(j - 4)).Value
        Next j
        .PrintOut Copies:=1
      End With
    End If
  Next i
End Sub


>.PrintOut Copies:=1 を Next i の次行に移動して
とした場合、ループ処理の最後の結果のみをプリントする事になります。

解釈が違っていて頓珍漢なら、忘れてください。
    • good
    • 0

画像を貼り付けないとさっぱりわからん

    • good
    • 0

angela2000さんが書いた文章って、お洒落ですよね!!表現が洗練されていて、テンポが良いです。

でも、質問内容が頭に入ってきません。特に「If ws.Cells(i, 15).Value = 1 Then を  If ws.Cells(i, 15).Value <>”” Then
.PrintOut Copies:=1 を ・・・」以降が意味不明です!!
何がしたいの?
    • good
    • 1
この回答へのお礼

何時もおせわになり、ありがとうございます。
自分だけ分かったつもりの説明文となり、大変申し訳ありませんでした。

「複写先(日誌シート)の行番号の指定はどうするのか」という疑問は、
「ii = ws.Cells(i, 15).Value + 8」で定義して「Cwlls(ii,〇).Vallue」とすることで解決しました。

引続きスキルアップに努めて参りますので、今後ともご教示よろしくお願い申し上げます。

お礼日時:2020/11/14 09:55

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