下記VBScripサンプルで2次元動的配列をつかっているのですが
redim preserveでエラになります。
(インデックスが有効範囲にありません)
原因をご伝授ください。
環境 IIS 5.0
Windows XP

index.asp

<%@ LANGUAGE="VBScript" %>
<% 'option explicit %>
<!-- #include file="test.asp" -->
<%
Dim Order()
Dim dat()
call test(Order,dat)
response.write("dat=" & dat(1,2))

%>

test.asp

<%'Option Explicit%>
<%
function test(Order_info,dat)

Dim i
redim dat(0,7)
for i=0 to 1 <- iが0の時はOK,iが1になるとエラー
redim preserve dat(i,7)
dat(i,1)="1"
dat(i,2)="2"
dat(i,3)="3"
dat(i,4)="4"
dat(i,5)="5"
dat(i,6)="6"
next

End function

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

A 回答 (1件)

ReDimで変更できるのは最終次元の添え字です



dim dat(0,7)
と宣言した場合 変更できるのは 2次元目の7側の次元です
つまり ReDim dat( 0, 8 )や ReDim dat( 0, 3 ) は許されますが
ReDim dat(1,7) など 1次元目の変更は出来ません

直感的ではないかもしれませんが添え字が固定のものを1次元目にして対処してみてはいかがでしょう

redim dat(7,0)
for i=0 to 1
  redim preserve dat(7,i)
  dat(1,i)="1"
  dat(2,i)="2"
  dat(3,i)="3"
  dat(4,i)="4"
  dat(5,i)="5"
  dat(6,i)="6"
next
といった具合で ...

この回答への補足

上手くいきました。
ありがとうございました。

補足日時:2009/05/12 13:47
    • good
    • 0
この回答へのお礼

上手くいきました。
ありがとうございました。

お礼日時:2009/05/12 13:47

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QVBScriptでCSVファイルを読み出したい

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
----------------------------------------------
dim strLine '1行ずつ読込んだデータを持つ
dim ntLineNum '行数のカウント
dim arrLine '","で区切った要素を持つ一次元配列
dim arrshop '一次元配列になった要素を2次元配列として格納

Do until .AtEndOfStream
  strLine = .ReadLine
  if 0<>strComp("",Trim(strLine)) then
ntLineNum = intLineNum + 1
  end if
  arrLine = split(strLine , ",")
  arrshop = Array(arrLines,i)
i = i + 1
loop
-----------------------------------------
msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。
Array関数が上手くないような気もします・・・。
どなたかご教授お願いします(>_<。)

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
--------------------------...続きを読む

Aベストアンサー

Arrayのところがおかしいですね。

動くか検証してないですが…
arrshop = Array(arrLines,i)
の代わりに
Redim Preserve arrshop(i+1)
arrshop(i)=arrLines
でやってみてください。
それと最初にiは0か1にでも初期化してから使う事をお勧めします。

Q配列の参照渡しで型が一致しません。

エクセル2003です。
いつもお世話になります。
以下のコードを実行すると「配列の型が一致しません。」というエラーが出ます。
typeNameで確認しても配列の型はvariant()で正しいと思うのですが。。。
皆様のお知恵を拝借させていただけないでしょうか。

--------------------------------------
Sub main()
Dim e As Variant
e = fuN()
Call pRo(e)  '←ここでエラーになる。
End Sub

Function fuN() As Variant
Dim a(0) As Variant
a(0) = "zero"
fuN = a
End Function

Sub pRo(ByRef c() As Variant)
'処理っす
End Sub
--------------------------------------

Aベストアンサー

簡単にいっていまうと、Variantは小難しい事を考えなくてもそういう風に使えるよ、っていうことです。
イメージ的にはVriant型のでっかい変数の中にVariantの配列が入ってるみたいな感じですかね。

参考URL:http://pc.nikkeibp.co.jp/article/NPC/20070803/279065/

Q2次元動的配列の第一引数のみを可変にする

