Access VBA質問箱 IV

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

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


841 / 2272 ツリー ←次へ | 前へ→

【9840】アクセスVBAでエクセルを操作 ぼっちゃん 07/9/14(金) 11:01 質問[未読]
【9843】Re:アクセスVBAでエクセルを操作 小僧 07/9/17(月) 17:20 回答[未読]
【9846】Re:アクセスVBAでエクセルを操作 ぼっちゃん 07/9/18(火) 9:02 お礼[未読]

【9840】アクセスVBAでエクセルを操作
質問  ぼっちゃん  - 07/9/14(金) 11:01 -

引用なし
パスワード
   お初にお目にかかります。VBA初心者です
アクセスのクエリで加工したデータをエクセルに貼り付け、
エクセルで合計をするVBAを作ろうとしていますが、エクセルの集計の
ところでうまくいきません。
Private Sub コマンド0_Click()
  Dim objExcel As Excel.Application
  Dim db As DAO.Database
  Dim rst As DAO.Recordset
  Dim qdf As DAO.QueryDef
  Dim aaa As String
 
  aaa = DCount("*", "Q_集計(製品名)A") + 2
 
  Set objExcel = CreateObject("Excel.Application")
  objExcel.Workbooks.Open Filename:="C:\Documents and Settings\2103\デスクトップ\111.xls"
  With objExcel
    .Worksheets.Add
     Set db = CurrentDb
     Set qdf = db.QueryDefs("Q_集計(製品名)A")
     Set rst = qdf.OpenRecordset
    .Range("A2").CopyFromRecordset rst
     rst.Close
     db.Close
     Set rst = Nothing
     Set qdf = Nothing
     Set db = Nothing
    .Range("A1").Value = "製品名"
    .Range("B1").Value = "件数"
    .Range("C1").Value = "問合せ"
    .Range("D1").Value = "クレーム"
    .Range("E1").Value = "提案"
    .Range("F1").Value = "その他"
    .Range("G1").Value = "%"
    .Cells(aaa, 1).Value = "合計"
    .Cells(aaa, 2).FormulaR1C1 = "=SUM(R[-aaa]C:R[-1]C)"←ここでうまくいきません。アプリケーション定義のエラーが出てきます。
  End With
  Set objExcel = Nothing
End Sub

詳しい方、返信お願いします。

【9843】Re:アクセスVBAでエクセルを操作
回答  小僧  - 07/9/17(月) 17:20 -

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

直接の問題以外にも色々ありそうですね。

> Dim aaa As String
> 
> aaa = DCount("*", "Q_集計(製品名)A") + 2

DCount の戻り値は数値型ではないのでしょうか。


>  With objExcel
>  .Worksheets.Add
>   .Range("A2").CopyFromRecordset rst

Excel のオブジェクトは

Application - Workbook - WorkSheet - Cell(Range)

の様な順序です。

現在のコードではエラーが出ないのかもしれませんが、
潜在的なバグの元になるかと思われます。


>  End With
>  Set objExcel = Nothing

Excel を不可視にしたままの状態で
オブジェクトだけ破棄しようとすると
インスタンスが残りっぱなしになってしまいますよ。

インスタンスが残りっぱなしなのに
何回もこのExcelファイルを開こうとすると
最悪ファイルが破損する恐れもあります。


> Q_集計(製品名)A

クエリの名前に()がついているのは余り宜しくないかと思われます。
こちらの問題については Miona さんという方のサイトが
非常に参考になるかと思われますので、
是非一度目を通されてみてください。

Miona's Square
フィールド、コントロール、オブジェクトや変数などに付ける「名前」について
h tp://ww3.tiki.ne.jp/~kaya/Ac_tips.html#Tips0_001
(こちらの掲示板は直リンク禁止ですので補完して下さい)


> .Range("A1").Value = "製品名"
> .Range("B1").Value = "件数"
> ・・・

フィールド数にもよるのですが、
せっかくレコードセットがあるのですから、
フィールドをループさせた方が効率的かもしれませんね。


> "=SUM(R[-aaa]C:R[-1]C)"

例えば aaa が 6行目の時、R[-6] は 0行目 になり、
Excel が勝手に 65535 行目に変換してしまいますよ。
求めたいのはヘッダー行を除いた合計ではないのでしょうか。


Private Sub コマンド0_Click()
Dim objExcel As Excel.Application
Dim objWkb As Excel.Workbook
Dim objSht As Excel.Worksheet
Dim FName As String
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim aaa As Long
Dim i As Long
 
  'FName = "C:\Documents and Settings\2103\デスクトップ\111.xls"
  'ファイル名が決め打ちの場合、下行をコメント化して上行のコメントを解除してください
  FName = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\111.xls"
  
  Set db = CurrentDb
  Set qdf = db.QueryDefs("Q_集計_製品名_A")
  Set rst = qdf.OpenRecordset
  Set objExcel = CreateObject("Excel.Application")
  Set objWkb = objExcel.Workbooks.Open(FName)
  Set objSht = objWkb.Worksheets.Add

    With objSht
      For i = 0 To rst.Fields.Count - 1
        .Cells(1, i + 1).Value = rst(i).Name
      Next i
      .Range("A2").CopyFromRecordset rst
      rst.MoveLast
      aaa = rst.RecordCount + 2
      .Range("A" & aaa).Value = "合計"
      .Range("B" & aaa).Value = _
         "=Sum(R[-" & aaa - 2 & "]C:R[-1]C)"
    End With
  objWkb.Close True: Set objWkb = Nothing
  objExcel.Quit: Set objExcel = Nothing
  

  rst.Close: Set rst = Nothing
  qdf.Close: Set qdf = Nothing
  db.Close: Set db = Nothing
End Sub

こんな感じでいかがでしょうか。

【9846】Re:アクセスVBAでエクセルを操作
お礼  ぼっちゃん  - 07/9/18(火) 9:02 -

引用なし
パスワード
   ご回答ありがとうございました。
また、いろいろ新しいこと(インスタンス等)を
おそわり感謝しています。
これをいかしてがんばりたいと思います。

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