teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2021/11/30 06:59

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -49,4 +49,70 @@
49
49
  End With
50
50
  End Sub
51
51
 
52
+ ```
53
+
54
+ ---
55
+ <追記> 整理整頓。
56
+
57
+ ```VBA
58
+ Sub total()
59
+
60
+ 'シートの準備
61
+ With ThisWorkbook
62
+ Dim meisai As Worksheet
63
+ Dim urikan As Worksheet
64
+ Set meisai = .Worksheets("明細")
65
+ Set urikan = .Worksheets("売上管理")
66
+ End With
67
+
68
+ '明細を取得し集計
69
+ With meisai
70
+ '連想配列(重複除去用)の準備
71
+ Dim myDic As Object
72
+ Set myDic = CreateObject("Scripting.Dictionary")
73
+
74
+ '明細データの格納
75
+ Dim ProductCode, ProductName, Tanka, Hanbaisuu, Hanbaigaku
76
+ Dim varKodoNamePrice As Variant
77
+ Dim i
78
+ For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
79
+ ProductCode = .Cells(i, 1).Value
80
+ If Not myDic.Exists(ProductCode) Then
81
+ ProductName = .Cells(i, 2).Value
82
+ Tanka = .Cells(i, 3).Value
83
+ Hanbaisuu = WorksheetFunction.CountIf(.Columns(1), ProductCode)
84
+ Hanbaigaku = Tanka * Hanbaisuu
85
+ varKodoNamePrice = Array(ProductCode, ProductName, Tanka, Hanbaisuu, Hanbaigaku)
86
+ myDic.Add ProductCode, varKodoNamePrice
87
+ End If
88
+ Next i
89
+
90
+ '出力用配列の準備
91
+ Dim myItems As Variant, myCount As Long
92
+ myItems = WorksheetFunction.Transpose(WorksheetFunction.Transpose(myDic.Items))
93
+ myCount = myDic.Count
94
+ End With
95
+
96
+
97
+ '売上管理に出力
98
+ With urikan
99
+ '開始行の決定
100
+ Dim lngNewRow As Long
101
+ lngNewRow = .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Row
102
+
103
+ '連番、日付の決定
104
+ Dim lngNo As Long, strNow As String
105
+ lngNo = WorksheetFunction.Max(.Columns(1)) + 1
106
+ strNow = Format(Now, "YYYY/MM/DD hh:mm")
107
+
108
+ '連番、日付の出力、セル結合
109
+ .Cells(lngNewRow, 1).Resize(, 2).Value = Array(lngNo, strNow)
110
+ .Cells(lngNewRow, 1).Resize(myCount).Merge
111
+ .Cells(lngNewRow, 2).Resize(myCount).Merge
112
+
113
+ '明細の出力
114
+ .Cells(lngNewRow, 3).Resize(myCount, 5).Value = myItems
115
+ End With
116
+
117
+ End Sub
52
118
  ```

3

修正

2021/11/30 06:59

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,52 +1,52 @@
1
- 日時や金額の書式は最初にシートのセル書式を設定しておけばよいと思うので、
2
- Noとセル結合のところを書いおきます
1
+ 修正し再掲
3
2
 
4
3
  ```VBA
4
+ Sub total()
5
+ '売上管理のシートにNo、販売日時、商品コード、商品名、単価、販売数、販売額を記入
6
+ Dim k
7
+ Dim lngNo As Long
8
+ Dim strNitiji As String
9
+ Dim varKodoNamePrice As Variant
10
+ strNitiji = Format(Now, "YYYY/MM/DD hh:mm")
11
+ Dim lngEndRow: lngEndRow = Worksheets("売上管理").Cells(Rows.Count, 1).End(xlUp).Row
12
+ Dim Arow As Long
13
+ Dim i As Long, j As Long
14
+ Dim myDic As Object
15
+ Dim mykeys, myItems
16
+ Dim varArrayItems As Variant
17
+ Dim ProductCode, ProductName, Tanka, Hanbaisuu, Hanbaigaku
5
- With Worksheets("売上管理")
18
+ Set myDic = CreateObject("Scripting.Dictionary")
6
- '
7
- '
8
- lngNo = WorksheetFunction.Max(.Columns(1)) + 1
9
- .Cells(lngEndRow, 1).Offset(1).Value = lngNo
10
- .Cells(lngEndRow, 1).Offset(1).Resize(myDic.Count).Merge
11
- .Cells(lngEndRow, 2).Offset(1).Resize(myDic.Count).Merge
12
- End With
13
- ```
14
19
 
15
- (元のコードにも気になることはありますが一旦見ないふり・・・)
16
-
17
- ---
18
- <追記>
19
-
20
- ```VBA
21
20
  'A列でリストの最終行を調べる
22
21
  Arow = Worksheets("明細").Cells(Rows.Count, 1).End(xlUp).Row
23
22
 
24
23
  With Worksheets("明細")
25
- Dim c, n, t, s, g, arr
26
24
  For i = 2 To Arow
