| 
    
     |  | こんばんは。 
 あと、ま、これは蛇足ですけど、
 コピー元のデータを 配列 に入れておいて、
 もうひとつの 配列 に 条件付きで行処理をして転記して
 最後にこの配列をまとめて転記先の範囲に値だけ書き込む
 という手もありまして。。。
 
 配列内でデータを再配置するのは高速化の常用手段ですので
 参考までにサンプルをアップしておきます。
 
 新規「標準モジュール」を追加してそこに
 Option Explicit 行からコピーして お試しください。
 (注)
 ・CSVデータは「TMP1」シートの31行目からあるものと仮定。
 ・転記先シートは Worksheets(3) としています。
 ・このシートの3行目に項目見出しがあり、
 4行目以降にデータを貼り付けるものと仮定しています。
 このあたりは 適宜修正してください。
 
 '-------------------------------------- 新規Module
 Option Explicit
 
 Enum 列番号
 行番号 = 1
 適用 = 2
 数量 = 3
 単位 = 4
 単価 = 5
 金額 = 6
 End Enum
 
 
 Sub 見積り作成6()
 Dim WS As Worksheet
 Dim i  As Long
 Dim j  As Long
 Dim newLine As Long
 Dim PostAddLine As Long
 Dim v 'もとのデータ
 Dim u '転記用データ
 
 With Worksheets("TMP1") '一時シートのデータを配列に入れる
 v = .Range("A31", .Cells(Rows.Count, 2).End(xlUp)) _
 .Resize(, 6).Value
 End With
 
 '転記先シートの書式Copy  'この部分 吟味されてません
 Set WS = Worksheets(3)
 If UBound(v) > 29 Then
 With WS.Range("A4")
 .Resize(29, 6).Copy .Offset(29)
 .Offset(29).Resize(29, 6).RowHeight = 27
 End With
 End If
 
 ReDim u(1 To 29, 1 To 金額)
 newLine = 1
 For i = 1 To UBound(v)
 PostAddLine = 0
 '行番号欄に記載のあったとき
 str行番号 = v(i, 行番号)
 If Len(str行番号) > 0 Then
 'マイナス行番号を カッコ付き行番号にします
 If str行番号 Like "-*" Then
 v(i, 行番号) = "'(" & Mid(str行番号, 2) & ")"
 End If
 End If
 
 '転記行 条件チェック
 If v(i, 適用) Like "*合*計*" Then
 PostAddLine = 1         '◆下に空行挿入
 
 ElseIf v(i, 適用) Like "*値*引*" Then '「値引」の文字あり
 newLine = newLine + 1      '◆上に空行挿入
 
 ElseIf v(i, 単位) Like "式" And IsEmpty(v(i, 単価)) Then
 '単位欄が「式」で 単価欄に記載がないときは
 newLine = newLine + 1    '◆上に空行挿入
 End If
 '指定の行に値転記
 For j = 1 To 金額
 u(newLine, j) = v(i, j)
 Next
 newLine = newLine + 1 + PostAddLine  '◆次の転記行
 Next
 
 WS.Range("A4").Resize(newLine - 1, 6).Value = u
 
 End Sub
 
 |  |