エクセルVBA初心者です。ご教授いただけると幸いです。
ネットなどを見ながらVBAにチャレンジしています。
仕事で在庫の集計表を作っています。
添付ファイル(上)のような表でAL列からBA列まで3行目から約10000行目(毎回変わります)までにSUMIFSを使いそれぞれの集計をしています。
添付ファイル(下)zaikoのシートは元データが入っています。
c = Sheets("home").Cells(Rows.Count, "N").End(xlUp).Row
For T = 38 To 53
For d = 3 To c
Sheets("home").Cells(d, T) = WorksheetFunction.SumIfs(Sheets("zaiko").Columns("G:G"), Sheets("zaiko").Columns("C:C"), Sheets("home").Cells(d, 14), Sheets("zaiko").Columns("A:A"), Sheets("home").Cells(1, T))
Next d
Next T
上記コードで計算はできたのですが約13分かかってしましました。
もっと早く計算する方法はありますか?
SUMIFSにこだわりはないので別の計算方法でも構いません。ただし在庫がないときは0と表示されないといけません。
home のシートの1行目AL:BAは店舗コードになります。
ご教授のほどよろしくお願いいます。
No.1ベストアンサー
- 回答日時:
こんにちは!
>3行目から約10000行目・・・
1セルずつループさせるとかなりの時間を要するはずです。
↓のような感じではどうでしょうか?
Sub Sample1()
Dim lastRow As Long, wS As Worksheet
Set wS = Worksheets("zaiko")
With Worksheets("home")
lastRow = .Cells(Rows.Count, "N").End(xlUp).Row
With Range(.Cells(3, "AL"), .Cells(lastRow, "BA"))
.Formula = "=SUMIFS(zaiko!$G:$G,zaiko!$C:$C,$N3,zaiko!$A:$A,AL$1)"
.Value = .Value
End With
End With
End Sub
※ ExcelでできることはExcelに任せて(数式をそのまま使って)
あとは値にします。
※ 細かい検証はしていませんので
思い通りの動きにならなかったらごめんなさいね。m(_ _)m
No.4
- 回答日時:
わたしに誤解があったら申し訳ないのですが、
在庫シートが集計すべきデータで、ホームシートが集計結果を出すシートですよね。
ホームシートに、商品コードごと かつ 店番ごと の在庫数を算出するという。
原始的ですが、以下のようにやってみました。ホームではなく、在庫データをループさせています。
データ数が分からないので、ホーム、在庫データとも1万件でやってみました。
もっといい方法もあるかと思いますがよろしければ一度どうぞ。
'---------------------------------------------------
Sub Shukei()
'*** 変数宣言 ***
Dim WsH As Worksheet, WsZ As Worksheet
Dim WSF As Object
Set WsH = Worksheets("home")
Set WsZ = Worksheets("zaiko")
Set WSF = Application.WorksheetFunction
Dim r As Long, c As Integer
Dim LstRow As Long, Zaiko As Long
Dim SCode As String, MiseCode As Integer
Dim SRow As Long, MiseCol As Integer
'*** 在庫シートの最終行を取得 ***
LstRow = WsZ.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
'*** 在庫シートの2行目から最終行までループ ***
For r = 2 To LstRow
SCode = WsZ.Cells(r, 3).Value '商品コード。在庫のC列
MiseCode = WsZ.Cells(r, 1).Value '店コード。在庫のA列
Zaiko = WsZ.Cells(r, 7).Value '在庫数。在庫のG列
SRow = WSF.Match(SCode, WsH.Columns(14), 0) '該当の商品コードがホームシートN列の何行目にあるか
MiseCol = WSF.Match(MiseCode, WsH.Rows(1), 0) '該当の店番がホームシート1行目の何列目にあるか
WsH.Cells(SRow, MiseCol).Value = WsH.Cells(SRow, MiseCol).Value + Zaiko 'ホームシートの該当セルに在庫数を加算
Next r
Application.ScreenUpdating = True
Set WSF = Nothing
Set WsH = Nothing
Set WsZ = Nothing
MsgBox "End."
End Sub
'---------------------------------------------------------------------------------
No.3
- 回答日時:
雰囲気以下でどうなりますか
元のファイルをコピーして、
標準モジュールに以下を記述して実行すると・・・・
未実行なので、おかしかったらごめんなさい
やっていることは、
"zaiko" シートを初めにまとめておきます
商品コード & タブ & 店舗コード の文字列で在庫数を Sum しておきます
覚えたら、"home" シートに移って
AL1 ~ BA1 の店舗コードと位置(AL 列が 1 ~ )を覚えてから、
N 列 & タブ & 店舗コード を生成して、求めていた Sum 値を引っ張る
実行結果を教えてください
Option Explicit
Public Sub Samp1()
Dim dic As Object, dicE As Object
Dim vA As Variant, v As Variant
Dim iA() As Long
Dim sS As String
Dim i As Long, j As Long
Const CSEP As String = vbTab
Set dic = CreateObject("Scripting.Dictionary")
Set dicE = CreateObject("Scripting.Dictionary")
With Worksheets("zaiko")
For i = 2 To .Cells(Rows.Count, "C").End(xlUp).Row
sS = .Cells(i, "C").Value & CSEP & .Cells(i, "A").Value
dic(sS) = dic(sS) + .Cells(i, "G").Value
Next
End With
With Worksheets("home")
vA = .Range("AL1:BA1").Value
For j = 1 To UBound(vA, 2)
dicE(vA(1, j)) = j
Next
With .Range("N3", .Cells(Rows.Count, "N").End(xlUp))
ReDim iA(1 To .Rows.Count, 1 To dicE.Count)
vA = .Value
For i = 1 To UBound(vA)
For Each v In dicE.Keys
sS = vA(i, 1) & CSEP & v
iA(i, dicE(v)) = dic(sS)
Next
Next
With .Offset(, Range("AL1").Column - .Column)
.Resize(, dicE.Count).Value = iA
End With
End With
End With
Set dic = Nothing
Set dicE = Nothing
End Sub
※ 以下参考になるところがあれば
Sub macro() Application.Calculation = xlC
http://detail.chiebukuro.yahoo.co.jp/qa/question …
とか
マクロ 関数関連 スピードアップ お世話になりま
http://detail.chiebukuro.yahoo.co.jp/qa/question …
No.2
- 回答日時:
セルに1個1個書き込むよりかは、一度、配列に代入をして、まとめて反映するほうが高速です。
下記のような方法です。
Dim c As Variant
C = Range("A1:A1000")
Range("B1:B1000") = C
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelはなんで先頭の0を消すん...
-
Excel元に戻す方法を教えてくだ...
-
Excelが固まってしまった。
-
エクセルで特定の範囲内から小...
-
Excel 2019 のピボットテーブル...
-
テレビを購入してYouTubeのボタ...
-
Excel2013のF6キー操作について
-
西暦や和暦の表示をyyyymmdd表...
-
【関数】スペースがいくつ入っ...
-
【Microsoft Office Excel Comp...
-
Excelのオートフィル
-
別シートからの文字を変更
-
Excelのセルを飛ばして入力する
-
MOS365 Excel Expert / Excel R...
-
エクセルで指定した日付、店舗...
-
4つのパターンを表示するEXACT...
-
スマートな関数を教えて下さい。
-
【Excel】セル内の時間帯が特定...
-
Excel初心者です。 詳しい方、...
-
Excelで全角を半角にしたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報
初心者なもので質問してすいません。
上記のコードをどう組み込めばいいんでしょうか?