[[20150615115718]] 『ループのやり方がわからない2』(紫電改) ページの最後に飛ぶ

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

 

『ループのやり方がわからない2』(紫電改)

 【ループのやり方がわからない】で、色んなご意見をいただき、説明不足
 のご指摘がありましたので、仕切りなおしをさせていただきました。
[[20150531194445]] 『大きいデータの処理』(紫電改)
[[20150610131559]] 『ループのやり方がわからない』(紫電改)

 前回のご指摘内容は

 ・どのようなレイアウトのシートから、何を(どんな条件のものを)
 ・どのようなシートのどこに転記したいか。

 それを、コードではなく言葉で、要件として整理して説明されてはいかがですか?

 処理効率を考えるなら、
 1回あたりの書き込み行為自体が大きな負荷を持ちます。ここはループでやるべきでは
 ありません。

 ・マッチングすべきリストを、Dictinaryに格納しておき
 ・O列の値とのマッチング結果を配列にセットし
 ・最後に配列から、B列に一括して落とし込む

 こういった方法を検討すべきだと思います。

 でした。

 以下のマクロは、大きなcsvファイルからSheets("リスト")に貼り付けたところから
 始まります。
 A列、F列、I列を日付けに替え、O列からR列まで計算式を入れるというも
 のです。

 基本的な記述のしかたや、処理効率を考慮という点で、ご指導よろしくお願いします。

 Sheets("リスト")

     A           B        C      D        E       F         G      H          
 1 納期      製品NO,    型番   注文数  現工程  受入日    工程順  棚  
 2 20150710   11ABCD11   AB11    100    a    20150529    R1   A         
 3 20150710   12ABCD12   AB12    100      a    20150530    R2      A       
 4 20150711   13ABCD13   AB14     50      b    20150530    R1      B         
 5 20150712   14ABCD14   AB15    200      b    20150531    R3      B  
 6 20150712   15ABCD15   AB15    300      c    20150531    R2      C

     I           J        K      L      M     N   
 1 払出日     整理NO,  担当者  略称    ライン   略称1 
 2 20150709      24      鈴木  AB1      ABC     AB
 3 20150709       2     吉田    AA3      DEF     AA           
 4 20150710       6     竹本    AB1      ABC     AB
 5 20150711      21     鈴木    AC2      HIJ     AC
 6 20150711       3     山路    AA3      DEF     AA

 Sheets("型番DB")
     A       B            C        D
 1 略称   営業担当      P区分    priority
 2 AB12    伊藤       ★21鈴木    P1   
 3 CH11    藤田    ★24鈴木    P1
 4 SW11   藤田    ★21田中    P2
 5 AZ12    伊藤    ★24田中    P2
 6 CV14    森本    ★          P3

Sub test1()

     Set shtA = Workbooks("デイリー.xlsm").Worksheets("リスト")

    shtA.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    FieldInfo:=Array(1, 5)
    Columns("A:A").NumberFormatLocal = "m/d""(""aaa"")"""

    shtA.Columns("F:F").TextToColumns Destination:=Range("F1"), DataType:=xlDelimited, _
    FieldInfo:=Array(1, 5)
    Columns("F:F").NumberFormatLocal = "m/d""(""aaa"")"""

    shtA.Columns("I:I").TextToColumns Destination:=Range("I1"), DataType:=xlDelimited, _
    FieldInfo:=Array(1, 5)
    Columns("I:I").NumberFormatLocal = "m/d""(""aaa"")"""

    With ActiveSheet.UsedRange
    .Value = Application.Trim(.Value)
    End With

    b = shtA.Range("A" & Rows.Count).End(xlUp).Row

    c = 15
    Range(Cells(2, c), Cells(b, c)) = "=IF(I2="""","""",""★"")"
    Range(Cells(2, c), Cells(b, c)).Value = Range(Cells(2, c), Cells(b, c)).Value
    Cells(1, c) = "ABC"

    c = c + 1
    Range(Cells(2, c), Cells(b, c)) = "=O2&J2&K2"
    Range(Cells(2, c), Cells(b, c)).Value = Range(Cells(2, c), Cells(b, c)).Value
    Cells(1, c) = "DEF"

    c = c + 1
    Range(Cells(2, c), Cells(b, c)) = "=IF(ISERROR(VLOOKUP(P2,型番DB!C:D,2,FALSE)),"""",(VLOOKUP(P2,型番DB!C:D,2,FALSE)))"
    Range(Cells(2, c), Cells(b, c)).Value = Range(Cells(2, c), Cells(b, c)).Value
    Cells(1, c) = "P区分"

    c = c + 1
    Range(Cells(2, c), Cells(b, c)) = "=IF(ISERROR(VLOOKUP(L2,型番DB!A:B,2,FALSE)),"""",(VLOOKUP(L2,型番DB!A:B,2,FALSE)))"
    Range(Cells(2, c), Cells(b, c)).Value = Range(Cells(2, c), Cells(b, c)).Value
    Cells(1, c) = "営業担当"

  End Sub

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


 回答ではありません。

 前回のスレッドみましたが、βさんから「ループで行うべきではない」というのが核心だと思いますが・・・。
 それを踏まえたうえのタイトルですかね?

 さらに、マナさんから既に提案がありましたよね?
 参考にした結果が全然表現されていないと思いますが、いかがですか?

 レイアウトについても記述頂きましたが、
 > 以下のマクロは、大きなcsvファイルからSheets("リスト")に貼り付けたところから
 の「張りつけたデータ」なのか、それを「加工したデータ」なのかの説明もありませんよね?

 張りつけたデータと、加工後どうあるべきなのか、明確にされてはいかがですか?
