[リストへもどる]
一括表示

投稿時間:2002/12/04(Wed) 21:07
投稿者名:yoshi
URL :
タイトル:
VBでエクセルを閉じる時・・・
はじめまして。VB初心者です。よろしくお願いします。
もしかしたら2件同じ質問をしているかもしれません。
もしそうなっていましたらご面倒ではありますが削除してください。

早速ですが、現在VB・エクセル間でデータのやり取りをするプログラムを組んでいます。
事前バインディング、オブジェクトへの参照を変数代入、保存ダイアログボックスの非表示、
ファイルの上書き保存、エクセルの終了、オブジェクトの解放とちゃんとやったつもりなの
ですが下記の★のところでエラーがでてしまいます。
「実行時エラー'91':
オブジェクト変数またはWithブロック変数が設定されていません。」
とでます。
また、エラーが出る前には下記のプロシージャより前のプロシージャだと思いますが、
上書き保存の時に保存ダイアログボックスが表示され上書き保存もできませんでした。


    Dim xlApp As Excel.Application           'エクセル 事前バインディング
    Dim xlBook As Excel.Workbook
    Dim Spara As Excel.Worksheet
    Dim Skekka As Excel.Worksheet

Private Sub seireki_Change()
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\吉原昌也\デスクトップ\システム")
    Set Spara = xlBook.Worksheets("パラ")

    Spara.Range("D29").Value = seireki.Text
    Call shousai

  ★xlApp.DisplayAlerts = False
    xlApp.SaveWorkspace ("システム")
    xlApp.Quit
    Set Spara = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

End Sub

何日間か原因を自分なりに考えたのですが、わからず質問させていただきました。
力不足でもうしわけありませんがどなたかのご意見をお聞かせいただきたいです。
説明不足かもしれませんがその時にはご指摘よろしくお願いします。

投稿時間:2002/12/04(Wed) 22:01
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBでエクセルを閉じる時・・・
>     Call shousai
>
>   ★xlApp.DisplayAlerts = False

ここの Call shousai は何をしているのでしょうか?
プロシージャを呼んでいるなら  xlApp 等の変数は破棄されてしまいますから
次の ★xlApp.DisplayAlerts = False  xlAppは何も設定されていない状態に
なってしまった為にエラーが発生したかと思います。
モジュールレベルで宣言するか Call shousai の内容を同じプロシージャ内に書いて下さい。

まず、一度 Call shousai の部分をコメントアウトして試して下さい。



投稿時間:2002/12/04(Wed) 22:45
投稿者名:yoshi
URL :
タイトル:
Re^2: VBでエクセルを閉じる時・・・
花ちゃん様、はじめまして。
いつも参考にさせていただいております。
お返事ありがとうございます。

> ここの Call shousai は何をしているのでしょうか?
> プロシージャを呼んでいるなら

おっしゃるとおりです。

> モジュールレベルで宣言するか Call shousai の内容を同じプロシージャ内に書いて下さい。

モジュールレベルで宣言するとはどのようにするのでしょうか?オブジェクトの代入をまとめてする
ということでしょうか?初心者でよくわからないのですが、是非ご教授のほどよろしくお願いいたし
ます。
shousaiは他のプロシージャからも呼びだすので一つ一つが長くなると思いcallで呼び出すかたちに
しています。

> まず、一度 Call shousai の部分をコメントアウトして試して下さい。

そのようにしてみましたところ以前の場所ではエラーがでませんでした。花ちゃん様の言われた通りなんじゃない
でしょうか。

投稿時間:2002/12/04(Wed) 23:13
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: VBでエクセルを閉じる時・・・
誉められるような方法ではないのですが

下記の部分をフォームの宣言領域(General)に記入して見て下さい。

Dim xlApp As Excel.Application 'エクセル 事前バインディング
Dim xlBook As Excel.Workbook
Dim Spara As Excel.Worksheet
Dim Skekka As Excel.Worksheet

