dポイントプレゼントキャンペーン実施中!

ブラウザからエクセルを表示してコードを実行するとエラーになる

htmlでエクセルのファイルにリンクさせてあるのですが、
ブラウザからエクセルファイルを表示してコードを実行するとエラーになります。
エクセル単体で実行すれば問題ありません。
ちなみにhtml側は、
同一フォルダに<a href="test.xls">テスト</a>と記述して、ファイル名がテスト.htmlです。

-----
WinXP、エクセル2003、IE6、です
各々バージョンアップ不可です、これらの対応は却下です。

以下にコードを記載します。
ファイル名がtest.xlsで、sheet1に記載。
sheet1は最初に保護されている状態で、パスワード無しです。
--------
'標準モジュール
sub test()
activesheet.unprotect
range("a2").select
end sub
ーーーーー
'sheet1にコマンドボタン1を設置してある。標準モジュールに記述
private sub commandbotton1_click()
userform1.show
end sub
-----------------
'userform1にコマンドボタン2を設置してある。userform1に記述
private sub commandbotton2_click()
call test
end sub
--------------
でsheet1のコマンドボタン1を実行すると、
実行時エラー'91':
オブジェクト変数またはwithブロック変数が設定されていません
となります。

activesheet.unprotect の行で停止します。
-----

こうすればブラウザからでも出来るよという回答をお願いします。

上の記述ではunprotectが書いてありますが、
別に保護解除が目的ではなく、なぜブラウザ経由ではエラーになるのか?というコード上の矛盾点みたいななのを知りたいのです、

よろしくお願いします。

A 回答 (2件)

遅くなって大変すみません。

ふだんは、このようなことはないのですが、掲示板上でゴタゴタが続いて、集中出来なく、こちらにレスをすることを忘れていました。お詫びいたします。

>エラーメッセージは「実行時エラー1004 worksheetsメソッドは失敗しました_Globalオブジェクト」となります。

このエラーは、あまり記憶にはないのですが、確か、外部オブジェクト上で使う時には、上位オブジェクトからブロパティを全部書かないと、そのようなエラーが発生します。手抜きをするとエラーが発生します。たぶん、グローバルオブジェクトとして、Worksheets がないということです。

だとすると、これはダメですね。
>Sub Test()
>With Worksheets("Sheet1")

標準モジュールに入れることには間違いありません。しかし、正式に上部オブジェクトから全部書きますと、こうなります。

Public Sub Test()
Dim xlApp As Excel.Application
Set xlApp = Excel.Application
With xlApp.ThisWorkbook.Worksheets("Sheet1")
 .Select
 .Unprotect
 .Range("A2").Select
End With
Set xlApp = Nothing
End Sub

また、ボタン側は、

Private Sub CommandButton1_Click()
 Call Module1.Test 'モジュール名から書きます。
End Sub
    • good
    • 0
この回答へのお礼

>こちらにレスをすることを忘れていました。お詫びいたします。
いえいえ、わざわざ解答をしてくれてるのにお詫びだなんて、
Wendy02さんの様な方がいるのは助かります。

で、質問の方ですが少し前進しました。
しかし .Range("A2").Select で止まります。

「実行時エラー1004 RangeクラスのSelectメソッドの失敗」 となります。
.Unprotect までは行われるので、
.Range("A2").Select 行を削除するとコードは完結します。

どうやら("A2")のSelectがうまくいってません。

でも、 .Range("A2").Value = 1 だとアクションを起こしてくれます。

一応、これで自分的には半分OKな感じですが、
いちいち動かないパターンがあるのがイライラしますね。

やはりIEでやることに無理があるのでしょかね、、、。

解答ありがとうございます

お礼日時:2010/11/26 20:38

>なぜブラウザ経由ではエラーになるのか?というコード上の矛盾点みたいななのを知りたいのです、



すべてが書かれているとは思えませんから、回答にまで結びつくかは分かりませんが、

>commandbotton1_click
わざわざ、名前を変えているのでしょうか?
普通の綴りとは違いますね。

CommandButton1_Click

>'sheet1にコマンドボタン1を設置してある。標準モジュールに記述
>private sub commandbotton1_click()
>userform1.show
>end sub

ActiveX ツールのCommandButton は、「標準モジュールに記述」ではなく、シートモジュールです。標準モジュールで、Private ステートメントでは、ボタンでは呼び出せません。

>activesheet.unprotect の行で停止します。
この原因が分かりません。

>sheet1は最初に保護されている状態で、
Sheet1 だけなら、以下でもよいかもしれません。

Sub Test()
With Worksheets("Sheet1")
 .Select
 .Unprotect
 .Range("A2").Select
End With
End Sub

この回答への補足

>CommandButton1_Click
ミスタイプでした。Buttonですね。

>CommandButton は、「標準モジュールに記述」ではなく、シートモジュールです
sheet1に記載でしたね。

>すべてが書かれているとは思えませんから
おっしゃるとおりです。
手写しでコード書き写しているのと、根本的な原因が判らないので1つづつ問題を解決したいと思いこのような形にしました。


えっとですね、もう1回やりたい事を整理しますと、
1.sheet1上の「コマンドボタン1」をクリック
2.フォーム1上の「コマンドボタン2」出現
3.フォーム1上の「コマンドボタン2」クリックすると
4.sheet1でアクションを起こしたい。
 この場合、シート保護解除→A2セレクト

※自分なりの検証なのですが、「フォーム上のコマンドボタン」から
シートに対して何らかアクションを起こそうとするとエラーになるみたいです。

実際止まるのは、標準モジュール sub test() の1行目みたいです。Wendy02さんのコードでも一緒でした。
但し、エラーメッセージは「実行時エラー1004 worksheetsメソッドは失敗しました_Globalオブジェクト」となります。

sheet1に別のコマンドボタンを設置し、フォームを呼び出さずに、直接に標準モジュールのsub test()を実行するとすんなりいきます。
どうやらフォーム上のボタンからはうまく命令が伝わらないようです。

あと、エクセル単体で実行すればWendy02さんのコードでも、自分のコードでも問題なく動きます。
IEを経由したときだけ変になるみたいなんですよね、、、。

補足日時:2010/11/22 01:17
    • good
    • 0

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