27
- c = .Cells(i, 1).Value
25
+ ProductCode = .Cells(i, 1).Value
28
- If Not myDic.Exists(c) Then
26
+ If Not myDic.Exists(ProductCode) Then
27
+ ProductName = .Cells(i, 2).Value
29
- n = .Cells(i, 2).Value
28
+ Tanka = .Cells(i, 3).Value
30
- t = .Cells(i, 3).Value
31
- s = WorksheetFunction.CountIf(.Columns(1), c)
29
+ Hanbaisuu = WorksheetFunction.CountIf(.Columns(1), ProductCode)
32
- g = t * s
33
- arr = Array(c, n, t, s, g)
30
+ Hanbaigaku = Tanka * Hanbaisuu
31
+ varKodoNamePrice = Array(ProductCode, ProductName, Tanka, Hanbaisuu, Hanbaigaku)
34
32
  '連想配列、キーとデータを追加する
35
- myDic.Add c, arr
33
+ myDic.Add ProductCode, varKodoNamePrice
36
34
  End If
37
35
  Next i
38
36
  End With
39
-
37
+
40
38
  With Worksheets("売上管理")
41
- lngNo = WorksheetFunction.Max(.Columns(1)) + 1
42
- .Cells(lngEndRow, 1).Offset(1).Value = lngNo
43
- .Cells(lngEndRow, 1).Offset(1).Resize(myDic.Count).Merge
44
- .Cells(lngEndRow, 2).Offset(1).Resize(myDic.Count).Merge
45
39
  myItems = myDic.Items
46
40
  For j = 0 To myDic.Count - 1
47
41
  'キーとデータをセルに表示する
48
- .Range("C" & j + 2).Resize(, 5).Value = myItems(j)
42
+ .Cells(lngEndRow, 1).Offset(1 + j, 2).Resize(, 5).Value = myItems(j)
49
43
  Next j
44
+
45
+ lngNo = WorksheetFunction.Max(.Columns(1)) + 1
46
+ .Cells(lngEndRow, 1).Offset(1).Resize(, 2).Value = Array(lngNo, strNitiji)
47
+ .Cells(lngEndRow, 1).Offset(1).Resize(myDic.Count).Merge
48
+ .Cells(lngEndRow, 2).Offset(1).Resize(myDic.Count).Merge
50
49
  End With
50
+ End Sub
51
51
 
52
52
  ```

2

追記

2021/11/30 02:28

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -12,4 +12,41 @@
12
12
  End With
13
13
  ```
14
14
 
15
- (元のコードにも気になることはありますが一旦見ないふり・・・)
15
+ (元のコードにも気になることはありますが一旦見ないふり・・・)
16
+
17
+ ---
18
+ <追記>
19
+
20
+ ```VBA
21
+ 'A列でリストの最終行を調べる
22
+ Arow = Worksheets("明細").Cells(Rows.Count, 1).End(xlUp).Row
23
+
24
+ With Worksheets("明細")
25
+ Dim c, n, t, s, g, arr
26
+ For i = 2 To Arow
27
+ c = .Cells(i, 1).Value
28
+ If Not myDic.Exists(c) Then
29
+ n = .Cells(i, 2).Value
30
+ t = .Cells(i, 3).Value
31
+ s = WorksheetFunction.CountIf(.Columns(1), c)
32
+ g = t * s
33
+ arr = Array(c, n, t, s, g)
34
+ '連想配列、キーとデータを追加する
35
+ myDic.Add c, arr
36
+ End If
37
+ Next i
38
+ End With
39
+
40
+ With Worksheets("売上管理")
41
+ lngNo = WorksheetFunction.Max(.Columns(1)) + 1
42
+ .Cells(lngEndRow, 1).Offset(1).Value = lngNo
43
+ .Cells(lngEndRow, 1).Offset(1).Resize(myDic.Count).Merge
44
+ .Cells(lngEndRow, 2).Offset(1).Resize(myDic.Count).Merge
45
+ myItems = myDic.Items
46
+ For j = 0 To myDic.Count - 1
47
+ 'キーとデータをセルに表示する
48
+ .Range("C" & j + 2).Resize(, 5).Value = myItems(j)
49
+ Next j
50
+ End With
51
+
52
+ ```

1

修正

2021/11/26 06:17

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -7,8 +7,8 @@
7
7
  '
8
8
  lngNo = WorksheetFunction.Max(.Columns(1)) + 1
9
9
  .Cells(lngEndRow, 1).Offset(1).Value = lngNo
10
- .Cells(lngEndRow, 1).Offset(1).Resize(Arow - 1).Merge
10
+ .Cells(lngEndRow, 1).Offset(1).Resize(myDic.Count).Merge
11
- .Cells(lngEndRow, 2).Offset(1).Resize(Arow - 1).Merge
11
+ .Cells(lngEndRow, 2).Offset(1).Resize(myDic.Count).Merge
12
12
  End With
13
13
  ```
14
14