Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


233 / 13645 ツリー ←次へ | 前へ→

【81401】表を加工して別シートに転記したい ありす 20/7/21(火) 15:50 質問[未読]
【81402】Re:表を加工して別シートに転記したい マナ 20/7/21(火) 21:18 発言[未読]
【81403】Re:表を加工して別シートに転記したい マナ 20/7/21(火) 21:53 発言[未読]
【81404】Re:表を加工して別シートに転記したい ありす 20/7/22(水) 14:28 発言[未読]
【81405】Re:表を加工して別シートに転記したい ありす 20/7/22(水) 14:52 発言[未読]
【81406】Re:表を加工して別シートに転記したい マナ 20/7/22(水) 21:02 発言[未読]
【81407】Re:表を加工して別シートに転記したい ありす 20/7/22(水) 21:45 発言[未読]
【81416】Re:表を加工して別シートに転記したい ありす 20/7/25(土) 23:47 質問[未読]
【81417】Re:表を加工して別シートに転記したい マナ 20/7/26(日) 13:10 発言[未読]
【81418】Re:表を加工して別シートに転記したい マナ 20/7/26(日) 17:40 発言[未読]
【81421】Re:表を加工して別シートに転記したい ありす 20/7/27(月) 0:15 お礼[未読]

【81401】表を加工して別シートに転記したい
質問  ありす  - 20/7/21(火) 15:50 -

引用なし
パスワード
   はじめまして。
過去ログを検索してみたものの、似てるのはあったけど自分で応用ができず投稿させていただきます。
無知ですみません。
今、手作業と関数を使ってやっている作業を自動でできたらいいな。と思って検索していました。

やりたいことは、以下です。
・sheet1にある表をsheet2に転記したい。
・sheet1に開始日と終了日の項目があるので、それをsheet2に転記するときに品名の後ろにくっつけたい

sheet1のデータ
セルD5からセルK5までは項目名が入っていて、
セルD6からセルK○行目までデータが入っています。
A列とB列に必要情報が色々書いてあって、その中に、開始日と終了日があります。
期間→B5 B6とB7の日付から何か月分か計算してある。
開始日→B6
終了日→B7
D5日付 E5発送1 F5発送2 G5発送コード1 H発送コード2 I5品名 J5金額 K5金額2

日付は開始から終了の各月の月末日付を入力
発送1、発送2、発送コード1、発送コード2、金額、金額2はそのまま転記
品名は、品名の後ろに('20/1月分)など日付と同じ月をカッコで追加。

Sheet1のデータ1行に対して、開始日(月)から終了日(月)までを繰り返して、
最終行まで転記したい。

sheet1のデータは、その時によって変動しデータ行数は固定ではありません。
(データの始まりは6行目で固定)
期間→B5 3か月
開始日→B6 2020/7/10
終了日→B7 2020/9/10
D     E    F   G  H  I    J  K
2020/7/10 東京都 ××区 001 123 りんご 100 100
2020/7/10 千葉県 △△市 002 456 みかん 200 0


sheet2に転記したとき(項目名が5行目にあるので、データ開始はD6から)
D     E    F   G  H  I          J  K
2020/7/31 東京都 ××区 001 123 りんご('20/7月分) 100 100
2020/8/31 東京都 ××区 001 123 りんご('20/8月分) 100 100
2020/9/30 東京都 ××区 001 123 りんご('20/9月分) 100 100
2020/7/31 千葉県 △△市 002 456 みかん('20/7月分) 200 0
2020/8/31 千葉県 △△市 002 456 みかん('20/8月分) 200 0
2020/9/30 千葉県 △△市 002 456 みかん('20/9月分) 200 0

繰り返してn回転記するというのはわかるのですが、
そこに、日付の操作と、品名の後ろにつける方法がわかりません。

よろしくおねがいします。

【81402】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/21(火) 21:18 -

引用なし
パスワード
   ▼ありす さん:

>繰り返してn回転記するというのはわかるのですが、
>そこに、日付の操作と、品名の後ろにつける方法がわかりません。

わからないところは、こちらで考えますので
できるところだけでも自分で書いてみませんか。

【81403】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/21(火) 21:53 -

引用なし
パスワード
   ▼ありす さん:

こんな流れのマクロです

1)sheet1のE6:K7を、sheet2のE6にコピー
2)sheet2のD6:D7に、"2020/7/31"を入力
3)sheet2のI6:I7の値に、"('20/7月分)"を付加
4)sheet1のE6:K7を、sheet2のE8にコピー
5)sheet2のD8:D9に、"2020/8/31"を入力
6)sheet2のI8:I9の値に、"('20/8月分)"を付加
7)sheet1のE6:K7を、sheet2のE10にコピー
8)sheet2のD10:D11に、"2020/9/30"を入力
9)sheet2のI10:I11の値に、"('20/9月分)"を付加
10)G列で並び替え

