プロが教えるわが家の防犯対策術!

オブジェクトが必要です・・・・・

すみません、判りません、丸投げです(爆)、申し訳ありませんがどなたか完成していただけませんか?;;

また、この辺りをサルでも判るように解説してくれていて勉強し易いサイトがあったら教えてください・・・


Private Sub コマンド1_Click()
Dim xlsApp As Excel.Application
Dim xlsBook As Excel.Workbook
Dim xlsSht As Excel.Worksheet

Set xlsApp = CreateObject("Excel.Application")
Set xlsBook = xlsApp.Workbooks.Open("■■■■■.xls")
Set xlsSht = xlsWkb.Sheets(■■■■)

If xlsBook.ReadOnly Then
xlsBook.Close
MsgBox "そのファイルは既に開かれています。"
xlsApp.Quit
Else
xlsBook.Close
End If

Set wkb = Nothing: Set xls = Nothing

Exit_exOpenEditC:
Exit Sub

Err_exOpenEditC:
MsgBox Err.Number & " - " & Err.Description
Resume Exit_exOpenEditC
End Sub

accessからexcelファイルをシートを指定して開き、重複の場合は開かない様にし、メッセージボックスを表示させたいのです・・・

A 回答 (5件)

No2 です。



> ※前回コメントした後に気が付きましたがxlsBook.Closeが2つあるのが間違いでした、Elseの所はxlsApp.Visible = Trueに修正しました

正解です。

> 結果現状では、作ったコードでファイル重複防止は成功していますがシートの指定が出来てない状態です

  Set xlsSht = xlsBook.Sheets("シート名")  ' (1)
  xlsSht.Activate              ' (2)
  (2) は 「重複ではない」 場合に記述。

何をするプログラムかはっきりしませんが
ブックを開くだけで、あとはユーザーまかせ
ということなら
上記 (1) は 不要で、 単に
  xlsBook.Sheets("シート名").Activate
で済みますね。

>piroin654さんへ
> なお慎重を期すならば、私の提示したコードの最後は、
>
> Err_コマンド0_Click:
> MsgBox Err.Description
> Resume Exit_コマンド0_Click
> wkb.Close
> Set wkb = Nothing
> oApp.Close
> oApp.Quit
> Set oApp = Nothing
> End Sub
>
> のように、Quitを追加してください。

Resume ステートメントの後に何を記述しても
実行されることはないと思いますが。
    • good
    • 0
この回答へのお礼

>  Set xlsSht = xlsBook.Sheets("シート名")  ' (1)
>  xlsSht.Activate              ' (2)

まさにこの2行が今回たどり着けなかった答えでした、他にも教えて頂いた事もありますのでその限りではないのですが、この2行、本当に助かりました、ありがとうございます

正しいコードを見てどうしてそれが必要なのかではなく「正しいコードに書いてあるから必要」と言う風にしか覚えていけない私にとっては、特に2行目は完成させられないコードでした、答えを導き出すヒントすら見えてませんでしたorz
これから勉強をしていって果たしてコードを理論的に組めていくのかは不安な所でありますが、出来るだけこちらで質問しないように頑張ります・・・

お礼日時:2010/04/19 09:47

>このシートの指定部分を教えてください



Set wkb = oApp.Workbooks.Open(filename:=CurrentProject.Path & "\myDD.xls", ReadOnly:=False)

の後に、

oApp.Worksheets("Sheet2").Select

を挿入。

>拝見したところファイルの存在確認など精度の上がっている
>所も有りますが、結果として目的に対してこのコードと同じ
>ものが出来るように見受けられるのですが・・・・

見ただけでわかるようなら、

>すみません、判りません、丸投げです(爆)、

のようなことを書くようなレベルの方では
ないような気がしますが?

追加説明として、
「オブジェクトが必要です」
というエラーが出るのは参照設定が正確ならば、

>Set xlsSht = xlsWkb.Sheets(■■■■)

のところに対してエラーが発生しています。
このエラーが発生すると指定のファイルを
単独で開こうとしても開きません。
一度、空のExcelを開いてそれから当該の
ファイルをクリックすれば開きます。
ひょっとしたら生成したインスタンス
ほど開き直しがでるかもしれません。
理由は「オブジェクトが必要です」だからです。
つまり、オブジェクトの指定が中途半端に
なっているからで、一度失敗するとインスタンス
が生成されてシステムがメモリを開放しないためです。
一度、開きなおすとインスタンスは開放されると
思いますが。

>あとは、応用です。

と言ったのは、私の提示したコードには

シートの指定はしていません。

つまり、まずは確実にファイルが開くか確認
してください、ということです。それから
シートの指定をするコードを追加する。
それぞれの段階でエラーが発生したら
デバッグする。そこで「オブジェクトが必要です」
というエラーがどの段階で、どういう形で出るか、
ブレークポイントを設定しながらデバッグし、
エラーの箇所を確認する、ということです。
これが、
>あとは、応用です。
といった意味です。順序を踏んでやっていけば
判らないところが見つかると思いますが。

たとえば、エラートラップのところで、

Exit_コマンド0_Click:
' wkb.Close
' Set wkb = Nothing
' oApp.Close
' oApp.Quit
' Set oApp = Nothing
Exit Sub
として、チェックを一つづつはずして
何が起こるか確認してみてください。

エラー処理は組み立てるコードにより違ってきます。
現在は対応できても、この後追加するコードによっては
同じ現象が起きる可能性は十分あります。それだけ
Excelを扱うのは慎重にしなければならない、ということです。