但し、十分注意しないとExcelが解放されない等の不具合が発生します。

投稿時間:2002/12/04(Wed) 23:18
投稿者名:yoshi
URL :
タイトル:
Re^4: VBでエクセルを閉じる時・・・
説明不足でした、すいません。宣言は宣言領域でやってはいるんですよ。
おっしゃるとおり解放がちゃんとなされていません。
なぜなんでしょう???

投稿時間:2002/12/05(Thu) 00:14
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: VBでエクセルを閉じる時・・・
> 説明不足でした、すいません。宣言は宣言領域でやってはいるんですよ。

だったら Call shousai 内の処理に問題があるのではないですか?


> おっしゃるとおり解放がちゃんとなされていません。
> なぜなんでしょう???

今はエラーが発生して途中で処理が中断されているから解放処理ができていないからだと思います。


# コードを投稿される場合 図表モード で投稿して下さい。今からでも修正でできます。

投稿時間:2002/12/05(Thu) 00:29
投稿者名:yoshi
URL :
タイトル:
Re^6: VBでエクセルを閉じる時・・・
> 先のサンプルではプロシージャ内で変数を宣言されているように見えましたが?
失礼しました。以後気をつけます。

> フォームの Option Explicit の次の行で宣言していますか?
いえ。していませんでした。
Option Explicitは変数の宣言を強制するものですよね?

> 今は途中でエラーが発生して解放処理がされていないからだと思います。
解放されていないのが3,4つあるのですがそれもなのでしょうか?

投稿時間:2002/12/05(Thu) 00:40
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^7: VBでエクセルを閉じる時・・・
> 解放されていないのが3,4つあるのですがそれもなのでしょうか?
その都度残っている Excelを終了していますか?
そのExcelを選択して終了ボタンを押して下さい。2度繰り返さないと終了しないようです。

理由は解りませんが、途中でプロシージャに処理を移動しても問題ないようです。
従って、shousai 内での処理に問題があるのではないでしょうか?
Skekka の使い方とか

投稿時間:2002/12/05(Thu) 01:05
投稿者名:yoshi
URL :
タイトル:
Re^8: VBでエクセルを閉じる時・・・
> その都度残っている Excelを終了していますか?
その都度終了しています。

以下のようにしたのですが、shousaiではオブジェクトの代入や解放は必要ないと考えてよいのでしょうか?

Private Sub seireki_Change()
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\吉原昌也\デスクトップ\システ  ム")
    Set Spara = xlBook.Worksheets("パラ")
    Set Skekka = xlBook.Worksheets("結果")
    Set Sjinkou_m = xlBook.Worksheets("人口男")
    Set Sjinkou_f = xlBook.Worksheets("人口女")
    Set Skiso_m = xlBook.Worksheets("基礎男")
    Set Skiso_f = xlBook.Worksheets("基礎女")
    Set Skuriagari_m = xlBook.Worksheets("男層繰り上がり")
    Set Skuriagari_f = xlBook.Worksheets("女層繰り上がり")
    Set Shyouka = xlBook.Worksheets("評価2")

    Spara.Range("D29").Value = seireki.Text
    Call shousai

    
    xlApp.DisplayAlerts = False
    xlApp.SaveWorkspace ("システム")
    xlApp.Quit
    Set Spara = Nothing
    Set Skekka = Nothing
    Set Sjinkou_m = Nothing
    Set Sjinkou_f = Nothing
    Set Skiso_m = Nothing
    Set Skiso_f = Nothing
    Set Skuriagari_m = Nothing
    Set Skuriagari_f = Nothing
    Set Shyouka = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

End Sub