【81404】Re:表を加工して別シートに転記したい
発言  ありす  - 20/7/22(水) 14:28 -

引用なし
パスワード
   マナさん

ありがとうございます!
いただいた流れで、書いてみて、こちらに転記してみます。
今、別の仕事が立て込んでしまって、お返事が遅くなってしまいました。

時間を見て、一度書いてみます。

【81405】Re:表を加工して別シートに転記したい
発言  ありす  - 20/7/22(水) 14:52 -

引用なし
パスワード
   ▼マナ さん:
これだと、私が最終的に作りたい形にはならないですが、
最後に並べ替えなどする感じになるでしょうか。
例はデータも期間も少なくしていましたが、
最終的な表は100行を余裕で超えるものになる場合が多いので、最後に並べ替えではなく、
1行目のデータを期間分の行にして、2行目に移る方法で考えていました。

そうすると、元データの行数分繰り返す。
sheet1の6行目(n行目にしてデータの数分繰り返し)を貼り付け→ここで期間の月数分の行を作ってしまったほうがいい?
D列に最初の月から最後の月までの月末日を入力
→ここも月数分繰り返して月末日取得、入力
品名の後ろに('yy/mm月分)をくっつける。
→ここがどうしていいか想像がつかないです。
という流かなと思っています。

例で7月から10月としましたが、開始日、終了日はデータによってことなるので、
どうやって月をと月末日をだすのか悩んでました。

一旦、わからないながらにという感じになってしまいますが、
書いてみるので、添削&アドバイス、引き続きいただけると嬉しいです。

後程、また書き込みします。
よろしくお願いします。

>▼ありす さん:
>
>こんな流れのマクロです
>
>1)sheet1のE6:K7を、sheet2のE6にコピー
>2)sheet2のD6:D7に、"2020/7/31"を入力
>3)sheet2のI6:I7の値に、"('20/7月分)"を付加
>4)sheet1のE6:K7を、sheet2のE8にコピー
>5)sheet2のD8:D9に、"2020/8/31"を入力
>6)sheet2のI8:I9の値に、"('20/8月分)"を付加
>7)sheet1のE6:K7を、sheet2のE10にコピー
>8)sheet2のD10:D11に、"2020/9/30"を入力
>9)sheet2のI10:I11の値に、"('20/9月分)"を付加
>10)G列で並び替え

【81406】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/22(水) 21:02 -

引用なし
パスワード
   ▼ありす さん:

>これだと、私が最終的に作りたい形にはならないですが、
>最後に並べ替えなどする感じになるでしょうか。

はい。そう書きませんでしたか。

>例はデータも期間も少なくしていましたが、
>最終的な表は100行を余裕で超えるものになる場合が多いので、最後に並べ替えではなく、

6行でも、1000行でも1回並べ替えるだけです。


>1行目のデータを期間分の行にして、2行目に移る方法で考えていました。

それでもよいですが、
・元データの数だけ繰り返し
・月数の数だけ繰り返し
と2重に繰り返すことになって、複雑なマクロになりそうな気がしました。

【81407】Re:表を加工して別シートに転記したい
発言  ありす  - 20/7/22(水) 21:45 -

引用なし
パスワード
   ▼マナ さん:
並べ替えの件、最後にかいてありました。ごめんなさい。
2重に繰り返す方で途中まで書いてみてましたが、
最後に並べ替える方に方向転換して書いてみます。

>▼ありす さん:
>
>>これだと、私が最終的に作りたい形にはならないですが、
>>最後に並べ替えなどする感じになるでしょうか。
>
>はい。そう書きませんでしたか。
>
>>例はデータも期間も少なくしていましたが、
>>最終的な表は100行を余裕で超えるものになる場合が多いので、最後に並べ替えではなく、
>
>6行でも、1000行でも1回並べ替えるだけです。
>
>
>>1行目のデータを期間分の行にして、2行目に移る方法で考えていました。
>
>それでもよいですが、
>・元データの数だけ繰り返し
>・月数の数だけ繰り返し
>と2重に繰り返すことになって、複雑なマクロになりそうな気がしました。

【81416】Re:表を加工して別シートに転記したい
質問  ありす  - 20/7/25(土) 23:47 -

引用なし
パスワード
   ▼マナ さん:
