Access VBA質問箱 IV

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

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


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

【9032】AccessからExcelを操作するのですが、Excelが終了しない。 K.S 07/1/22(月) 18:15 質問[未読]
【9034】Re:AccessからExcelを操作するのですが... かみちゃん 07/1/22(月) 22:32 発言[未読]
【9035】Re:AccessからExcelを操作するのですが... K.S 07/1/23(火) 9:48 お礼[未読]
【9037】Re:AccessからExcelを操作するのですが... K.S 07/1/23(火) 13:41 お礼[未読]
【9041】Re:AccessからExcelを操作するのですが... 小僧 07/1/25(木) 12:12 回答[未読]

【9032】AccessからExcelを操作するのですが、...
質問  K.S  - 07/1/22(月) 18:15 -

引用なし
パスワード
   行いたいことは
AccessからあるExcelシートの一部分をコピーし、新規作成のブックのシートに貼り付けをしたいのです。(下記では使用最大範囲になっています)
ここで貼り付けまではうまくいくのですが、プロセス一覧にExcelが残ってしまい
終了しないのです。
ただ、[実行]-[リセット]を選択すると終了します。
何かがクリア(初期化?)されていないようなのですが、その何かが解りません。
どうか教えていただけないでしょうか?

下記が現在記述している内容です。
(ファイル名等は仮りです)

Private Sub コマンド0_Click()
On Error GoTo エラー

  Dim appExcel As Object 'Excel.Application
  Dim Book As Object   'Excel.Workbook
  Dim 最下行番号 As Long, 右端列番号 As Integer

  varinput1 = "C:\サンプルbook.xls"     '←Public定義です。
  varinput2 = "D:\temp サンプルbook.xls"   '←Public定義です。
  
  Call file_check
  
  'コピーもとのMs Excelファイルを利用できるように設定します。
  Set appExcel = CreateObject("Excel.Application") '← Excel 起動 終了しない

  Set Book = appExcel.Workbooks
  'Excelファイルのパスを指定します。
  Book.Open (varinput1)
  appExcel.Visible = False
  
  'Sheet名を指定します。
  varsheet = "サンプル"
  appExcel.Worksheets(varsheet).Select
  
  最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
  右端列番号 = Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column

  ActiveSheet.Range(Cells(1, 1), Cells(最下行番号, 右端列番号)).Copy
  
  Set Book = appExcel.Workbooks.Add
  appExcel.Visible = False 'True
  
  ActiveSheet.Range("A1").PasteSpecial
  
  '現在アクティブなブックに名前をつけて保存する(閉じない)
  Book.SaveAs Filename:=varinput2

  Book.Close
  Set Book = Nothing
  
  appExcel.Quit
  Set appExcel = Nothing

  Exit Sub
  
エラー:

  If Err.Number = 1004 Then
   Resume Next
  Else
   MsgBox Err.Number & " : " & Err.Description
  End If

End Sub

Private Sub file_check()

'----FILE 存在チェック----------------------------------------------------
    '指定したファイルの存在確認
  Dim objFSO As FileSystemObject
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  If objFSO.FileExists(varinput2) = True Then
 
   objFSO.DeleteFile varinput2
   
  End If
  Set objFSO = Nothing
'----FILE 存在チェック END -----------------------------------------------

End Sub

【9034】Re:AccessからExcelを操作するのです...
発言  かみちゃん E-MAIL  - 07/1/22(月) 22:32 -

引用なし
パスワード
   こんにちは。かみちゃん です。

こちらでは久しぶりにコメントさせていただきます。
普段は、Excel質問箱へのコメントが多いのですが・・・

>AccessからあるExcelシートの一部分をコピーし、新規作成のブックのシートに貼り付けをしたいのです。(下記では使用最大範囲になっています)
>ここで貼り付けまではうまくいくのですが、プロセス一覧にExcelが残ってしまい
>終了しないのです。

私も以前はよく経験したことなのですが、
以下のコードに修飾子appExcelがきちんとついていないように思います。

 最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
 右端列番号 = Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column

 ActiveSheet.Range(Cells(1, 1), Cells(最下行番号, 右端列番号)).Copy

 ActiveSheet.Range("A1").PasteSpecial

【9035】Re:AccessからExcelを操作するのです...
お礼  K.S  - 07/1/23(火) 9:48 -

引用なし
パスワード
   かみちゃん さんへ
早速の助言ありがとうございます。

>以下のコードに修飾子appExcelがきちんとついていないように思います。
> 最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
> 右端列番号 = Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column
> ActiveSheet.Range(Cells(1, 1), Cells(最下行番号, 右端列番号)).Copy
> ActiveSheet.Range("A1").PasteSpecial

