Win98 FirstEdition
VB6 SP3
Excel97 SR1

上記の環境において、下記のソースのように、VBからExcelを起動してデータを出力した際、Excelのブックを閉じると、「保存しますか?」の「はい」「いいえ」関わらず、あるいはブックをセーブした後閉じても、Excelが異常終了してしまいます。
ブックではなく、Excel自体を閉じた場合は全く問題ありません。

どなたか対処法をご存じな方いらっしゃいませんか?

Dim objXls As Object
Dim objBook As Object
Dim objSheet As Object

Set objXls = CreateObject("Excel.Application")
objXls.Workbooks.Add
objXls.Visible = False
Set objBook = objXls.ActiveWorkbook
Set objSheet = objBook.Worksheets(1)

(中略)
objXls.Visible = True

このQ&Aに関連する最新のQ&A

A 回答 (3件)

objXls.Visible = True の後に


objXls.UserControl = True を入れてみましょう。
自信はないのですが。
あと、VBのSP5とOffice97SR2を入れましょう。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
しばらく、ネットにアクセスできない環境におりましたので、ご返答が遅れました。

実は、質問の投稿の直後に、下記の米国MS社の対応策(英語)を見つけまして解決しておりました。
おっしゃる通りの原因・対処法でした。

http://support.microsoft.com/support/kb/articles …

お礼日時:2001/10/10 14:15

私も類似の現象で困っています。

便乗質問ですが、参考になれば。
VB6で、
Dim wkbObj As Workbook
Sub main()
 newdata = InputBox("A1に入力するデータをどうぞ")
Set wkbObj = GetObject("C:\WINDOWS\デスクトップ\adodata.xls")
wkbObj.Worksheets(1).Range("A1").Value = newdata
wkbObj.Close
End Sub

これでExcelを起動せずにadodata.xlsの内容を書き換えたところ、
次にExcelで開いても開かず、エラー表示も無い状態になります。
仕方無いので、IEからファイルを開くで開くとExcelが起動してadodata.xlsが
開きます。これを上書き保存すると、Excelで開いても見えるようになります。
なぜか、どうすれば良いか判らず、Gooで質問しようとしていたところです。
    • good
    • 0

異常終了が解消するかどうかは分かりませんが、


使用済オブジェクトを明示的にNothingしてますか?(Excelに限らず)
アプリケーションを終了させても、Excel自体のProcessが
システムに残ったままになっているとおもいます。
そのままだと実行する度にリソースを累積的に消費してまいます。

Set objSheet = Nothing
Set objBook = Nothing
Set objXls = Nothing
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
原因は#1の通りでした。

Set objSheet = Nothing
Set objBook = Nothing
Set objXls = Nothing

については、これを入れても現象は変わりませんのであえて、省略して問題カ所を最小限で書かせていただきました。

お礼日時:2001/10/10 14:27

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QEXCEL VBA すべてのブックを上書き保存して閉じる

Win8 Excel2010です。
以下のEXCEL VBA の文章を教えて下さいm--m




すべてのエクセルウィンドウを、最小化した状態で(見えなければ良い)、UserForm2.Showしながら、上書き保存してを閉じる。
その際、閉じる前に以下のマクロを実行する。
With ActiveWindow

'''罫線を表示
.DisplayGridlines = True

'''行列番号を表示
.DisplayHeadings = True

'''アウトライン記号を表示
.DisplayOutline = True

'''シート見出しを表示
.DisplayWorkbookTabs = True

'''メニューを表示
Application.CommandBars("Worksheet Menu Bar").Enabled = True

'''ツールバーを非表示
For Each cb In Application.CommandBars
cb.Enabled = True

'''数式バーの非表示
Application.DisplayFormulaBar = True

'''ステータスバーの非表示
Application.DisplayStatusBar = True

Next
End With



宜しくお願いします。

Win8 Excel2010です。
以下のEXCEL VBA の文章を教えて下さいm--m




すべてのエクセルウィンドウを、最小化した状態で(見えなければ良い)、UserForm2.Showしながら、上書き保存してを閉じる。
その際、閉じる前に以下のマクロを実行する。
With ActiveWindow

'''罫線を表示
.DisplayGridlines = True

'''行列番号を表示
.DisplayHeadings = True

'''アウトライン記号を表示
.DisplayOutline = True

'''シート見出しを...続きを読む