Public Sub shousai()
    detail.AutoRedraw = True
        detail1.AutoRedraw = True
        detail.Cls   'Line(0, 0) - Step(1500, 1500), RGB(255, 255, 255), BF
        detail1.Cls   'Line(0, 0) - Step(1500, 1500), RGB(255, 255, 255), BF
        If bunpu.Text = "コーホート人口" Then
            For a = 0 To 10                                 '現在のデータの代入
                pira.p_m(a) = Skekka.Cells(1, 112 + a).Value
                pira.p_f(a) = Skekka.Cells(2, 112 + a).Value
                pira1.p_m(a) = Skekka.Cells(1, 124 + a).Value
                pira1.p_f(a) = Skekka.Cells(2, 124 + a).Value
            Next a
            
            
            For B = 0 To 10                                 '人口ピラミッドの描画
                detail.Line (765, 135 + 133 * B)-Step(pira.p_m(10 - B) / 2, -100), RGB(220 -         B * 6, 220, 220), BF
                detail.Line (735, 135 + 133 * B)-Step(-(pira.p_f(10 - B) / 2), -100), RGB          (220 - B * 6, B * 6, 20 + B * 6), BF
                detail1.Line (765, 135 + 133 * B)-Step(pira1.p_m(10 - B) / 2, -100), RGB(220 -         B * 6, 220, 220), BF
                detail1.Line (735, 135 + 133 * B)-Step(-(pira1.p_f(10 - B) / 2), -100), RGB         (220 - B * 6, B * 6, 20 + B * 6), BF
            Next B
            
            
        End If
                    
        If bunpu.Text = "年少人口" Then
            san(0).p_n = Skekka.Range("DH15").Value
            san(1).p_n = Skekka.Range("DH17").Value
            detail.Line (750 - san(0).p_n / 2, 750 - san(0).p_n / 2)-Step(san(0).p_n, san        (0).p_n), RGB(153, 204, 51), BF
            detail1.Line (750 - san(1).p_n / 2, 750 - san(1).p_n / 2)-Step(san(1).p_n, san        (1).p_n), RGB(153, 204, 51), BF
        End If
        If bunpu.Text = "生産年齢人口" Then
            san(0).p_s = Skekka.Range("DI15").Value
            san(1).p_s = Skekka.Range("DI17").Value
            detail.Line (750 - san(0).p_s / 2, 750 - san(0).p_s / 2)-Step(san(0).p_s, san        (0).p_s), RGB(153, 204, 51), BF
            detail1.Line (750 - san(1).p_s / 2, 750 - san(1).p_s / 2)-Step(san(1).p_s, san        (1).p_s), RGB(153, 204, 51), BF
        End If
        If bunpu.Text = "老年人口" Then
            san(0).p_r = Skekka.Range("DJ15").Value
            san(1).p_r = Skekka.Range("DJ17").Value
            detail.Line (750 - san(0).p_r / 2, 750 - san(0).p_r / 2)-Step(san(0).p_r, san        (0).p_r), RGB(153, 204, 51), BF
            detail1.Line (750 - san(1).p_r / 2, 750 - san(1).p_r / 2)-Step(san(1).p_r, san        (1).p_r), RGB(153, 204, 51), BF
        End If
        detail.AutoRedraw = False
        detail1.AutoRedraw = False
    
End Sub

投稿時間:2002/12/05(Thu) 01:09
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^8: VBでエクセルを閉じる時・・・
上記では、エラーや問題が発生しているのでしょうか?

>以下のようにしたのですが、shousaiではオブジェクトの代入や解放は必要ないと考えてよいのでしょうか?
詳しくは、私も解りませんが現時点では必要ないかと思いますが、shousai 内でエラーが発生した場合
等では問題があるかと思います。
私なら、同じプロシージャ内に記入してエラーが発生した場合エラー処理で解放するようにします。

投稿時間:2002/12/05(Thu) 01:17
投稿者名:yoshi
URL :
タイトル:
Re^10: VBでエクセルを閉じる時・・・
> No.1728番のコードではエラーやExcelが残ったりはしないのですか?
エラーは出ますが違う場所なので関係はないと思います。
エクセルは残りませんでした。

花ちゃん様、夜中まで付き合っていただいてありがとうございました。