[[20180315101113]] 『for文の書き方について』(爪) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『for文の書き方について』(爪)

for文の書き方について教えてくさい。

やりたいことは、C列5行目から最終列までの値、C列6行目から最終列までの値、U列10行目〜C列10行目までの値(逆から)、D列10行目の値、C列10行目の値を別のシートに1行にして貼り付けたいと思っています。

  If n > 0 Then
    For i = 5 To 6
      For j = 3 To ws1.Cells(5, Columns.Count).End(xlToLeft).Column
        ws2.Cells(n, k) = ws1.Cells(i, j)
        k = k + 1
      Next j
    Next i
    For l = 3 To 21 Step -1
      ws2.Cells(n, k) = ws1.Cells(10, l)
    Next l
    ws2.Cells(n, k) = ws1.Cells(10, 4)
    ws2.Cells(n, k + 1) = ws1.Cells(10, 3)
  End If

このように書いてみて、処理結果自体は望み通りの結果を得ているのですが、for文以外にも同じような結果を得られる書き方があれば教えて頂きたいと思い投稿致しました。(貼り付けたい元の値(セル)が今後増えていくため、for文がいっぱいになると分かりにくいかな・・・と)宜しければご回答をお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Sub test()
    Dim m As Long
    Dim n As Long
    Dim k As Long

    n = 20
    m = 1

    '5行目の転記
    With Range("C5")
        With Application.Range(.Cells, .End(xlToLeft))
            k = .Count
            Cells(n, m).Resize(, k).Value = .Value
            m = m + k
        End With
    End With

    '6行目の転記
     With Range("C6")
        With Application.Range(.Cells, .End(xlToLeft))
            k = .Count
            Cells(n, m).Resize(, k).Value = .Value
            m = m + k
        End With
    End With

    '10行目の転記
        With Range("C10")
        With Application.Range(.Cells, .End(xlToLeft))
            For k = .Count To 3 Step -1
                m = m + 1
                Cells(n, m).Value = .Cells(k).Value
            Next
        End With
    End With
End Sub

ぁあ、自作の関数を作れば、もう少しスッキリしますかね。。。

(まっつわん) 2018/03/15(木) 12:51


わわわ

>xlToLeft
xlToRight
の間違いでした^^;;;
(まっつわん) 2018/03/15(木) 13:15


 逆順はどうしてもループ使っちゃいますねぇ・・・

 Sub arr()

 Dim arr1(19)
 Dim c5 As Long, c6 As Long, i As Long

 c5 = Range("C5").End(xlToRight)        'C5から右に何個あるか
 c6 = Range("C6").End(xlToRight)        'C6から右に何個あるか

 For i = 3 To 21

    arr1(21 - i) = Cells(10, i)         'Range("C10:U10")までを逆順で格納

 Next i

 With Worksheets("別のシート")
    .Range("A1", .Cells(1, c5 + 1)).Value = Range("C5", Cells(5, c5 + 3)).Value
    .Range(.Cells(1, c5 + 2), .Cells(1, c5 + c6 + 1)).Value = Range("C6", Cells(6, c6 + 3)).Value
    .Range(.Cells(1, c5 + c6 + 2), .Cells(1, c5 + c6 + 19 + 1)) = arr1
    .Cells(1, c5 + c6 + 19 + 1 + 1) = Range("D10")
    .Cells(1, c5 + c6 + 19 + 1 + 1 + 1) = Range("C10")
 End With

 End Sub

 まっつわんさん
 10行目転記の「m = m + 1」はnextの前でよいのでは?試したら一列空いちゃいましたけど・・・

(774) 2018/03/15(木) 14:59


 >まっつわんさん
 >10行目転記の「m = m + 1」はnextの前でよいのでは?試したら一列空いちゃいましたけど・・・
なるほど。。。
そうですね。ありがとうございます。^^
試してないのバレバレですね^^;

(まっつわん) 2018/03/15(木) 17:36


Sub test2()
    Dim rngResult As Range

    With Sheets(1)
        SetAdd .Range("C5"), rngResult, True
        SetAdd .Range("C6"), rngResult, True
        SetAdd .Range("U10"), rngResult, False
    End With
End Sub

Private Sub SetAdd(ByVal rngFrom As Range, _

                ByRef rngTo As Range, _
                ByVal flg As Boolean)
    Dim c As Range
    Dim i As Long, j As Long

    If rngTo Is Nothing Then
        Set rngTo = Sheets(2).Range("A1")
        i = 0
    Else
        i = rngTo.Count
    End If

    If flg Then
        Set rngFrom = Application.Range(rngFrom, rngFrom.End(xlToRight))
        For Each c In rngFrom
            i = i + 1
            rngTo(1, i).Value = c.Value
        Next
    Else
        Set rngFrom = Application.Range(rngFrom, rngFrom.End(xlToLeft))
        For j = rngFrom.Count To 3 Step -1
            i = i + 1
            rngTo(1, i).Value = c.Value
        Next
    End If
    Set rngTo = rngTo.Resize(, i)
End Sub

こんな感じでサブルーチンを作って再利用すると追加があっても、
対応がしやすいかなぁ。。。。。。。

(まっつわん) 2018/03/15(木) 18:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.