過去ログ

                                Page     632
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼Excelのファイルを開いて操作  ほびっと 04/5/20(木) 15:11
   ┗Re:Excelのファイルを開いて操作  クロ 04/5/20(木) 16:03
      ┗Re:Excelのファイルを開いて操作  ほびっと 04/5/20(木) 16:18
         ┗Re:Excelのファイルを開いて操作  クロ 04/5/20(木) 17:07
            ┗Re:Excelのファイルを開いて操作  ほびっと 04/5/20(木) 18:10
               ┗Re:Excelのファイルを開いて操作  クロ 04/5/20(木) 18:46
                  ┗Re:Excelのファイルを開いて操作  ほびっと 04/5/20(木) 18:54
                     ┗Re:お力になれないようで...  クロ 04/5/21(金) 12:51
                        ┗ありがとうございます。  ほびっと 04/5/21(金) 14:31

 ───────────────────────────────────────
 ■題名 : Excelのファイルを開いて操作
 ■名前 : ほびっと
 ■日付 : 04/5/20(木) 15:11
 -------------------------------------------------------------------------
   Access2002、Excel2002、Win2000です。
[2702]参考にしましたが、うまくいきませんでした。質問させて下さい。
やりたいことはAccessからExcelのシート操作です。
現状のコードは以下の通りです。
Sub testOpenXLS()
  Dim objXL As Object
  Dim strXLS As String
  strXLS = "C:\tmp\test.xls"
  If Dir(strXLS) = "" Then Exit Sub
  Set objXL = GetObject(strXLS)
  objXL.Application.Visible = True
  objXL.Parent.Windows(1).Visible = True
  '----- 処理 -----
  objXL.Application.Cells(1, 1) = strXLS
  '----------------
  Set objXL = Nothing
End Sub
(実際には開くファイルや処理する内容は変わります)

このコードを実行する場合、Excelの状態は次の3通りになります。
1.Excelは起動していない
2.Excelは起動しているが、Bookは開いていない
3.Excelは起動しているが、他のBookを開いている
1.2.の場合、上記コードでOKです。
3.の場合、処理がstrXLS = "C:\tmp\test.xls"にではなく
現在開いているBookに行われてしまいます。
これを直したいのでアドバイスよろしくお願いします。

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : クロ  ■日付 : 04/5/20(木) 16:03  -------------------------------------------------------------------------
   >1.Excelは起動していない
>2.Excelは起動しているが、Bookは開いていない
>3.Excelは起動しているが、他のBookを開いている
>1.2.の場合、上記コードでOKです。
>3.の場合、処理がstrXLS = "C:\tmp\test.xls"にではなく

Shell ("EXCEL.EXE C:\tmp\test.xls")
で明示的に開いてみては?

4.Excelは起動して、test.xlsを既に開いている
はどうしましょ?

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : ほびっと  ■日付 : 04/5/20(木) 16:18  -------------------------------------------------------------------------
   クロさんありがとうございます。感謝です!

>>1.Excelは起動していない
>>2.Excelは起動しているが、Bookは開いていない
>>3.Excelは起動しているが、他のBookを開いている
>>1.2.の場合、上記コードでOKです。
>>3.の場合、処理がstrXLS = "C:\tmp\test.xls"にではなく
>
>Shell ("EXCEL.EXE C:\tmp\test.xls")
>で明示的に開いてみては?

これだともうひとつ別にExcelが開いてしまいますよね。
実際の運用時は複数回動かすので、画面がExcelだらけになることは避けたいのです。

それとこの場合、その後の処理(記述)はどうなりますか?
再度Set objXL = GetObject(strXLS)とするのでしょうか?

>4.Excelは起動して、test.xlsを既に開いている
>はどうしましょ?

これはこの前段階でチェックしてるので大丈夫です。
test.xlsは新規のファイルになります。

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : クロ  ■日付 : 04/5/20(木) 17:07  -------------------------------------------------------------------------
   ちょっと変更
書き込み後にエクセルの保存ダイアログが出ます 。

Dim objXL As Object
Dim strXLS As String

strXLS = "C:\tmp\test.xls"
  If Dir(strXLS) = "" Then Exit Function
  Set objXL = CreateObject("Excel.Application")
  objXL.Visible = True
  objXL.Workbooks.Open FileName:=strXLS

  '----- 処理 -----
  objXL.Application.Cells(1, 1) = strXLS
  '---------------
  'ここでエクセルの保存ダイアログが出ます 
  objXL.Quit

  Set objXL = Nothing

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : ほびっと  ■日付 : 04/5/20(木) 18:10  -------------------------------------------------------------------------
   クロさん、さっそくにレスありがとうございます。感謝してます。

