|
みなさんこんばんわ VBAを初めて数日の超素人です
クロス集計に興味を持ちkobasanさんご紹介の下記で
勉強と思い見よう見まねでコードを修正しいろいろテスト
してみたのですがうまくいきませんでした。
どなたかご教授お願いします。
>この類は、Dictionaryを利用するのが楽でいいと思います。
>過去ログの【28364】を参考にすると出来ます。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28366;id=excel
こんなふうに↓修正し動作させたところ
[#41860]の表に対し修正
Sub test()
Dim rs As Object
Dim mysql As String
If open_ado_excel(ThisWorkbook.FullName) = 0 Then
mysql = "Transform iif(isnull(Count(不良本数)),0,Count(不良内容)) " & _
"Select ロット,品名 From [Sheet1$] Group By ロット,品名 " & _
"Pivot 不良内容;"
If get_exec_sql(mysql, rs) = 0 Then
With Worksheets("Sheet2")
.Cells.ClearContents
.Range("a2").CopyFromRecordset rs
For idx = 0 To rs.fields.Count - 1
.Cells(1, idx + 1).Value = rs.fields(idx).Name
Next
End With
Call rs_close(rs)
Else
MsgBox "rs error"
End If
Call close_ado
Else
MsgBox "cn error"
End If
End Sub
下記のような変なデータしか出ませんでした。
A B C D E F G H
ロット 品名 <> XX XY YY YZ ZZ
0 0 0 0 0 0
0001 A 0 1 1 0 0 0
0002 A 0 0 0 0 1 0
0003 B 0 1 0 1 1 0
0004 C 0 0 0 0 0 1
どこをどう修正したらいいのか解らなくなりました。
上記データで2行目とC列は不要だと思います。
それと不良合計をどう出したらいいかわかりません。
また上記一行目はKKさんの質問ではあらかじめ入力済みとありますがどうせなら
VBAで一気に書き込んだ方がいいと思うのですが。
次に、とまとさんのコードですが得る答えは一緒だと思いますが
このコードはほとんどどこをなおしていいやら上記より難解です。
お分かりになる方お願いします。
Sub 集計()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim dicA As Object
Dim dicB As Object
Dim dicC As Object
Dim vntA, vntB
Dim i As Long, j As Long
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Set dicA = CreateObject("Scripting.Dictionary")
Set dicB = CreateObject("Scripting.Dictionary")
Set dicC = CreateObject("Scripting.Dictionary")
vntA = sh1.Range("A2", sh1.Range("B65536").End(xlUp)).Value
For i = 1 To UBound(vntA)
dicA(vntA(i, 1) & vntA(i, 2)) = dicA(vntA(i, 1) & vntA(i, 2)) + 1
dicB(vntA(i, 1)) = Empty
dicC(vntA(i, 2)) = Empty
Next i
sh2.Range("A2").Resize(dicB.Count).Value = Application.Transpose(dicB.keys())
sh2.Range("B1").Resize(, dicC.Count).Value = dicC.keys()
vntB = sh2.Range("A1").CurrentRegion.Value
For i = 2 To UBound(vntB)
For j = 2 To dicC.Count + 1
vntB(i, j) = dicA(vntB(i, 1) & vntB(1, j))
Next
Next i
sh2.Range("A1").CurrentRegion.Value = vntB
Set sh1 = Nothing
Set sh2 = Nothing
Set dicA = Nothing
Set dicB = Nothing
Set dicC = Nothing
追伸;おおよその解説を付けていただけると今後の勉強に役立ちますので
助かるのですが・・・
乱文ですがよろしくお願いします。
ちなみに、かみちゃんさんのコードではどなたかのresにあるように
わたしのPCもメモリ不足とでてしまいました。winxp/excel2002です。
|
|