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に行われてしまいます。 これを直したいのでアドバイスよろしくお願いします。 |
>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を既に開いている はどうしましょ? |
クロさんありがとうございます。感謝です! >>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は新規のファイルになります。 |
ちょっと変更 書き込み後にエクセルの保存ダイアログが出ます 。 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 |
クロさん、さっそくにレスありがとうございます。感謝してます。 この方法でも良いと思うのですが、もう少し私のわがままに付き合ってもらえると助かります。 この方法ですと、複数のファイルを作成する場合、そのたびにExcel起動〜終了を繰り返すことになりますよね?これがどうも精神的によろしくないので(笑)。 他に方法がなければ諦めますが、 1.Excelは起動していない →Excelを起動して、指定のファイルを開き処理をする 2.Excelは起動しているが、Bookは開いていない →指定のファイルを開き処理をする 3.Excelは起動しているが、他のBookを開いている →開いているファイルはそのままで、指定のファイルを開き処理をする と動けばベストと思っています。 それと、エクセルの保存ダイアログは、---処理---の所で、上書保存すれば回避できますかね?(試してなくて、すみません) |
取りあえず... >それと、エクセルの保存ダイアログは、---処理---の所で、上書保存すれば >回避できますかね?(試してなくて、すみません) '----- 処理 ----- objXL.Application.Cells(1, 1) = strXLS objXL.Application.DisplayAlerts = False objXL.ActiveWorkbook.SaveAs Filename:=strXLS '-------------- こんなんでどうでしょうか? |
クロさん、高速対応ありがとうございます。 ひとまず、エクセルの保存ダイアログの回避はOKです。 引き続き、残りの懸案にもアドバイスいただければ幸いです。 |
>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も閉じてしまう... お力になれず申し訳ございません。 |
クロさん、ありがとうございます。 貼ってもらったコード見て思ったのですが、 すでにExcelが起動しているかどうかは無視して、 いったんExcel(仮にExcel#2)を起動。 Accessでの処理終了まではそのExcel#2で各ファイルを処理。 Accessでの処理終了時にExcel#2を終了。 とすれば良いような気がしてきました。 後は何とか自力でいけるとここまでやってみようと思います。 また分からない点があったら質問させて下さい。 回答ありがとうございました。 とても勉強になりました。 |