[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ループのやり方がわからない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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.