前提・実現したいこと
会社で使用している「購入依頼書」の自動化(VBAとマクロの記録を使用)をしたいのですが、結果は思い通りになったものの、動作が遅く2分近くかかります。
高速化をしたいのでおしえてください。
以下のコードは、「購入依頼書」シートのVBAになります。
初心者ですので、難しいことはよくわかりません。
できるだけ簡単な方法でご教示ください。
何卒よろしくお願いいたします。
発生している問題・エラーメッセージ
ネットで高速化のVBA(以下)を入力しましたが、改善されません。
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
と
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
#ソースコード
Sub 転記()
'
' 転記 Macro
'
'
'単一セルから単一セルへの転記(21行とばしで転記)
Dim ws As Worksheet '製造・一般、科目の転記
Set ws = Workbooks("マクロ購入依頼書練習.xlsm").Worksheets("③")
Set wsData = Workbooks("マクロ購入依頼書練習.xlsm").Worksheets("購入依頼書")
Dim i As Long
Dim di As Long
'高速化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
i = 6
di = i + 21
Do While i <= 13
wsData.Cells(6, 1).Value = ws.Cells(i, 2).Value '製造・一般
wsData.Cells(di, 1).Value = ws.Cells(i, 2).Value
wsData.Cells(6, 2).Value = ws.Cells(i, 3).Value '科目
wsData.Cells(di, 2).Value = ws.Cells(i, 3).Value
i = i + 1
di = di + 21
Loop
'単一セルから単一セルへの転記(数量・単位・単価・希望納期)
'単一セルから結合セルへの転記(金額・購入先・備考)
Dim a As Long
Dim b As Long
a = 6
b = a + 3
Do While a <= 59
If b = 15 Or b = 16 Or (b >= 17 And b <= 29) Then
Exit Do
End If
wsData.Cells(b, 6).Value = ws.Cells(a, 5).Value '数量
wsData.Cells(b, 7).Value = ws.Cells(a, 6).Value '単位
wsData.Cells(b, 8).Value = ws.Cells(a, 7).Value '単価
wsData.Cells(b, 11).Value = ws.Cells(a, 9).Value '希望納期
wsData.Cells(b, 2).Value = ws.Cells(a, 4).Value '品名
wsData.Cells(b, 9).Value = ws.Cells(a, 8).Value '金額
wsData.Cells(b, 12).Value = ws.Cells(a, 10).Value '購入先
wsData.Cells(b, 23).Value = ws.Cells(a, 11).Value '備考
Cells(b, 8) = Format(Val(Replace(Cells(b, 8), ",", "")), "#,###") '単価のカンマ(0の場合は表示しない)
Cells(b, 9) = Format(Val(Replace(Cells(b, 9), ",", "")), "#,###") '金額のカンマ(0の場合は表示しない)
a = a + 1
b = b + 1
Loop
Dim c As Long
Dim d As Long
c = 12
d = 30
Do While c <= 59
If d = 36 Or d = 37 Or (d >= 38 And d <= 50) Then
Exit Do
End If
wsData.Cells(d, 6).Value = ws.Cells(c, 5).Value '数量
wsData.Cells(d, 7).Value = ws.Cells(c, 6).Value '単位
wsData.Cells(d, 8).Value = ws.Cells(c, 7).Value '単価
wsData.Cells(d, 11).Value = ws.Cells(c, 9).Value '希望納期
wsData.Cells(d, 2).Value = ws.Cells(c, 4).Value '品名
wsData.Cells(d, 9).Value = ws.Cells(c, 8).Value '金額
wsData.Cells(d, 12).Value = ws.Cells(c, 10).Value '購入先
wsData.Cells(d, 23).Value = ws.Cells(c, 11).Value '備考
Cells(d, 8) = Format(Val(Replace(Cells(d, 8), ",", "")), "#,###") '単価のカンマ
Cells(d, 9) = Format(Val(Replace(Cells(d, 9), ",", "")), "#,###") '金額のカンマ
c = c + 1
d = d + 1
Loop
Dim e As Long
Dim f As Long
e = 18
f = 51
Do While e <= 59
If f = 57 Or f = 58 Or (f >= 59 And f <= 71) Then
Exit Do
End If
wsData.Cells(f, 6).Value = ws.Cells(e, 5).Value '数量
wsData.Cells(f, 7).Value = ws.Cells(e, 6).Value '単位
wsData.Cells(f, 8).Value = ws.Cells(e, 7).Value '単価
wsData.Cells(f, 11).Value = ws.Cells(e, 9).Value '希望納期
wsData.Cells(f, 2).Value = ws.Cells(e, 4).Value '品名
wsData.Cells(f, 9).Value = ws.Cells(e, 8).Value '金額
wsData.Cells(f, 12).Value = ws.Cells(e, 10).Value '購入先
wsData.Cells(f, 23).Value = ws.Cells(e, 11).Value '備考
Cells(f, 8) = Format(Val(Replace(Cells(f, 8), ",", "")), "#,###") '単価のカンマ
Cells(f, 9) = Format(Val(Replace(Cells(f, 9), ",", "")), "#,###") '金額のカンマ
e = e + 1
f = f + 1
Loop
Dim g As Long
Dim h As Long
g = 24
h = 72
Do While g <= 59
If h = 78 Or h = 79 Or (h >= 80 And h <= 92) Then
Exit Do
End If
wsData.Cells(h, 6).Value = ws.Cells(g, 5).Value '数量
wsData.Cells(h, 7).Value = ws.Cells(g, 6).Value '単位
wsData.Cells(h, 8).Value = ws.Cells(g, 7).Value '単価
wsData.Cells(h, 11).Value = ws.Cells(g, 9).Value '希望納期
wsData.Cells(h, 2).Value = ws.Cells(g, 4).Value '品名
wsData.Cells(h, 9).Value = ws.Cells(g, 8).Value '金額
wsData.Cells(h, 12).Value = ws.Cells(g, 10).Value '購入先
wsData.Cells(h, 23).Value = ws.Cells(g, 11).Value '備考
Cells(h, 8) = Format(Val(Replace(Cells(h, 8), ",", "")), "#,###") '単価のカンマ
Cells(h, 9) = Format(Val(Replace(Cells(h, 9), ",", "")), "#,###") '金額のカンマ
g = g + 1
h = h + 1
Loop
Dim j As Long
Dim k As Long
j = 30
k = 93
Do While j <= 59
If k = 99 Or k = 100 Or (k >= 101 And k <= 112) Then
Exit Do
End If
wsData.Cells(k, 6).Value = ws.Cells(j, 5).Value '数量
wsData.Cells(k, 7).Value = ws.Cells(j, 6).Value '単位
wsData.Cells(k, 8).Value = ws.Cells(j, 7).Value '単価
wsData.Cells(k, 11).Value = ws.Cells(j, 9).Value '希望納期
wsData.Cells(k, 2).Value = ws.Cells(j, 4).Value '品名
wsData.Cells(k, 9).Value = ws.Cells(j, 8).Value '金額
wsData.Cells(k, 12).Value = ws.Cells(j, 10).Value '購入先
wsData.Cells(k, 23).Value = ws.Cells(j, 11).Value '備考
Cells(k, 8) = Format(Val(Replace(Cells(k, 8), ",", "")), "#,###") '単価のカンマ
Cells(k, 9) = Format(Val(Replace(Cells(k, 9), ",", "")), "#,###") '金額のカンマ
j = j + 1
k = k + 1
Loop
Dim l As Long
Dim m As Long
l = 36
m = 114
Do While l <= 59
If m = 120 Or m = 121 Or (m >= 122 And m <= 134) Then
Exit Do
End If
wsData.Cells(m, 6).Value = ws.Cells(l, 5).Value '数量
wsData.Cells(m, 7).Value = ws.Cells(l, 6).Value '単位
wsData.Cells(m, 8).Value = ws.Cells(l, 7).Value '単価
wsData.Cells(m, 11).Value = ws.Cells(l, 9).Value '希望納期
wsData.Cells(m, 2).Value = ws.Cells(l, 4).Value '品名
wsData.Cells(m, 9).Value = ws.Cells(l, 8).Value '金額
wsData.Cells(m, 12).Value = ws.Cells(l, 10).Value '購入先
wsData.Cells(m, 23).Value = ws.Cells(l, 11).Value '備考
Cells(m, 8) = Format(Val(Replace(Cells(m, 8), ",", "")), "#,###") '単価のカンマ
Cells(m, 9) = Format(Val(Replace(Cells(m, 9), ",", "")), "#,###") '金額のカンマ
l = l + 1
m = m + 1
Loop
Dim n As Long
Dim o As Long
n = 42
o = 135
Do While n <= 59
If o = 141 Or o = 142 Or (o >= 143 And o <= 155) Then
Exit Do
End If
wsData.Cells(o, 6).Value = ws.Cells(n, 5).Value '数量
wsData.Cells(o, 7).Value = ws.Cells(n, 6).Value '単位
wsData.Cells(o, 8).Value = ws.Cells(n, 7).Value '単価
wsData.Cells(o, 11).Value = ws.Cells(n, 9).Value '希望納期
wsData.Cells(o, 2).Value = ws.Cells(n, 4).Value '品名
wsData.Cells(o, 9).Value = ws.Cells(n, 8).Value '金額
wsData.Cells(o, 12).Value = ws.Cells(n, 10).Value '購入先
wsData.Cells(o, 23).Value = ws.Cells(n, 11).Value '備考
Cells(o, 8) = Format(Val(Replace(Cells(o, 8), ",", "")), "#,###") '単価のカンマ
Cells(o, 9) = Format(Val(Replace(Cells(o, 9), ",", "")), "#,###") '金額のカンマ
n = n + 1
o = o + 1
Loop
Dim p As Long
Dim q As Long
p = 48
q = 156
Do While p <= 59
If q = 162 Or q = 163 Or (q >= 164 And q <= 176) Then
Exit Do
End If
wsData.Cells(q, 6).Value = ws.Cells(p, 5).Value '数量
wsData.Cells(q, 7).Value = ws.Cells(p, 6).Value '単位
wsData.Cells(q, 8).Value = ws.Cells(p, 7).Value '単価
wsData.Cells(q, 11).Value = ws.Cells(p, 9).Value '希望納期
wsData.Cells(q, 2).Value = ws.Cells(p, 4).Value '品名
wsData.Cells(q, 9).Value = ws.Cells(p, 8).Value '金額
wsData.Cells(q, 12).Value = ws.Cells(p, 10).Value '購入先
wsData.Cells(q, 23).Value = ws.Cells(p, 11).Value '備考
Cells(q, 8) = Format(Val(Replace(Cells(q, 8), ",", "")), "#,###") '単価のカンマ
Cells(q, 9) = Format(Val(Replace(Cells(q, 9), ",", "")), "#,###") '金額のカンマ
p = p + 1
q = q + 1
Loop
Dim r As Long
Dim s As Long
r = 54
s = 177
Do While r <= 59
If s = 162 Or s = 163 Or (s >= 164 And s <= 176) Then
Exit Do
End If
wsData.Cells(s, 6).Value = ws.Cells(r, 5).Value '数量
wsData.Cells(s, 7).Value = ws.Cells(r, 6).Value '単位
wsData.Cells(s, 8).Value = ws.Cells(r, 7).Value '単価
wsData.Cells(s, 11).Value = ws.Cells(r, 9).Value '希望納期
wsData.Cells(s, 2).Value = ws.Cells(r, 4).Value '品名
wsData.Cells(s, 9).Value = ws.Cells(r, 8).Value '金額
wsData.Cells(s, 12).Value = ws.Cells(r, 10).Value '購入先
wsData.Cells(s, 23).Value = ws.Cells(r, 11).Value '備考
Cells(s, 8) = Format(Val(Replace(Cells(s, 8), ",", "")), "#,###") '単価のカンマ
Cells(s, 9) = Format(Val(Replace(Cells(s, 9), ",", "")), "#,###") '金額のカンマ
r = r + 1
s = s + 1
Loop
'高速化
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
試したこと
発生している問題・エラーメッセージ(上記)と同様
補足情報(FW/ツールのバージョンなど)
以下のような流れで、操作できるようにしています。(いずれも同ブック内の動作)
1.シート①に他のブックからの経理一覧データ(経費科目ごとに記載された購入する物品の名称・金額・数量など記載したもの)をコピペ。
2.シート②で「データ編集」ボタン(マクロの記録)を押し、「購入依頼書」に転記するために必要なデータをシート①から搾りこみ、「購入依頼書」に合わせた表示順に整える。
3.シート③で購入依頼書に転記したい(経費科目/購入依頼部門/購入部門など)をプルダウン(リストを使用)から選択し、「表示」ボタン(マクロの記録)で、科目ごと(購入する物品と数量・その金額や購入先)表示し転記できるように整える。
※「購入依頼書」は、経費科目ごと購入物品の転記が必要なため
また、左余白に経費科目を転記するため。
4.「購入依頼書」シートでは、「転記」ボタン(VBAでLoopを使用)を押し、シート③で表示した内容を転記する。
※1枚の「購入依頼書」には最大6つまで購入物品の記載が可能。
3枚の購入依頼書がA4に収まるような仕様になっている。
経費科目が増えることを想定し、「購入依頼書」シートには、9枚分転記できるように設定してある。
以上、よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/29 02:55
2021/08/29 03:34
2021/08/29 03:49
2021/08/29 05:22
2021/08/29 06:18