Aベストアンサー

こんばんは。

もしかしたら思ったようにいかない可能性があります。
単純に考える人もいますが、長くやってみないと見えてこない部分もあるはずです。
私自身、こういうものは、知っているだけに気後れがしてしまいます。
簡単なことを難しく考えているようには見えますが、意外に、この種のものは、むつかしいです。
これを土台に、いろいろ試してみてください。

以下は、ユーザーフォームのコマンドボタンにつけるものです。

>すべてのエクセルウィンドウを、最小化した状態で(見えなければ良い)、

この部分は、どうするかお任せになります。
なせなら、それは、今回の質問内容とは別の問題のように思うからです。

以下は、おかしな部分があるような疑念がわくはずですが、以前、同様のものを何度も繰り返して、Excel 2007以上では、Excel のアプリケーションが終わらない現象があります。それで、このようなコードになりました。(別の掲示板では、この内容を間違いだと決めつけた人がいますが、Quit と Saveが逆にするのは、古くからの手法です)

また、名前を付けていないブックは、名前を付けて保存するか、捨ててしまうか、どちらかになります。
ThisWorkbookを最後にしないと、このような場合は、UserFormを立ち上げたままですと、途中で終了させると、ハングやクラッシュする可能性があります。

'//
Private Sub CommandButton1_Click()
 Dim wb As Workbook
 Dim fn As Variant
 For Each wb In Application.Workbooks
  If wb.Name Like "Book#*" Then
   fn = Application.Dialogs(xlDialogSaveAs).Show
   If Not VarType(fn) = vbBoolean Then
    wb.SaveAs fn
    wb.Close False
   Else
    wb.Close False
   End If
  ElseIf Not (wb.Name = ThisWorkbook.Name Or wb.Name Like "PERONAL.*") Then
   If wb.Saved = False Then
    wb.Save
   End If
   wb.Close False
  End If
 Next
 Call SettingBack(ThisWorkbook.Windows(1))
 If ThisWorkbook.Saved = False Then
  Application.Quit
  ThisWorkbook.Close True 'ここは、逆で可能なのです。
 Else
  Application.Quit
  ThisWorkbook.Close
 End If
 Application.Quit 'これでも閉じなければ、下のコードも活かしてください。
 'Application.Quit '予備
End Sub
Sub SettingBack(wb As Window)
  Dim cb As Object
  On Error Resume Next
  With wb.Windows(1)
    .DisplayGridlines = True '罫線を表示
    .DisplayHeadings = True '行列番号を表示
    .DisplayOutline = True 'アウトライン記号を表示
    .DisplayWorkbookTabs = True 'シート見出しを表示
    Application.CommandBars("Worksheet Menu Bar").Enabled = True 'メニューを表示
    For Each cb In Application.CommandBars 'ツールバー
      cb.Enabled = True
    Next
    Application.DisplayFormulaBar = True '数式バーの非表示
    Application.DisplayStatusBar = True 'ステータスバー
  End With
  On Error GoTo 0
End Sub
'//

こんばんは。

もしかしたら思ったようにいかない可能性があります。
単純に考える人もいますが、長くやってみないと見えてこない部分もあるはずです。
私自身、こういうものは、知っているだけに気後れがしてしまいます。
簡単なことを難しく考えているようには見えますが、意外に、この種のものは、むつかしいです。
これを土台に、いろいろ試してみてください。

以下は、ユーザーフォームのコマンドボタンにつけるものです。

>すべてのエクセルウィンドウを、最小化した状態で(見えなければ良い)、...続きを読む

QCreateObjectで作成したExcelのプロセスを終了させたい。

VBからCreateObjectで作成したExcelのプロセスを終了させたいと考えています。
困っている点として、CreateObjectで作成したときにプロセスIDをどのように取得すれいいのかという点です。
宜しくお願いします。

環境
VB6.0+SP5
Windows2000+SP2
Excel2000

Aベストアンサー

VB5では、これでいいはずです。VB6でも同じでは?!

Dim ExcelObj As Excel.Application
:
:
Set ExcelObj = CreateObject("Excel.Application")
:
:
ExcelObj.ActiveWorkbook.Close (False)
ExcelObj.Quit
Set ExcelObj = Nothing


このカテゴリの人気Q&Aランキング

おすすめ情報