ReDim Preserve aStrSKU(x, 2)
aStrSKU(x, 0) = strPre
aStrSKU(x, 1) = サブ2
aStrSKU(x, 2) = サブ3

x = x + 1

上記のソースをDo Untilでまわしているのですが、
2週目以降にxに1を足して行数だけ増やしたいのですが、
2週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

Aベストアンサー

こんな感じで

Structure column
Dim col1 As String
Dim col2 As String
Dim col3 As String
End Structure

Private Sub test()

Dim aStrSKU() As column
Dim x As Integer

Do Until x = 3
ReDim Preserve aStrSKU(x)
aStrSKU(x).col1 = "strPre"
aStrSKU(x).col2 = "サブ2"
aStrSKU(x).col3 = "サブ3"

x = x + 1
Loop

End Sub

QVBScriptで配列のソートをするには?

VBScriptで作成した配列の順番をソートする場合、どのようなコーティングを行えば、実現できるでしょうか?
ソートそのものを実装する関数がありますか?

Aベストアンサー

簡単なものなら
シンプルソート、バブルソート
再起呼び出しなどを使えるレベルならば
マージソート、クイックソート

これらのアルゴリズムの名前で検索をかければ
プログラム例が載っているサイトがみつかりますよ。

QVBSでエクセル内の行数を取得する方法

VBS初心者です。よろしくお願い致します。

VBSでエクセル内のデータの行数を取得する方法を教えて下さい。

セル1 セル2 セル3 セル4
123   234   875   ads
あい  うえ  458   444

上記がエクセルの内容だとしたら、3行という結果が欲しいのです。

どうぞよろしくお願い致します。

Aベストアンサー

>自分でエクセル内のデータを1行にして再度実行すると、値はやはり4と返してきます
書式か何か残ってるんじゃないでしょうか

>objExcel.Visible = false
true にして実行してみると判るかと思いますが、
エクセルを非表示するという設定を(明示的に)しています。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBSで"をエスケープする文字は?

VBSで"をエスケープする文字はなんでしょうか?

Aベストアンサー

エスケープといった考えが VBSではなかったように思います

"をあらわすには "で括る必要が生じます
たとえば "abc" といった内容なら """abc""" といったリテラルになります
一番外側の "のペアが 文字列としての"になります

"ab"cが欲しいなら """ab""c"
a"bc"が欲しいなら "a""bc"""
a"b"cがほしいなら "a""b""c"
といった具合になります

Q【VBScript】変数のスコープ

変数のスコープについて詳しく教えて下さい。

どこで宣言すれば、どこまで有効か知りたい。

条件分岐やループ、ファンクション等でのスコープが分かりません。

特に、ファンクションの中のファンクションとかです。

参考サイトやヒントだけでも良いので教えて下さい。

Aベストアンサー

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)で宣言された変数は当該プロシージャ内のみで有効
・プロシージャのネスト時に参照可能な変数は、グローバル変数と自プロシージャ内で宣言された変数のみ(=自分を呼び出した親プロシージャ内の変数を参照することはできない)
・プロシージャの引数がグローバル変数と同名の場合、引数が優先される
・条件分岐やループの内側か外側かは関係ない(内側で宣言した変数を外側で参照できる)
#プロシージャ≒「ファンクション」です。

■参考URL
http://www.google.com/search?q=vbscript+%E5%A4%89%E6%95%B0+%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97
http://www.keynus.co.jp/~uhara/html/vbscript/16.htm

これで答えになっているでしょうか??

少し厳しいかもしれませんが、ご自分でサンプルコードを書いて実行してみましたか?
そういう経験の積み重ねが土台を作る一つの要因になるのだと私は思っています。
もしも検証できない状況にあるのでしたら、ごめんなさい。

かく言う私自身、VBScriptには明るくないので、正しいかどうかわかりませんが、
結論から言うと以下の通りかと思っています。

■結論
・グローバル領域(=いかなるプロシージャにも所属しない領域)で宣言された変数は、どこからでも参照可
・プロシージャ内(←ネストレベルは関係ない)...続きを読む

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 )
と言った具合です


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報