▼マナさん
ご教示頂いた順序でマクロを書いてみました。
・最後に並べ替えをする際に、コードが被る事があるので、C列に並べ替え用Noを入れる項目を追加。
・並べ替えの書き方がわからなかったので、記録して範囲を最終行までに変更。
 →省けるコードなどがわからなかったので、そのままコピペしてしまった。
 もっとシンプルに書く方法などがありますか?
・データの量を増やして何度かテストしたのですが、
 なぜか、データの項目名から取ってきてしまう場合が5回に1回くらい起こってしまった。→未解決

書いたコードは以下の通りです。
添削とアドバイスがありましたらご教示頂きたく、よろしくお願いします。

Sub tenki()
Dim k As Long, g As Long 'k=期間 g=繰り返し用
Dim MaxRow1 As Long
Dim kaishi As Date '開始日
Dim shuryo As Date '終了日
Dim h As Date '日付入力用

'変数"k"に期間(何か月)をセット
k = Sheet1.Range("B5")
kaishi = Sheet1.Range("B6")
shuryo = Sheet1.Range("B7")

For g = 1 To k
  'sheet1のデータをsheet2に貼り付け
  If Sheet2.Range("C6") = "" Then
    MaxRow1 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row + 1
    Sheet1.Range("C6:K" & Cells(Rows.Count, "E").End(xlUp).Row).Copy
    Sheet2.Range("C6").PasteSpecial
    MaxRow2 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row
  Else
    MaxRow1 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row + 1
    Sheet1.Range("C6:K" & Cells(Rows.Count, "E").End(xlUp).Row).Copy
    Sheet2.Range("C" & MaxRow1 & "").PasteSpecial
    MaxRow2 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row
  End If
  '日付の入力
  h = DateSerial(Year(kaishi), Month(kaishi) + g, 0)
  Sheet2.Range("D" & MaxRow1 & ":D" & MaxRow2 & "").Formula = h
Next
'並べ替え
  ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("C6:C" & MaxRow2 & "") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("D6:D" & MaxRow2 & "") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("Sheet2").Sort
    .SetRange Range("C5:K" & MaxRow2 & "")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
End Sub

【81417】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/26(日) 13:10 -

引用なし
パスワード
   ▼ありす さん:

修正してみました。

> なぜか、データの項目名から取ってきてしまう場合が5回に1回くらい起こって>しまった。→未解決

>Sheet1.Range("C6:K" & Cells(Rows.Count, "E").End(xlUp).Row).Copy

Cells(Rows.Count, "E")の前にも、シート指定が必要です。


Sub tenki2()
  Dim k As Long, g As Long 'k=期間 g=繰り返し用
  Dim MaxRow1 As Long, MaxRow2 As Long
  Dim kaishi As Date '開始日
  Dim shuryo As Date '終了日
  Dim h As Date '日付入力用
  
  '変数"k"に期間(何か月)をセット
  k = Sheet1.Range("B5")
  kaishi = Sheet1.Range("B6")
  
  For g = 1 To k
  'sheet1のデータをsheet2に貼り付け
  If Sheet2.Range("C6") = "" Then
    MaxRow1 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row + 1
    Sheet1.Range("C6:K" & Sheet1.Cells(Rows.Count, "E").End(xlUp).Row).Copy
    Sheet2.Range("C6").PasteSpecial
    MaxRow2 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row
  Else
    MaxRow1 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row + 1
    Sheet1.Range("C6:K" & Sheet1.Cells(Rows.Count, "E").End(xlUp).Row).Copy
    Sheet2.Range("C" & MaxRow1).PasteSpecial
    MaxRow2 = Sheet2.Cells(Rows.Count, "C").End(xlUp).Row
  End If
  '日付の入力
  h = DateSerial(Year(kaishi), Month(kaishi) + g, 0)
  Sheet2.Range("D" & MaxRow1 & ":D" & MaxRow2).Value = h
  Next
  '並べ替え
  With Sheet2.Sort
    .SortFields.Clear
    .SortFields.Add Key:=Sheet2.Range("C6")
    .SortFields.Add Key:=Sheet2.Range("D6")
    .SetRange Sheet2.Range("C5:K" & MaxRow2)
    .Header = xlYes
    .Apply
  End With
  
End Sub

【81418】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/26(日) 17:40 -

引用なし
パスワード
   ▼ありす さん:

こんな書き方もできます
マクロで、Noを作成し、最後に削除しています。

>・最後に並べ替えをする際に、コードが被る事があるので、C列に並べ替え用Noを入れる項目を追加。


Option Explicit