なお慎重を期すならば、私の提示したコードの最後は、

Err_コマンド0_Click:
MsgBox Err.Description
Resume Exit_コマンド0_Click
wkb.Close
Set wkb = Nothing
oApp.Close
oApp.Quit
Set oApp = Nothing
End Sub

のように、Quitを追加してください。

この回答への補足

>見ただけでわかるようなら、

>>すみません、判りません、丸投げです(爆)、

>のようなことを書くようなレベルの方では
>ないような気がしますが?

大体が判っても結果的に完成させられないのですからやはり「その程度のレベル」なんだと思います、皆さんの様に質問に答えられるレベルになるのはハードルが高過ぎです、が、今後も努力はして見ます

>追加説明として、
>「オブジェクトが必要です」
>というエラーが出るのは参照設定が正確ならば、

あ、いえ、ファイルオブジェクトのエラーはbonaronさんのおかげで突破できました、前回の補足に書かせていただきましたが、現状はファイの重複防止は成功していますがシートの指定が出来ない状態なのです

補足日時:2010/04/19 09:30
    • good
    • 0

以下のサイトにExcelが開いていたり


使用中の場合に対処する関数を作られて
います。関数名はAleadyOpenedです。

http://www.f3.dion.ne.jp/~element/msaccess/AcRes …

この関数を標準モジュールに貼り付け、
提示のコードを以下のように訂正して
ください。

一応、Excelのファイル名をmyDD.xlsに
しています。必要に応じて変更してください。

このコードはAccess2000のウィザードを利用
してそのコードを作り直しています。他の
バージョンでは生成されるコードが違う
ところもあります。とくに、

oApp.UserControl = True

の部分は違うかもしれません。違えば
変更しておいてください。以下コードです。

Private Sub コマンド0_Click()
On Error GoTo Err_コマンド0_Click

Dim oApp As New Excel.Application
Dim wkb As Excel.Workbook
Dim strFileName As String

strFileName = CurrentProject.Path & "\myDD.xls"

'ここでファイルが開かれているか、存在するかチェックする

Select Case AleadyOpened(strFileName)
Case vbYes
MsgBox "'" & strFileName & "' は使用中です。", vbCritical
Exit Sub
Case vbCancel
MsgBox "'" & strFileName & "' が見つかりません。", vbCritical
Exit Sub
End Select

Set oApp = CreateObject("Excel.Application")
Set wkb = oApp.Workbooks.Open(filename:=CurrentProject.Path & "\myDD.xls", ReadOnly:=False)
oApp.Visible = True
On Error Resume Next
oApp.UserControl = True

Exit_コマンド0_Click:
Exit Sub

Err_コマンド0_Click:
MsgBox Err.Description
Resume Exit_コマンド0_Click
wkb.Close
Set wkb = Nothing
oApp.Close
Set oApp = Nothing
End Sub

あとは、応用です。

この回答への補足

お答えありがとうございます
そちらのサイトも存じていまして、拝見して既に参考にさせていただいて作成したのが今回のコードなのです

piroin654さんのおっしゃられるのは、丸ごとそちらのコードに変えればシートを指定して開くまで修正可能と言う事でよろしいでしょうか?、拝見したところファイルの存在確認など精度の上がっている所も有りますが、結果として目的に対してこのコードと同じものが出来るように見受けられるのですが・・・・

>あとは、応用です。

そこが判らないので今回の質問をさせて頂いているのですが・・・・・
しかも自作関数となると更に輪がかかります

結果現状では、作ったコードでファイル重複防止は成功していますがシートの指定が出来てない状態です
このシートの指定部分を教えてください、おねがいします

それともこのコードを修正してのシートの指定は不可能と言う事なのでしょうか?


※前回コメントした後に気が付きましたがxlsBook.Closeが2つあるのが間違いでした、Elseの所はxlsApp.Visible = Trueに修正しました

補足日時:2010/04/15 11:27
    • good
    • 0

> Set xlsBook = xlsApp.Workbooks.Open("■■■■■.xls")


> Set xlsSht = xlsWkb.Sheets(■■■■)

xlsWkb は 上の行で開いたブックのオブジェクト変数 xlsBook の間違いでしょう。

この回答への補足

『xlsWkbをbookに置き換えてSet xlsSht = xlsBook.Sheets(■■■■)にする』
と言うお答えでよろしいでしょうか?

今度は「インデックスが有効範囲内にありません」と言うエラーになってしまいました・・・

引き続きご教授お願いいたします::

補足日時:2010/04/14 13:20
    • good
    • 0
この回答へのお礼

すみません、勘違いでした
インデックスが有効範囲内に無い > シート名が無い > シート名を間違えていた
"でシート名を囲うのを忘れていましたorz

お答え頂いたとおりにしたところ、エラーは出ないのですが、
excelファイルが開きませんでした
正確には、タスクのプロセスには一瞬EXCELの文字が表示されるのですが、
直ぐに閉じているようです、どうしたら良いでしょうか

引き続きよろしくお願いします

また、お分かりの方がいらっしゃいましたらご教授下さい・・・

お礼日時:2010/04/14 14:05

Microsoft Visual Basicのウィンドウで「ツール(T)→参照設定」でMicrosoft Excel XX.XX Object Library


にチェックが入っていますか?

この回答への補足

早速の投稿ありがとうございます

はい、Microsoft Excel 11.0 Object Libraryにチェックマークがついています

補足日時:2010/04/14 11:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!