(稲葉) 2015/06/15(月) 18:08

 簡単にいくつか
・私的にもループで処理する必要性がいまいち見えない
・ワークシートを変数に入れているけど、途中から使ってない
→ActiveSheetになってたり、シート自体を指定していなかったりで中途半端
・「Range(Cells(2, c), Cells(b, c))」という記述が複数回出てくるので
 これをWithでくくるか、変数にセットしてから使用するかしたほうが
 多少みやすいのではないか
(ご近所PG) 2015/06/15(月) 18:24

 稲葉さん、ご近所PGさん、ありがとうございました。
 変数やwithの使いかた、きちんと理解できていません。
 もう少し勉強し直してから出直します。
(紫電改) 2015/06/15(月) 21:44

少しでも、何をしようとしているかが伝わればよいです。

 Sub test2()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim dic担当 As Object, dic区分 As Object
    Dim 担当表, 区分表
    Dim i As Long
    Dim 列
    Dim リスト

    Set ws1 = Worksheets("リスト")
    Set ws2 = Worksheets("型番DB")

    Set dic担当 = CreateObject("scripting.dictionary")
    Set dic区分 = CreateObject("scripting.dictionary")

    担当表 = ws2.Range("a1", ws2.Range("a1").End(xlDown)).Resize(, 2).Value
    For i = 2 To UBound(担当表, 1)
        dic担当(担当表(i, 1)) = 担当表(i, 2)
    Next
    区分表 = ws2.Range("c1", ws2.Range("c1").End(xlDown)).Resize(, 2).Value
    For i = 2 To UBound(区分表, 1)
        dic区分(区分表(i, 1)) = 区分表(i, 2)
    Next

    With ws1.Range("a1").CurrentRegion
        .Value = Application.Trim(.Cells)

        For Each 列 In Array(1, 6, 9)
            .Columns(列).TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, 5)
            .Columns(列).NumberFormatLocal = "m/d(aaa)"
        Next

        リスト = .Resize(, 18).Value
     End With

    リスト(1, 15) = "ABC"
    リスト(1, 16) = "DEF"
    リスト(1, 17) = "P区分"
    リスト(1, 18) = "営業担当"

    For i = 2 To UBound(リスト, 1)
        リスト(i, 15) = IIf(リスト(i, 9) = "", "", "★")
        リスト(i, 16) = リスト(i, 15) & リスト(i, 10) & リスト(i, 11)
        リスト(i, 17) = dic区分(リスト(i, 16))
        リスト(i, 18) = dic担当(リスト(i, 12))
    Next

    ws1.Range("a1").Resize(UBound(リスト, 1), UBound(リスト, 2)).Value = リスト

 End Sub

(マナ) 2015/06/16(火) 23:29 修正23:56


↑application.trimで配列サイズ大きすぎてエラーがでたので修正
(マナ) 2015/06/16(火) 23:59

コメント返信:

[ 一覧(最新更新順) ]


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