- ベストアンサー
エクセルマクロの構文を短くしたい
1週間分のデータの集計をします。 オートフィルターをかけ曜日で絞りかつ商品毎(15アイテム位)で絞り抽出されたデータを項目毎(4項目位)に別シートへはりつけます。 オートフィルター→月曜日抽出→A商品抽出→A商品のあ項目コピー→別シートの該当セルへペースト→A商品い項目コピー→別シートの該当セルへペースト・・・と続けA商品が終わったらオートフィルター→B商品抽出→B商品のあ項目コピー→・・・延々と15商品抽出・コピー・ペーストとつづけます。月曜日がおわれば次に火曜日抽出し同じ事をくりかえします。 何とか簡単な構文にならないでしょうか?
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
>回答番号:No.6 この回答への補足 ダメ出しの件は返事をいただけずスルーされたので、問題なしと理解します。 コードの方は、こんな風な感じになるのでは?と思います。 変数weeklistとcmdilistの元データをどこから取得するかですが 取りあえず、weeklistはArrayして、cmdilistは集計シート検査シートから取るようにしてあります。 詳細がよくわからないので、実状に合わせて書き換えてください。 Sub Test1() Dim weeklist As Variant Dim cmdilist As Range Dim i As Integer Dim j As Integer Dim k As Long weeklist = Array("月", "火", "水", "木", "金", "土") Set cmdilist = Sheets("集計シート検査").Range("C2:R2") With Sheets("検査実績貼り付け").Range("A2:H2") For i = 0 To 5 .AutoFilter Field:=8, Criteria1:=weeklist(i) For j = 1 To 16 'MsgBox weeklist(i) & vbLf & Cells(5 + k, j + 2).Address & vbLf & cmdilist(j).Value .AutoFilter Field:=2, Criteria1:="=" & cmdilist(j).Value & "*", Operator:=xlAnd With Sheets("集計シート検査") .Range("AC4:AF4").Copy .Cells(5 + k, j + 2).PasteSpecial _ Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True End With Next j k = k + 22 Next i End With Application.CutCopyMode = False Set cmdilist = Nothing End Sub
その他の回答 (13)
- n-jun
- ベストアンサー率33% (959/2873)
15アイテム(位?)×4項目位(?)のシートに振り分ける? 曜日がどのようなデータで代入(表示?)されているのかわかりませんが、 月曜~日曜(?)でソートしてから、アイテムと項目で抽出していくとか。 たぶんですけど「構文を短くしたい」とは、その作業を行なおうとすると(マクロの自動記録) だらだら長くなってしまうので、他の方法を聞きたいように感じるのですが、 結局どのようなデータを、どのようにしたいのかを、具体的なレイアウトを提示し 説明された方が伝わりやすいと思います。 的はずれならごめんなさい。
- hallo-2007
- ベストアンサー率41% (888/2115)
え~っ と思うのですが、 7曜日*15アイテム*4項目 420枚のシートに分けてコピィする エクセル(パソコン?)の限界超えるかもしれません。 >1週間分のデータの集計をします。 結果、どのような集計を希望されるのでしょうか。 1枚のシートから方が集計は簡単なはずです。 目的の方を質問されたほうが良いと思います。
- xls88
- ベストアンサー率56% (669/1189)
Excel(エクセル) VBA入門:繰り返し処理(For~Next,Do~Loop) http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_for_next.html 現状使われているコードを提示してください。 実際のコードを拝見する方がアドバイスし易くなります。
補足
皆さん色々お世話になります。 xls88さん 構文は Rows("2:2").Select Selection.AutoFilter ActiveWindow.SmallScroll ToRight:=2 Selection.AutoFilter Field:=19, Criteria1:="月" ActiveWindow.ScrollColumn = 1 Selection.AutoFilter Field:=3, Criteria1:="=10*", Operator:=xlAnd Sheets("集計シート検査").Select Range("R4").Select Selection.Copy ActiveWindow.SmallScroll ToRight:=-5 Range("C5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False ActiveWindow.ScrollColumn = 10 ~ Range("S4").Select Application.CutCopyMode = False Selection.Copy ActiveWindow.ScrollColumn = 1 Range("C14").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("検査実績貼り付け").Select Selection.AutoFilter Field:=3, Criteria1:="=11*", Operator:=xlAnd Sheets("集計シート検査").Select ActiveWindow.SmallScroll ToRight:=3 Range("R5").Select Application.CutCopyMode = False Selection.Copy ~ というようなコードが続きます。 halloさん コピーをはるシート先は1シートになります。 ペースト位置が結構バラバラです。 n-jonさん 「たぶんですけど「構文を短くしたい」とは、その作業を行なおうとすると(マクロの自動記録) だらだら長くなってしまうので、他の方法を聞きたいように感じるのですが」 すみません。そのとおりです。
- 1
- 2
補足
ありがとうございます。 コード文をそのままコピーしてはしらせてみました。 うまく走りました。 そこで使っているシートにあわせ書き換えました。 weeklist = Array("月", "火", "水", "木", "金", "土") ↓ (日曜日も含むので) weeklist = Array("月", "火", "水", "木", "金", "土","日") Set cmdilist = Sheets("集計シート検査").Range("C2:R2") ↓ (17アイテムだったので) Set cmdilist = Sheets("集計シート検査").Range("C2:S2") For i = 0 To 5 → For i = 0 To 6 .AutoFilter Field:=8, Criteria1:=weeklist(i) ↓ (曜日は19列目なので) .AutoFilter Field:=19, Criteria1:=weeklist(i) For j = 1 To 16→ For j = 1 To 17 .AutoFilter Field:=2, Criteria1:="=" & cmdilist(j).Value & "*", Operator:=xlAnd ↓(アイテム列は3列目なので) .AutoFilter Field:=3, ~ とかきかえました。それでマクロを走らせてみましたが .AutoFilter Field:=19, Criteria1:=weeklist(i)のところでデバックになりました。 実行時エラー"1004" Range クラスのAutoFilterメゾット失敗~ とかかれています。 調べてみましたが19列目は曜日がでるようになっています。 どうしてでしょうか?