Excel VBA質問箱 IV

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

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


5456 / 13644 ツリー ←次へ | 前へ→

【50662】クロス集計!再レス KENG 07/8/8(水) 9:42 質問[未読]
【50666】Re:クロス集計!再レス ichinose 07/8/8(水) 12:58 発言[未読]
【50671】Re:クロス集計!再レス KENG 07/8/8(水) 18:14 発言[未読]
【50672】Re:クロス集計!再レス ichinose 07/8/8(水) 18:28 発言[未読]
【50673】Re:クロス集計!再レス 追伸 ichinose 07/8/8(水) 18:49 発言[未読]

【50662】クロス集計!再レス
質問  KENG  - 07/8/8(水) 9:42 -

引用なし
パスワード
   すみません。
下記の回答を参考にさせていただき、実行したら、
rs.error とでます。

参照設定の問題かとおもいましたが、ちがいました。
だれか分かる方どうかお力をおかしください。


▼taku さん:
こんばんは。
SQLで行ったクロス集計です。

以下のデータが
Sheet1というシートのセルA1から
設定されているという条件です。
(1行目は項目名です)

>日付    品名   金額
>2005/1/12 パソコン 120,000
>2005/1/23 プリンタ  50,000
>2005/2/15 パソコン 200,000
>2005/2/25 プリンタ  35,000

集計結果は、同じブックのSheet2というシート名に書き込みます。


標準モジュールに
'================================
Sub test()
  Dim idx As Long
  Dim rs As Object
  Dim mysql As String
  If open_ado_excel(ThisWorkbook.FullName) = 0 Then
    mysql = "Transform sum(金額) " & _
        "Select 品名 From [Sheet1$] Group By 品名 " & _
        "Pivot year(日付)*100+month(日付);"
    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 = "'" & Format(rs.fields(idx).Name, "0000年00月")
       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
  Dim link_opt As String
  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
  Set cn = Nothing
  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
  Set rs = Nothing
  On Error GoTo 0
End Sub

【50666】Re:クロス集計!再レス
発言  ichinose  - 07/8/8(水) 12:58 -

引用なし
パスワード
   ▼KENG さん:
こんにちは。

>すみません。
>下記の回答を参考にさせていただき、実行したら、
>rs.error とでます。

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

↑これですね!!

サンプルデータがシートに正しく設定されていない か

>一度適当なブック名で保存した後に
>testを実行してみてください。

と当時は記述しておきましたが・・・。

保存しないで実行した などが理由として考えられます。

確認してみてください。

上記ではないとすると、投稿は夕方になってしまいます。

【50671】Re:クロス集計!再レス
発言  KENG  - 07/8/8(水) 18:14 -

引用なし
パスワード
   すみません。

色々調べていたら、解決はしたのですが、
すこしアドバイスください。

下記のコードのところで、SQLの結果データのある列に計算式を
入れたり、値を+1していったり(データのNo.を付けるため)
などをしたいと思います。
また、offset関数の具体的な使い方、などおしえていただけませんか?

     For idx = 0 To rs.fields.Count - 1
       .Cells(1, idx + 1).Value = "'" & Format(rs.fields(idx).Name, "0000年00月"

ご面倒をおかけしますが、なにとぞわかりやすい説明でお願いいたします。
どうぞ宜しくお願い致します。

【50672】Re:クロス集計!再レス
発言  ichinose  - 07/8/8(水) 18:28 -

引用なし
パスワード
   ▼KENG さん:
こんばんは。

>
>色々調べていたら、解決はしたのですが、
>すこしアドバイスください。
解決した内容をここに投稿してください。
そうすれば、KENG さんと同じ悩みを持った方の指針になりますよね!!

>
>下記のコードのところで、SQLの結果データのある列に計算式を
>入れたり、値を+1していったり(データのNo.を付けるため)
>などをしたいと思います。
>また、offset関数の具体的な使い方、などおしえていただけませんか?
>
>     For idx = 0 To rs.fields.Count - 1
>       .Cells(1, idx + 1).Value = "'" & Format(rs.fields(idx).Name, "0000年00月"
>
>ご面倒をおかけしますが、なにとぞわかりやすい説明でお願いいたします。

何が知りたいのか私にはわかりません。

知りたいことをなにとぞわかりやすい記述(例題を必ず記述する)でお願いいたします。

【50673】Re:クロス集計!再レス 追伸
発言  ichinose  - 07/8/8(水) 18:49 -

引用なし
パスワード
   www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=42410;id=excel

でも記述してありますが、

>ブックを開いたまま、繰り返し実行するには問題もありますが、
>(その場合はデータブックとVBAコードを含むブックを分けなければなりません)
>ブックを開いて一度集計するくらいなら、問題ないと思います。

何度も繰り返す場合は、問題があるコードなので
一応、考慮してください

理由は↓このスレッドうを参照してください。

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

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