この方法でも良いと思うのですが、もう少し私のわがままに付き合ってもらえると助かります。
この方法ですと、複数のファイルを作成する場合、そのたびにExcel起動〜終了を繰り返すことになりますよね?これがどうも精神的によろしくないので(笑)。

他に方法がなければ諦めますが、
1.Excelは起動していない
 →Excelを起動して、指定のファイルを開き処理をする
2.Excelは起動しているが、Bookは開いていない
 →指定のファイルを開き処理をする
3.Excelは起動しているが、他のBookを開いている
 →開いているファイルはそのままで、指定のファイルを開き処理をする
と動けばベストと思っています。

それと、エクセルの保存ダイアログは、---処理---の所で、上書保存すれば回避できますかね?(試してなくて、すみません)

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : クロ  ■日付 : 04/5/20(木) 18:46  -------------------------------------------------------------------------
   取りあえず...
>それと、エクセルの保存ダイアログは、---処理---の所で、上書保存すれば
>回避できますかね?(試してなくて、すみません)

  '----- 処理 -----
  objXL.Application.Cells(1, 1) = strXLS
  objXL.Application.DisplayAlerts = False
  objXL.ActiveWorkbook.SaveAs Filename:=strXLS
  '--------------

こんなんでどうでしょうか?

 ───────────────────────────────────────  ■題名 : Re:Excelのファイルを開いて操作  ■名前 : ほびっと  ■日付 : 04/5/20(木) 18:54  -------------------------------------------------------------------------
   クロさん、高速対応ありがとうございます。

ひとまず、エクセルの保存ダイアログの回避はOKです。

引き続き、残りの懸案にもアドバイスいただければ幸いです。

 ───────────────────────────────────────  ■題名 : Re:お力になれないようで...  ■名前 : クロ  ■日付 : 04/5/21(金) 12:51  -------------------------------------------------------------------------
   >2.Excelは起動しているが、Bookは開いていない
>3.Excelは起動しているが、他のBookを開いている

あれから試してみたのですが、2と3の判定が出来ませんでした。
APIを利用してExcelの起動確認はできるのですが...

一応貼っておきます。

--宣言セクション--
Option Compare Database
Option Explicit
Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" _
  (ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long
------------------------------------
Function ExcelTEST2()
Dim objXL As Object
Dim strXLS As String, strClassName As String
Dim i As Integer, msg As Integer
Dim rc As Long

strClassName = "XLMAIN"
rc = FindWindow(strClassName, vbNullString)


If rc <> 0 Then
  msg = MsgBox("Excelが既に起動しています。保存してください。", vbCritical, "警告")
  Exit Function
End If

strXLS = "C:\tmp\test.xls"

  If Dir(strXLS) = "" Then Exit Function
   '1度目の処理
   Set objXL = CreateObject("Excel.Application")
   objXL.Visible = True
   objXL.Workbooks.Open Filename:=strXLS

   '----- 処理 -----
   objXL.Application.Cells(1, 1) = strXLS
   objXL.Application.DisplayAlerts = False
   objXL.ActiveWorkbook.SaveAs Filename:=strXLS
   objXL.ActiveWorkbook.Close
   '---------------

   
   '二度目以降の処理 (xlsファイルに規則性があるものとして)
   For i = 1 To 3
     strXLS = "C:\tmp\test" & i & ".xls"
     objXL.Workbooks.Open Filename:=strXLS
     '----- 処理 -----
     objXL.Application.Cells(1, 1) = strXLS
     objXL.Application.DisplayAlerts = False
     objXL.ActiveWorkbook.SaveAs Filename:=strXLS
     '--------------
     If i = 2 Then
     objXL.ActiveWorkbook.Close
     Else
     objXL.Application.DisplayAlerts = True
     objXL.Application.Quit
    
     Set objXL = Nothing
     End If
    
     Next i
   
End Function

------------------
If rc <> 0 Then
  msg = MsgBox("Excelが既に起動しています。保存してください。", vbCritical, "警告")
  Exit Function
End If

の部分を外すと2と3で起動しているExcelも閉じてしまう...
お力になれず申し訳ございません。

 ───────────────────────────────────────  ■題名 : ありがとうございます。  ■名前 : ほびっと  ■日付 : 04/5/21(金) 14:31  -------------------------------------------------------------------------
   クロさん、ありがとうございます。

貼ってもらったコード見て思ったのですが、
すでにExcelが起動しているかどうかは無視して、
いったんExcel(仮にExcel#2)を起動。
Accessでの処理終了まではそのExcel#2で各ファイルを処理。
Accessでの処理終了時にExcel#2を終了。
とすれば良いような気がしてきました。

後は何とか自力でいけるとここまでやってみようと思います。
また分からない点があったら質問させて下さい。
回答ありがとうございました。
とても勉強になりました。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 632