Sub test()
  Dim wsF As Worksheet, wsT As Worksheet
  Dim 期間 As Long, 開始日 As Date
  Dim 元データ As Range, データ数 As Long
  Dim 貼付先 As Range
  Dim k As Long, 月末 As Date
  Dim 商品名 As Range, 数式 As String
  Dim ソート範囲 As Range

  Set wsF = Worksheets("Sheet1")
  Set wsT = Worksheets("Sheet2") '転記先
  
  期間 = wsF.Range("B5").Value
  開始日 = wsF.Range("B6").Value
  
  Set 元データ = wsF.Range("C6", wsF.Range("K" & Rows.Count).End(xlUp))
  元データ.Columns(1).Formula = "=row()"  '並べ替え用No
  データ数 = 元データ.Rows.Count
  
  Set 貼付先 = wsT.Range("C6")
   
  For k = 1 To 期間
'  'sheet1のデータをsheet2に貼り付け
    元データ.Copy
    貼付先.PasteSpecial xlPasteValues

    '日付の入力
    月末 = DateSerial(Year(開始日), Month(開始日) + k, 0)
    貼付先.Resize(データ数).Columns(2).Value = 月末
    
    '商品名に日付を付加
    Set 商品名 = 貼付先.Resize(データ数).Columns(7)
    数式 = 商品名.Address & "&""" & Format(月末, "('yy/m月分)") & """"
    商品名.Value = 商品名.Worksheet.Evaluate(数式)
    
    Set 貼付先 = 貼付先.Offset(データ数)
  Next
  
  '並べ替え
  Set ソート範囲 = wsT.Range("C6", wsT.Range("K" & Rows.Count).End(xlUp))
  ソート範囲.Sort ソート範囲.Columns(1)
  
  '並べ替え用Noの削除
  ソート範囲.Columns(1).ClearContents
  元データ.Columns(1).ClearContents
    
End Sub


 

【81421】Re:表を加工して別シートに転記したい
お礼  ありす  - 20/7/27(月) 0:15 -

引用なし
パスワード
   ▼マナ さん:
ありがとうございました。
前述の修正と以下に頂いたものを確認しながら、勉強してみます。
品名の後ろの年月、すっかり忘れてました笑
これ重要だったのに。
ソートの部分も、ごちゃごちゃ書かずにすっきりできたので、
変数の部分と合わせて確認しながら書いてみます。

>▼ありす さん:
>
>こんな書き方もできます
>マクロで、Noを作成し、最後に削除しています。
>
>>・最後に並べ替えをする際に、コードが被る事があるので、C列に並べ替え用Noを入れる項目を追加。
>

>
>Option Explicit
>
>Sub test()
>  Dim wsF As Worksheet, wsT As Worksheet
>  Dim 期間 As Long, 開始日 As Date
>  Dim 元データ As Range, データ数 As Long
>  Dim 貼付先 As Range
>  Dim k As Long, 月末 As Date
>  Dim 商品名 As Range, 数式 As String
>  Dim ソート範囲 As Range
>
>  Set wsF = Worksheets("Sheet1")
>  Set wsT = Worksheets("Sheet2") '転記先
>  
>  期間 = wsF.Range("B5").Value
>  開始日 = wsF.Range("B6").Value
>  
>  Set 元データ = wsF.Range("C6", wsF.Range("K" & Rows.Count).End(xlUp))
>  元データ.Columns(1).Formula = "=row()"  '並べ替え用No
>  データ数 = 元データ.Rows.Count
>  
>  Set 貼付先 = wsT.Range("C6")
>   
>  For k = 1 To 期間
>'  'sheet1のデータをsheet2に貼り付け
>    元データ.Copy
>    貼付先.PasteSpecial xlPasteValues
>
>    '日付の入力
>    月末 = DateSerial(Year(開始日), Month(開始日) + k, 0)
>    貼付先.Resize(データ数).Columns(2).Value = 月末
>    
>    '商品名に日付を付加
>    Set 商品名 = 貼付先.Resize(データ数).Columns(7)
>    数式 = 商品名.Address & "&""" & Format(月末, "('yy/m月分)") & """"
>    商品名.Value = 商品名.Worksheet.Evaluate(数式)
>    
>    Set 貼付先 = 貼付先.Offset(データ数)
>  Next
>  
>  '並べ替え
>  Set ソート範囲 = wsT.Range("C6", wsT.Range("K" & Rows.Count).End(xlUp))
>  ソート範囲.Sort ソート範囲.Columns(1)
>  
>  '並べ替え用Noの削除
>  ソート範囲.Columns(1).ClearContents
>  元データ.Columns(1).ClearContents
>    
>End Sub
>
>
>

233 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free