ここから質問投稿すると、最大10000ポイント当たる!!!! >>

お世話になっております。カナと申します。
宜しくお願いいたします。

・windowsXP
・Vbscript
・IIS5.0

インクルードしたaspファイルに、関数があるのですが、
それを実行し戻り値を取得して呼び出し元の関数に戻った際に、
エラー「この変数は宣言されていません。」が出てしまいます。

以下ソースです。


'~~~~~TEST_1.asp~~~~~~~~~


<%@ LANGUAGE="VBScript" %>
<% option explicit %>
<!-- #include file="TEST_2.asp" -->
<%

call TEST_1()

%>

<%
public function TEST_1(Data)
Dim Data

On Error Resume Next

Data=27

Call TEST_2(Data)

Response.Write(Data)%><br><%
     '↑きちんと30が取得できます

Response.Write(Err内容:" & Err.Description)%><br><%
'↑ここでエラーの確認をしています。
     '「この変数は宣言されていません。」になります。


End Function

%>

~~~~~TEST_2.asp~~~~~~~~~
<%

Public Sub TEST_2(ByRef Data)

On Error Resume Next

Response.Write("Data)%><br><%
     '↑27が表示されます

    Data=Data+3

End Sub

%>

-------------------------------------------------------
以上です。

callで関数を呼んで、実行結果は正しく取得できるのですが、戻ってきたときにエラーになるので、この先のコードを書いていったときにエラー処理等に問題が出てしまいます。

もっと長いソースを書いているときも同様のエラーが出るので、ファイルのインクルードの仕方か関数の呼び出し方など、根本的になにか問題があるのだと思うのですが・・・。

何かおかしい点があるのでしょうか?
大変困っています。
申し訳ありませんが、どなたかご教授ください。

A 回答 (2件)

すいません、このソースコードのミスを見つけたのでご指摘します。


もうだいぶ時間が経ってしまったので、解決されているかもしれませんが・・・

まず、call TEST_1() を呼んでますよね?
しかし、TEST_1の関数を見ると、「public function TEST_1(Data)」
となっており、Dataに該当する引数を渡さないで実行しているために、
エラーになってます。

Easyミスなので、FunctionやSubの呼び出し元と呼び出し先の
引数の数があっているか、全体的に見直すことをお勧めします!
    • good
    • 0

『On Error Resume Next』をコメントアウトして実行してみるとどこでエラーになっているのかの詳細が表示される場合がありますよ



TEST_1.aspで『Option Explicit』を宣言しているので
Dim宣言していない変数は使用出来ないことになります

このエラーが発生しても On Errorでトラップされてしまうので原因箇所の特定が難しくなります

投稿のソースでおかしな点は Response.Writeの引数の""の整合ぐらいのように思います
    • good
    • 0

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

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

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

Q別ファイルの共通関数をHTMLで呼び出したい

みなさんいつもお世話になっています。
今とりかかっているプロジェクトの決まりで「JavaScriptは極力使用しない」というものがあり、ボタンをクリックした時引数で指定したURLへジャンプするというのをVBScriptの共通関数で行いたいのです。

共通関数は以下関数名です。(処理内容省略しましたが、
VBScript内で呼び出すことには成功しました。)

Public sub subGotoUrl(strUrl)
。(処理内容省略)
End sub

この関数を下記ファイルでインクルードして
<!-- #include File="../../../inc/Lease/cmnFunc.inc" -->

<input type="button" name="DataAdd" value="新規登録" onClick =fncNextUrl(document.form1,"R1LM010.asp?act=<%=INSERT_DISP%>")>
・・・現在fncNextUrlというJavaScriptで実行されている部分を変更して呼び出したいのですが・・・。何か良い方法はありませんか?よろしくお願いします。

みなさんいつもお世話になっています。
今とりかかっているプロジェクトの決まりで「JavaScriptは極力使用しない」というものがあり、ボタンをクリックした時引数で指定したURLへジャンプするというのをVBScriptの共通関数で行いたいのです。

共通関数は以下関数名です。(処理内容省略しましたが、
VBScript内で呼び出すことには成功しました。)

Public sub subGotoUrl(strUrl)
。(処理内容省略)
End sub

この関数を下記ファイルでインクルードして
<!-- #include File="../../../inc/Lease/cmnFunc...続きを読む

Aベストアンサー

インクルードしてあるファイル
<!-- #include File="../../../inc/Lease/cmnFunc.inc" -->
に記述してある
subGotoUrl関数をCallしたいと言う事ですね。

ならば、#includeさえしてあれば後は通常通りに
Call *****(???) や RET = *****(???) で呼び出せば使えますよ。
(※Callは、記述しなくても問題なし)

Q[ASP]条件によってインクルードしたいファイルを変えたい。

こんばんわ。ASPにてWebページを作っております。

私はこれまで、何度もASPページ内に任意の.incファイルをIncludeして動的なWebページを作ってまいりました。
しかし、いままでは固定の.incファイルをIncludeしてきましたので下記のように、
<!-- #Include File="info.inc" -->
記述していました。

今回は・・・
sample.asp?ID=1

sample.asp?ID=2
のようにURLに付加されて送信されてくる情報によってIncludeしたいファイルを変更しなければいけません・・・。

この場合はどのように記述してやればいいでしょうか?

<% If Request("ID") = "1" Then %>
<!-- #Include File="pageA.inc" -->
<% ElseIf Request("ID") = "2" Then %>
<!-- #Include File="pageB.inc" -->
<% End If %>
単純に上のようなことでいいのでしょうか?

お手数をお掛けしますが何卒宜しくお願いいたします。

こんばんわ。ASPにてWebページを作っております。

私はこれまで、何度もASPページ内に任意の.incファイルをIncludeして動的なWebページを作ってまいりました。
しかし、いままでは固定の.incファイルをIncludeしてきましたので下記のように、
<!-- #Include File="info.inc" -->
記述していました。

今回は・・・
sample.asp?ID=1

sample.asp?ID=2
のようにURLに付加されて送信されてくる情報によってIncludeしたいファイルを変更しなければいけません・・・。

この場合はどの...続きを読む

Aベストアンサー

incの中はサーバ側のスクリプトですか?
それともクライアント側で実行させるスクリプト
ですか?

前者ならば、二つともインクルードしていても
クライアントからは見えませんので実害が
無いのでは?

後者ならば、incの中身(スクリプト、htmlを
問わず必要な物をresponse.writeで吐き出せば
良いだけでは?

QVBScript文字列をSJISからUTF8へ関数

VBScriptでSJISの文字列を、UTF8に変換し、
UTF8で設定されたMySQLへ保存したい。

SJISをUTF8に変換する関数をご教授いただきたいです。

以下をまるまるコピーさせていただき試してみたのですが、
文字化けしたメッセージが返されます。

Function TextToBin(TextData, CharSet)
Const adTypeBinary = 1
Const adTypeText = 2
Dim objStream
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = adTypeText
objStream.Charset = CharSet
objStream.Open
objStream.WriteText TextData
objStream.Position = 0
objStream.Type = adTypeBinary
Select Case UCase(CharSet)
Case "UNICODE","UTF-16"
objStream.Position = 2
Case "UTF-8"
objStream.Position = 3
End Select
TextToBin = objStream.Read
objStream.Close
Set objStream = Nothing
End Function

msgbox TextToBin("テスト","UTF-8") ←文字化ける
msgbox TextToBin("テスト","UTF-16") ←文字化けない

VBScriptでSJISの文字列を、UTF8に変換し、
UTF8で設定されたMySQLへ保存したい。

SJISをUTF8に変換する関数をご教授いただきたいです。

以下をまるまるコピーさせていただき試してみたのですが、
文字化けしたメッセージが返されます。

Function TextToBin(TextData, CharSet)
Const adTypeBinary = 1
Const adTypeText = 2
Dim objStream
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = adTypeText
objStream.Charset = CharSet
objStream.Open
objStream.WriteTe...続きを読む

Aベストアンサー

失礼、こっちの問題か

http://chaichan.lolipop.jp/vbtips/VBMemo2008-11-27.htm

QDictionaryについてその2

CreateObject("Scripting.Dictionary")でセットしたオブジェクトは関数の戻り値として取得できますか?


例)
---------------------------------------------
Dim RetObj
Dim RecValue
RetObj = CreateRec()

RecValue = RetObj.Item("1")
Response.Write(recValue)


Private Function CreateRec()
Dim RecSet

Set RecSet = CreateObject("Scripting.Dictionary")
RecSet.Add "1","山田"

CreateRec = RecSet

Exit Function

End Function
-------------------------------------------------

現在のエラー状況
●エラー タイプ
Microsoft VBScript 実行時エラー (0x800A01C2)
引数の数が一致していません。または不正なプロパティを指定しています。

(余談)セットしたオブジェクトを引数渡しは出来るのに戻り値としてとれないのは・・・知識不足ですが不思議です。。

ご教授をお願いいたします

CreateObject("Scripting.Dictionary")でセットしたオブジェクトは関数の戻り値として取得できますか?


例)
---------------------------------------------
Dim RetObj
Dim RecValue
RetObj = CreateRec()

RecValue = RetObj.Item("1")
Response.Write(recValue)


Private Function CreateRec()
Dim RecSet

Set RecSet = CreateObject("Scripting.Dictionary")
RecSet.Add "1","山田"

CreateRec = RecSet

Exit Function

End Function
-------------------------------------...続きを読む

Aベストアンサー


RecordSetでも取れるはずですが?
ソースがそれではよく判らないので断言は出来ませんが。
ただ、なんだったかなー。
一回別のモノに落とさないと関数の中・外の出入りが
出来なかったのがあったような。。。
はっきりエラーが出たソースを書いてもらえれば判るんですが。

ちなみに、sousi-niさんが質問に書いている関数↓ですが
------------------
Private Function CreateRec()
  Dim RecSet

  Set RecSet = CreateObject("Scripting.Dictionary")
  RecSet.Add "1","山田"

  CreateRec = RecSet

  Exit Function

End Function
------------------

こう書き直せます↓。この方がシャープ。
何やってるのか判りやすいし。
------------------
Private Function CreateRec()
  Set CreateRec = CreateObject("Scripting.Dictionary")
  CreateRec.Add "1","山田"
End Function
------------------


RecordSetでも取れるはずですが?
ソースがそれではよく判らないので断言は出来ませんが。
ただ、なんだったかなー。
一回別のモノに落とさないと関数の中・外の出入りが
出来なかったのがあったような。。。
はっきりエラーが出たソースを書いてもらえれば判るんですが。

ちなみに、sousi-niさんが質問に書いている関数↓ですが
------------------
Private Function CreateRec()
  Dim RecSet

  Set RecSet = CreateObject("Scripting.Dictionary")
  RecSet.Add "1","山田"

 ...続きを読む

QIISでローカル内からhttp://localhostと入れても表示されない

windows2000 server で「既定のWebサイト」上でサービスを開始させました。
ちゃんと表示されるかと思いインターネットエキスプローラを開き
http://localhost と入力して表示されるか試したのですが、下記のようなメッ
セージが表示され閲覧する事ができません。
何か打開策はありますでしょうか?





エラー
リクエストされた URL は取得できませんでした

--------------------------------------------------------------------------------

以下の URL を取得した際に: http://localhost/

次のエラーが発生しました:

以下のホスト名の IP address を調べられません. localhost
DNS サーバが以下のエラーを返しました:

Name Error: The domain name does not exist.
この意味は次の通りです:

キャッシュは URL 中のホスト名から IP address を調べることができませんでした.
アドレスが間違っていないか確認してください.

windows2000 server で「既定のWebサイト」上でサービスを開始させました。
ちゃんと表示されるかと思いインターネットエキスプローラを開き
http://localhost と入力して表示されるか試したのですが、下記のようなメッ
セージが表示され閲覧する事ができません。
何か打開策はありますでしょうか?





エラー
リクエストされた URL は取得できませんでした

--------------------------------------------------------------------------------

以下の URL を取得した際に: http://localhost/ ...続きを読む

Aベストアンサー

>しかしなぜlocalhostでは表示されないのでしょうか?

DNSの仕組みに関係します。
localhostと言う名前から127.0.0.1というIPアドレスを求めるのがDNSの役割です。
その際、WindowsNT/2000/XPのDNSサーバはhostsファイルを参照します。(hostsにない名前は、さらに上位のDNSサーバに問い合わせます。)
localhostという名前は特殊なので、hostsがその情報を持っていなくてはならないのです。

今回のケースではhostsが存在しないようなので、hostsをメモ帳で作成する手順をご紹介しておきます。 (説明の都合上、Cドライブのルートディレクトリで作業します。)
(1)次のファイルが存在するか確認してください。
C:\WINNT\system32\drivers\etc\hosts.sam
 ・存在する→Cドライブのルートディレクトリにhosts.txtと言う名前でコピーし、メモ帳で開く。
   copy C:\WINNT\system32\drivers\etc\hosts.sam c:\hosts.txt
   notepad c:\hosts.txt
 ・存在しない→メモ帳でc:\hosts.txtを新規作成する。
   notepad c:\hosts.txt

(2)次の1行をhosts.txtの最後に追加します。127.0.0.1とlocalhostの間には半角スペースを7つ以上入れ、行のおしりには改行を入れます。
127.0.0.1 localhost
     ↑     ↑
     |    改行
 半角スペースx7

(3)hosts.txtを上書き保存します。

(4)hosts.txtをシステムディレクトリに移動します。この際に拡張子txtを取り除きます。
move c:\hosts.txt C:\WINNT\system32\drivers\etc\hosts

(5)Windowsを再起動します。

以上がその手順です。
これでlocalhostが127.0.0.1として認識されるはずですが、システムディレクトリをいじりますので慎重に作業してください。
作業手順が理解できない場合、作業に不安を感じる場合はやらないほうが無難です。

>しかしなぜlocalhostでは表示されないのでしょうか?

DNSの仕組みに関係します。
localhostと言う名前から127.0.0.1というIPアドレスを求めるのがDNSの役割です。
その際、WindowsNT/2000/XPのDNSサーバはhostsファイルを参照します。(hostsにない名前は、さらに上位のDNSサーバに問い合わせます。)
localhostという名前は特殊なので、hostsがその情報を持っていなくてはならないのです。

今回のケースではhostsが存在しないようなので、hostsをメモ帳で作成する手順をご紹介しておきます。 (説明の...続きを読む

QASPで画面間のパラメタ受け渡し

こんばんは。ASP初心者です。
ASPでWEBページの作成を行っています。画面遷移をResponse.Redirect()で行っているのですが、遷移前のページと遷移後のページでパラメタを受け渡したい場合はSession("hoge") = "hogehoge"のようにセッションに入れる以外、何か方法はないでしょうか。リクエスト間でパラメタ渡せればがいいので、セッションを通じて保持しておく必要がないのです。クエリを使用するとアドレス欄に変数の値が見えてしまうのでできれば使いたくありません。

Aベストアンサー

1. Cookieを使う
2. 画面遷移を postで行い、hidden項目に値をセットする (要JavaScript)

私は面倒なのでセッション変数使ってますが、必要なくなればセッションをクリアすれば良いだけだと思います。

Session.Contents("hoge") = Empty

Qbatファイルからsql文実行

クライアントOS:WIN2000
Oracle:9i(サーバ(UNIX)上にあります)

現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。
(SQL文は単純にTBLをカウントしているだけです)

・batの中身
sqlplus %UID%/%PASS%@%SID% @test.sql > output

結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか?

・余分な情報
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
に接続されました。

Aベストアンサー

sqlplus に -S オプションを追加してみればどうでしょうか。

参考URL:http://biz.rivus.jp/sqlplus_overview.html

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む


人気Q&Aランキング