EXCELでグラフを表示する方法とプロセスの閉じ方

このQ&Aのポイント
  • VB6.0 ACCESS2000で開発している際に、EXCELでグラフを表示してプレビューを表示し、印刷してからEXCELを閉じると、プロセスが残ってしまう問題が発生しました。
  • プレビューを表示した後、印刷せずに閉じた場合でも、画面上ではEXCELは閉じているのに、プロセスが残り続けてしまいます。
  • どの箇所が原因でプロセスが残るのか、解決策を教えてください。
回答を見る
  • ベストアンサー

グラフの表示

VB6.0 ACCESS2000で開発しています。 下の様にACCESSからデータを読んでEXCELでグラフを表示して プレビューへ表示しています。 プレビューを表示した後、印刷してEXCELを閉じる。 又は、印刷せずに閉じた場合でも画面上はEXCELは閉じているのですが プロセスに残ってしまいます。 どこが悪いのでしょうか? よろしくお願いします。 Private Sub Command1_Click() Dim ExcelApp As Object 'Excel.Application Dim Book As Object 'Excel.Workbook Dim Sheet As Object 'Excel.Worksheet Dim cn As ADODB.Connection Dim rst As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open Set rs = New ADODB.Recordset rs.Source = SELECT = "SELECT = "SELECT 商品名, 単価 FROM m_品名 rs.ActiveConnection = cn rs.CursorType = adOpenStatic rs.Open Set ExcelApp = CreateObject("Excel.Application") Set Book = ExcelApp.Workbooks.Add Set Sheet = Book.Worksheets(1) Sheet.Cells(1, 1).CopyFromRecordset rst Dim MyChart As ChartObject Set MyChart = Sheet.ChartObjects.Add(10, 100, 600, 330) With MyChart.Chart .SetSourceData Sheet.Range(Range("A1:B1"), Range("A1:B1").End(xlDown)), xlColumns .ChartType = xlBarClustered .Axes(xlValue).MaximumScale = 350 .Axes(xlValue).MajorUnit = 50 .HasTitle = True .ChartTitle.Text = "案件実績合計" .ApplyDataLabels (xlDataLabelsShowValue) '.SeriesCollection(1).ApplyDataLabels (xlDataLabelsShowValue) .Location Where:=xlLocationAsNewSheet End With ExcelApp.Visible = True Book.ActiveSheet.PrintPreview Book.Close ExcelApp.Quit Set Sheet = Nothing Set Book = Nothing Set ExcelApp = Nothing Set rst = Nothing Set cn = Nothing End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

