Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9260 / 13645 ツリー ←次へ | 前へ→

【28364】ピボットテーブルを使わずにクロス集計 なおやん 05/9/3(土) 22:03 質問[未読]
【28366】Re:ピボットテーブルを使わずにクロス集計 とまと 05/9/3(土) 23:44 回答[未読]
【28369】Re:ピボットテーブルを使わずにクロス集計 なおやん 05/9/4(日) 6:54 お礼[未読]
【28380】Re:ピボットテーブルを使わずにクロス集計 ichinose 05/9/4(日) 21:31 発言[未読]

【28364】ピボットテーブルを使わずにクロス集計
質問  なおやん  - 05/9/3(土) 22:03 -

引用なし
パスワード
   週   果物
1週目 りんご
1週目 りんご
1週目 みかん
2週目 りんご
2週目 みかん
3週目 ぶどう
3週目 バナナ
3週目 バナナ

   りんご みかん ぶどう ばなな
1週目  2    1    0    0
2週目  1    1    0    0
3週目  0    0    1    2

ピボットテーブルを使わずに、上の表を下の表のように
クロス集計できる方はいますか?
果物の欄にはどんな果物何が入るかわかりません。(不特定)

Excelはやっぱり難しい・・・

【28366】Re:ピボットテーブルを使わずにクロス集計
回答  とまと  - 05/9/3(土) 23:44 -

引用なし
パスワード
   こんばんは
sheet1のものをsheet2に集計します。

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

【28369】Re:ピボットテーブルを使わずにクロス集計
お礼  なおやん  - 05/9/4(日) 6:54 -

引用なし
パスワード
   とまとさん

ご返信ありがとうございます。

すごいですね〜。やりたかった事ができました。
私の実力では内容をすぐには理解できないので、
じっくり見て勉強させていただきます。

本当にありがとうございました。

【28380】Re:ピボットテーブルを使わずにクロス集計
発言  ichinose  - 05/9/4(日) 21:31 -

引用なし
パスワード
   ▼なおやん さん、とまとさん
こんばんは。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28279;id=excel

のコードをほんのちょっとの変更だけで出来そうだったので
既に解決したようですが、投稿しました。


>週   果物
>1週目 りんご
>1週目 りんご
>1週目 みかん
>2週目 りんご
>2週目 みかん
>3週目 ぶどう
>3週目 バナナ
>3週目 バナナ

↑のデータがSheet1のA列1行目から入力されているとします。


>
>   りんご みかん ぶどう ばなな
>1週目  2    1    0    0
>2週目  1    1    0    0
>3週目  0    0    1    2

↑は、Sheet2とすると、

標準モジュールに
'=============================================
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

別の標準モジュールに
(こっちは、リンク先のコードと全く同じですが)
'=========================================================
Public cn As Object
'=========================================================
Function open_ado_excel(book_fullname As String) As Long
  On Error Resume Next
  link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & book_fullname & ";" & _
       "Extended Properties=Excel 8.0;"
  Set cn = CreateObject("ADODB.Connection")
  cn.Open link_opt
  open_ado_excel = Err.Number
  On Error GoTo 0
End Function
'=========================================================
Sub close_ado()
  On Error Resume Next
  cn.Close
  On Error GoTo 0
End Sub
'=========================================================
Function get_exec_sql(sql_str, rs As Object) As Long
  On Error Resume Next
  Set rs = cn.Execute(sql_str)
  get_exec_sql = Err.Number
  On Error GoTo 0
End Function
'=========================================================
Sub rs_close(rs As Object)
  On Error Resume Next
  rs.Close
  On Error GoTo 0
End Sub

以上です。
一度このブックを保存してから

プロシジャーtestを実行して見て下さい。

9260 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free