[[20141119080607]] 『構文のまとめ方』(まんじゅう) ページの最後に飛ぶ

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

 

『構文のまとめ方』(まんじゅう)

VBAを作ってますが、下記の構文をすっきりまとめるには方法ありますか?
まとまりそうで、指示してるセルが違うのでまとまらないような。。。
お願い致します。

   i = 0
    With a.Sheets(s.Name)
       With .Range("A6", .Cells(Rows.Count, "A").End(xlUp))
          For Each w In .SpecialCells(xlCellTypeVisible)
             b.Sheets(h.Name).Range("B5").Offset(i).Resize(, 3).Value = w.Resize(, 3).Value
              i = i + 1
             If (i >= 22) Then Exit For
          Next
           i = 0
       End With
        With .Range("E6", .Cells(Rows.Count, "E").End(xlUp))
          For Each w In .SpecialCells(xlCellTypeVisible)
             b.Sheets(h.Name).Range("F5").Offset(i).Resize(, 2).Value = w.Resize(, 2).Value
              i = i + 1
             If (i >= 22) Then Exit For
             Next
             End With

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


違う箇所を引数として、サブプロシジャ化しては?
(???) 2014/11/19(水) 09:08

???様
どうやったらよいのでしょうか?
(まんじゅう) 2014/11/19(水) 13:49

 すっきりするかどうかわかりませんが、二つの共通でない部分は
  A6〜のデータを、B5から 3列分書き出し
  E6〜のデータを、F5から 2列分書き出し
 なので、2回ループさせる内 1回目は A6〜・・・・・、2回目は E6〜・・・・
 にしてみたらどうですか?

 部分だけですが
    For カウンタ = 0 To 1
        列名 = Array("A", "E")(カウンタ)    '1回目は 列名="A" 2回目は 列名="E"
        セル = Array("B5", "F5")(カウンタ)  '1回目は セル="B5" 2回目は セル="F5"
        サイズ = Array(3, 2)(カウンタ)      '1回目は サイズ=3  2回目は サイズ=2
       '↓それぞれの変数を使って処理。何回目のループかによって、列・セル・サイズが変わる。
       With .Range(列名 & "6", .Cells(Rows.Count, 列名).End(xlUp))
          For Each w In .SpecialCells(xlCellTypeVisible)
             b.Sheets(h.Name).Range(セル).Offset(i).Resize(, サイズ).Value = w.Resize(, サイズ).Value
              i = i + 1
             If (i >= 22) Then Exit For
          Next
           i = 0
       End With
    Next
 こんな感じで。

 実際は読みにくくなるのでどうかと思いますが。

 >どうやったらよいのでしょうか?
 「サブプロシージャ 引数」
 等で調べてみましたか?
  
(HANA) 2014/11/20(木) 16:36

ちょっと時間を空けてしまったけど、見てるかな?

    …
    Call sSub(A.Sheets(S.Name), B.Sheets(H.Name), "A6", "B5", 3)
    Call sSub(A.Sheets(S.Name), B.Sheets(H.Name), "E6", "F5", 2)
    …

 Sub sSub(S As Worksheet, H As Worksheet, cOrg As String, cDst As String, iCou As Long)
    Dim i As Long
    Dim W As Range

    With S.Range(cOrg, S.Cells(S.Rows.Count, Left(cOrg, 1)).End(xlUp))
        For Each W In .SpecialCells(xlCellTypeVisible)
            H.Range(cDst).Offset(i).Resize(, iCou).Value = W.Resize(, iCou).Value
            i = i + 1
            If (i >= 22) Then Exit For
        Next
    End With
End Sub
(???) 2014/11/25(火) 13:20

コメント返信:

[ 一覧(最新更新順) ]


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