「Excelが開放されない」 (http://www.bcap.co.jp/hanafusa/VBHLP/ExcelErr.htm) が参考になるかも。 > SetSourceData Sheet.Range(Range("A1:B1"), Range("A1:B1").End(xlDown)), xlColumns この記述(『Range』の指定方法)は、上記ページで述べられている 「1.一番多いのがマクロ等で記録したのをそのまま使った等で起きる~」 の状況ですね。

tombo20
質問者

お礼

ありがとうございます。 参考にしてやったらうまく出来ました。 他に悩んでいた部分も解決しました。 感謝です!

関連するQ&A

  • ADO ファイルを閉じるには?

    アクセスからエクセルへ Sub Sample() Dim cn As Object Dim rs As Object Set cn = CreateObject("ADODB.Connection") With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Excel 12.0" .Properties("Data Source") = "D:\Book1.xlsx" .Open End With Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM [sheet1$]", cn, 3 Debug.Print rs.RecordCount rs.Close: cn.Close Set rs = Nothing : Set cn = Nothing End Sub このコードでシートの行数を取得してるのですが このコードを実行後もファイルが開いたままなのですが 閉じるにはどうすればいいのでしょうか? .Openでファイルが開くので cn.Close でファイルが閉じるのかと思ったら閉じません。 cn.Quitを追記してみましたが 実行時エラー -2147467259 選択クエリを実行できません。 となりました。 どうすればファイルを閉じることが出来るのでしょうか?

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • rs.MoveFirst

    アクセスvbaです。 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst '←これいらない? For i = 1 To rs.RecordCount rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub このようなコードの場合 rs.MoveFirst はあってもなくても変わらないですか?

  • レコードは2行あるのに「-1」が返ってくる

    accessです。 テーブル1にレコードは2行あるのに、下記のコードを実行すると「-1」が返ってきます。 なぜでしょうか? ------------------------------------------------------------ Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = cn.Execute("SELECT * FROM テーブル1") MsgBox rs.RecordCount rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub ------------------------------------------------------------ ご教示よろしくお願い致します。

  • VB6.0でエクセルを扱うプログラムについて

    こんにちは。VB初級者です。宜しくお願いします。 現在、VB6.0でエクセルの表を操作するようなプログラムを作っています。下に書いたプログラム(わかりにくいとは思いますが、ご教授お願いします。)で値の更新は出来たようなのですが、実際に表を開こうとすると”不正な処理が行われました”というエラーメッセージが出て開くことが出来ません。ADOオブジェクトでエクセルを扱うのがちょっとおかしい(?)のかもしれませんが、今回はEXCELオブジェクトは使わないという方針です。 自分ではどこが間違っているかわかりませんでしたので教えて頂ければと思います。宜しくお願い致します。 Private Sub Command1_Click() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = "C:\VB\株価管理\株価.xls" cn.Open Dim cmd As ADODB.Command Dim mySQL As String mySQL = "update [株価$] set 高値 =10000 where 高値 = 7" Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = mySQL cmd.Execute Set rst = New ADODB.Recordset rst.Source = "Select * From [株価$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText Do While Not rst.EOF Debug.Print rst.Fields("高値") rst.MoveNext Loop rst.Close cn.Close Set rst = Nothing Set cn = Nothing Set cmd = Nothing End Sub

  • ACCESSからEXCELに出力する際、時間がかかる。

    よろしくお願いします。 ACCESS VBA を使用して、既存のEXCELファイルにデータを出力しているのですが、すごく時間がかかってしまいます。件数が少ない時はそれほど気にならないのですが。時間短縮する方法を教えてください。 Sub S_ExportExcel_ADO() Dim CN As ADODB.Connection Dim rst As ADODB.Recordset Dim objExcel As Excel.Application Dim i As Integer Dim W_SQL As String On Error GoTo Err_S_ExportExcel_ADO Set objExcel = New Excel.Application objExcel.Workbooks.Open ("test.xls") objExcel.Worksheets("sheet1").Select Set CN = CurrentProject.Connection Set rst = New ADODB.Recordset W_SQL = "SELECT * FROM データ" rst.Open W_SQL, CN, adOpenKeyset, adLockReadOnly i = 1 Do Until rst.EOF objExcel.Cells(i, 4) = Trim("" & rst![データ1]) objExcel.Cells(i, 5) = Trim("" & rst![データ2]) objExcel.Cells(i, 6) = Trim("" & rst![データ3]) objExcel.Cells(i, 7) = Trim("" & rst![データ4]) objExcel.Cells(i, 9) = Trim("" & rst![データ5]) '***省略*** objExcel.Cells(i, 35) = Trim("" & rst![データ15]) objExcel.Cells(i, 36) = Trim("" & rst![データ16]) i = i + 1 rst.MoveNext Loop 'EXCEL保存 objExcel.ActiveWorkbook.Close objExcel.Quit rst.Close CN.Close Set rst = Nothing Set CN = Nothing Set objExcel = Nothing End Sub

  • 【VBA】アタッチとデタッチについての認識

    VBAを勉強中の者です。カテ違いならすいません。 ******************************************************* Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=SQLOLEDB;Data Source=localhost\SQLEXPRESS; " & _ "Initial Catalog=" & データベース名 & ";" & _ "Integrated Security=SSPI" rs.Open "テーブル1", cn, adOpenStatic, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ******************************************************* このコードで アタッチは「Set cn = New ADODB.Connection」、 デタッチは「cn.Close: Set cn = Nothing」 になりますか? ご教授よろしくお願い致します。

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • ADOを使用してExcelファイルをオープンし、内部結合したい。

    エクセルに2つのシートがあります。 シート名"男性用","女性用" それぞれのシートに"名前"の列があります。 この2つのシートを内部結合して検索したいのですが 可能でしょうか ----------------------シート1個の場合 Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = App.Path & "\test.xls" cn.Open Dim cmd As ADODB.Command Set rst = New ADODB.Recordset rst.Source = "Select * From [男性用$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText '------------------------------ これで取り出せますがシート2つを内部結合させたいばあい rst.Source = "Select * From [男性用$]" はどう変えたらいいでしょうか excelでなければ select * from 男性用 inner join 女性用 on 男性用.名前=女性用.名前 となると思いますが。

専門家に質問してみよう