この助言の“修飾子appExcelがきちんとついていない”ということらしいので
このコピー、ペーストの記述を検討してみます。

検討する項目が解らなかったのですが1つ判明して大変助かります。
ありがとうございました。

【9037】Re:AccessからExcelを操作するのです...
お礼  K.S  - 07/1/23(火) 13:41 -

引用なし
パスワード
   ▼かみちゃん さんへ

>以下のコードに修飾子appExcelがきちんとついていないように思います。
>
> 最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
> 右端列番号 = Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column
>
> ActiveSheet.Range(Cells(1, 1), Cells(最下行番号, 右端列番号)).Copy
>
> ActiveSheet.Range("A1").PasteSpecial

このような助言を頂き、記述を模索したところ下記記述で終了するようになりました。
ほんとうにありがとうございました。

修正した記述。

  最下行番号 = appExcel.ActiveSheet.Cells(appExcel.ActiveSheet.Rows.Count, 1).End(xlUp).Row
  右端列番号 = appExcel.ActiveSheet.Cells(1, appExcel.ActiveSheet.Columns.Count).End(xlToLeft).Column
 
  appExcel.ActiveSheet.Range(appExcel.ActiveSheet.Cells(1, 1), _
  appExcel.ActiveSheet.Cells(最下行番号, 右端列番号)).Copy
  
  Set Book = appExcel.Workbooks.Add
  appExcel.Visible = False 'True
  Book.ActiveSheet.Range("A1").PasteSpecial

【9041】Re:AccessからExcelを操作するのです...
回答  小僧  - 07/1/25(木) 12:12 -

引用なし
パスワード
   ▼K.S さん、かみちゃん さん
こんにちは。

既に解決されていて、ご覧になる機会があるかは解りませんが…。

> appExcel.Worksheets(varsheet).Select
>ActiveSheet.Range(Cells(1, 1), Cells(最下行番号, 右端列番号)).Copy

Activate や Select は潜在的なバグの元となるので
極力使用を避けたほうが安定したコードになるかと思われます。

また xlup の様な定数が使われているので
Excelが参照設定されていると思われます。
変数宣言もobject型でなく、Excelのオブジェクトを指定できそうですね。

また二つのBookを直接開くので、クリップボードにコピーしなくてもできそうです。

Private Sub コマンド0_Click()
On Error GoTo エラー

  Const varinput1 = "C:\サンプルbook.xls"
  Const varinput2 = "D:\tempサンプルbook.xls"
  Const varsheet = "サンプル"
  
  Dim xlsApp As Excel.Application
  Dim xlsWkb(1 To 2) As Excel.Workbook
  Dim xlsSht(1 To 2) As Excel.Worksheet
  Dim 最下行番号 As Long
  Dim 右端列番号 As Integer
  
  Call file_check(varinput2)
 
  Set xlsApp = CreateObject("Excel.Application")
    'xlsApp.Visible = True
  Set xlsWkb(1) = xlsApp.Workbooks.Open(varinput1)
  Set xlsWkb(2) = xlsApp.Workbooks.Add
  
  Set xlsSht(1) = xlsWkb(1).Sheets(varsheet)
  Set xlsSht(2) = xlsWkb(2).Sheets(1)
 
  最下行番号 = xlsSht(1).Cells(xlsSht(1).Rows.Count, 1).End(xlUp).Row
  右端列番号 = xlsSht(1).Cells(1, xlsSht(1).Columns.Count).End(xlToLeft).Column

  
  xlsSht(2).Range(xlsSht(2).Cells(1, 1), xlsSht(2).Cells(最下行番号, 右端列番号)).Value = _
  xlsSht(1).Range(xlsSht(1).Cells(1, 1), xlsSht(1).Cells(最下行番号, 右端列番号)).Value

  xlsWkb(2).SaveAs varinput2
  xlsWkb(2).Close
  
  xlsWkb(1).Close False
   
  xlsApp.Quit
  
  Set xlsSht(2) = Nothing
  Set xlsSht(1) = Nothing
  Set xlsWkb(2) = Nothing
  Set xlsWkb(1) = Nothing
  Set xlsApp = Nothing

  Exit Sub
 
エラー:

  If Err.Number = 1004 Then
   Resume Next
  Else
   MsgBox Err.Number & " : " & Err.Description
  End If

End Sub

Private Sub file_check(inFile As String)

  On Error Resume Next
    Kill inFile
  On Error GoTo 0

End Sub


ファイルのチェックの所は K.S さん の方が丁寧で良いと思われるのですが
一応こんなやり方もあるという事で紹介させて頂きます。

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