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

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週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

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

A 回答 (3件)

こんな感じで



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
    • good
    • 2
この回答へのお礼

ありがとうございます。
参考になりました。

お礼日時:2010/03/30 14:43

はじめまして、通りすがるともうします。


上記ソースは、vb.netですか?
vb.netでしたら上記のような配列を操作したい場合には、2次元配列より
多段階配列を使用すると便利ですよ。
ちなみに、定義は以下のように定義します。

 dim aStrSku()() as string

詳細は、以下のurlを参照ください。

http://msdn.microsoft.com/ja-jp/library/dd314345 …
    • good
    • 0
この回答へのお礼

今回の処理には使いませんでしたが
後学の為になりました。

お礼日時:2010/03/30 14:45

変更させる場合は、



ReDim Preserve aStrSKU(2, x)

と後ろ側だけが出来るはずです。
⇒行・列の考えを逆にする必要が出てきます。
    • good
    • 0
この回答へのお礼

すみません。
上記の方法でエラーがでてしまいました。
違う方法で無事解決できました。
ありがとうござます。

お礼日時:2010/03/30 14:45

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

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

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

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

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

Q要素数未定の2次元配列について

【開発環境】VB6_SP5  OS:WinXP

非常に困っています。どうかご教示お願い致します。
コマンドボタンを押す度に、そのフォームのデータ(Text(n).Text)を
2次元配列に格納したいのですが、コマンドボタンを押す度にReDimを
通過するため、前に格納したデーター「配列名(0,0)等」が消えてしまいます。
Publicで使える様に配列HairetsuA~Cについて、何かよい知恵はありませんか?

Option Explicit
Public Const YousoMax = 10
Public HairetsuA() As String
Public HairetsuB() As String
Public HairetsuC() As String
Public YousoA as Integer

--------------------------------------------------
Private Sub Command1_Click()
Dim YousoB As Integer
ReDim HairetsuA(YousoA, YousoB) As String
ReDim HairetsuB(YousoA, YousoB) As String
ReDim HairetsuC(YousoA, YousoB) As String

   For YousoB = 0 To YousoMax
      If Form1.Text1.Text <> "" Then
         ReDim Preserve HairetsuA(YousoA, YousoB) As String
         ReDim Preserve HairetsuB(YousoA, YousoB) As String
         ReDim Preserve HairetsuC(YousoA, YousoB) As String
         HairetsuA(YousoA, YousoB) = Form1.Text1.Text
         HairetsuB(YousoA, YousoB) = Form1.Text2.Text
         HairetsuC(YousoA, YousoB) = Form1.Text3.Text
      Else
         Exit For
      End If
   Next
   YousoA = YousoA + 1
End Sub

分かり難い説明ですが、HairetsuAだけを取って言葉で説明しますと
コマンドボタンを押す度に
HairetsuA(0,0)にはアイウエオ
HairetsuA(0,1)にはカキクケコ
HairetsuA(0,2)にはサシスセソ
   ・
   ・
   ・
HairetsuA(0,n)にはラリルレロ

(コマンドボタンを押す)
(HairetsuA(0,0)~HairetsuA(0,n)のデータは維持したままで)

HairetsuA(1,0)にはABCDE
HairetsuA(1,1)にはFGHIJ
HairetsuA(1,2)にはKLMNO
   ・
   ・
   ・
HairetsuA(1,n)にはVWXYZ
   ・
(途中幾度かコマンドボタンを押下)
(HairetsuA(0,0)~HairetsuA(n-1,n-1)のデータは維持したままで)
   ・
HairetsuA(n,n)にはチリヌルオ

どうか良いお知恵をください。
どうぞ宜しくお願い致します。

【開発環境】VB6_SP5  OS:WinXP

非常に困っています。どうかご教示お願い致します。
コマンドボタンを押す度に、そのフォームのデータ(Text(n).Text)を
2次元配列に格納したいのですが、コマンドボタンを押す度にReDimを
通過するため、前に格納したデーター「配列名(0,0)等」が消えてしまいます。
Publicで使える様に配列HairetsuA~Cについて、何かよい知恵はありませんか?

Option Explicit
Public Const YousoMax = 10
Public HairetsuA() As String
Public HairetsuB() As String
Public Ha...続きを読む

Aベストアンサー

ちょっとメンドクサイ&難しいですが、ジャグ配列にしてはいかがでしょう
HairetsuA(YousoA)(YousoB) ってな感じで使います

説明用にあえてイモく書いている部分があります
Option Explicit

Const YousoMax = 10
Public HairetsuA
Public HairetsuB
Public HairetsuC
Public YousoA As Integer

Private Sub Command1_Click()
  Dim YousoB As Integer
  Dim bufHairetsuA
  Dim bufHairetsuB
  Dim bufHairetsuC
  
  If YousoA = 0 Then
    ReDim HairetsuA(0)
    ReDim HairetsuB(0)
    ReDim HairetsuC(0)
  Else
    ReDim Preserve HairetsuA(YousoA)
    ReDim Preserve HairetsuB(YousoA)
    ReDim Preserve HairetsuC(YousoA)
  End If
  
  ReDim bufHairetsuA(0)
  ReDim bufHairetsuB(0)
  ReDim bufHairetsuC(0)

  For YousoB = 0 To YousoMax
    If YousoB > 0 Then '変数がEmptyの時Preserve 出来ない対応
      ReDim Preserve bufHairetsuA(YousoB)
      ReDim Preserve bufHairetsuB(YousoB)
      ReDim Preserve bufHairetsuC(YousoB)
    End If
    If Form1.Text1.Text <> "" Then
       bufHairetsuA(YousoB) = Form1.Text1.Text '格納用配列に追加
       bufHairetsuB(YousoB) = Form1.Text2.Text '格納用配列に追加
       bufHairetsuC(YousoB) = Form1.Text3.Text '格納用配列に追加
    Else
       Exit For
    End If
  Next
  HairetsuA(YousoA) = bufHairetsuA  '配列書き出し
  HairetsuB(YousoA) = bufHairetsuB  '配列書き出し
  HairetsuC(YousoA) = bufHairetsuC  '配列書き出し
  YousoA = YousoA + 1
End Sub

End Subにブレイクを置いて実行して見て下さい
ウォッチウィンドウにHairetsuAなどを入れて見れば大体判るかと思います
簡単に説明すると、配列を配列に叩き込みます
コレはVariant型が何でも入る事を利用しています

相当なメモリを消費しますので、思ったより拡張できないかもしれません

>HairetsuA(n,n)にはチリヌルオ

HairetsuA(n)(n)にはチリヌルオ
となります

エクセルVBAでしか試してない(WinXP Excel2003)ので、微妙に違うかも…
がんばってねぇ~(^^)/~

ちょっとメンドクサイ&難しいですが、ジャグ配列にしてはいかがでしょう
HairetsuA(YousoA)(YousoB) ってな感じで使います

説明用にあえてイモく書いている部分があります
Option Explicit

Const YousoMax = 10
Public HairetsuA
Public HairetsuB
Public HairetsuC
Public YousoA As Integer

Private Sub Command1_Click()
  Dim YousoB As Integer
  Dim bufHairetsuA
  Dim bufHairetsuB
  Dim bufHairetsuC
  
  If YousoA = 0 Then
    ReDim HairetsuA(0)
    ...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Q配列を関数に渡す方法

VB6.0のプログラムで質問があるのですが
下のプログラムのように配列num、num1を関数AAAに
渡したいと思うのですがどうすればいいのでしょうか?
よろしくお願いいたします。

Option Explicit
Private num(10) As Integer
Private num1(10) As Integer

Private Sub Write_Click()
   AAA(num)
   AAA(num1)
End Sub

Private Function AAA(???)
   Dim i As Integer
   For i = 1 To 10
      ???(i) = i
   Next i
End Function

Aベストアンサー

コードミスしてました申し訳ない

Option Explicit
Private num(10) As Integer
Private num1(10) As Integer

Private Sub Write_Click()
   Call AAA(num)
   Call AAA(num1)
End Sub

Private Function AAA(ByRef test() As Integer)
   Dim i As Integer
   For i = 1 To 10
      test(i) = i
   Next i
End Function

ですね!

Q動的配列が存在(要素が有る)か否かを判定できますか?

VBAで、「For ループが初期化されていません」エラーが発生します。
動的配列が要素0の時に発生するようです。
動的配列の要素が生成された場合だけ、Forループしたいのですが、
どうやって判定すればよいのでしょうか?
-------------------------------
Dim 配列() As Integer
Dim i As Integer
i = 0
If (i < 0) Then ' 本当は真になったり偽になったり
ReDim 配列(0 To i)
配列(i) = a + b
i = i + 1
End If

'' if ★★★ then '' 配列が有るか確認
For Each c In 配列
MsgBox c
Next
'' end if
-------------------------------

Aベストアンサー

こんにちは。

動的配列の要素が生成された時だけ、For ~Loop するなら、#2 さんのご指摘のように、動的配列を生成したときに、フラグを立てるのが一番簡単ですね。配列変数を、Integerと最初から宣言してしまっていますから、それ自体が変化したことを、値を取り出す方法以外には、チェックできませんね。

以下は未知の変数の配列を調べる場合、VBAでは以下のような方法を使います。

 On Error Resume Next
 dummy = 配列(0)
 Err.Clear  'プロシージャ内で、使いまわしする場合は、必要
 On Error GoTo 0
 If dummy <> Empty Then
  For Each c In 配列
   MsgBox c
  Next
 End If
 dummy = Empty 'dummy を使いまわしする場合は、一旦空にする。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

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

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

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

Aベストアンサー

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

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

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QArrayListの初期値に二次元配列を設定したい(VB2005)

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。

試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。
Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)})

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

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として...続きを読む

Aベストアンサー

Dim aryhoge As New ArrayList(hoge)

QVB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?

VB6.0で、例:StrConv(Text, vbFromUnicode)とかで使用する、
「vbFromUnicode」(文字列を Unicode からシステムの既定のコードページに変換する)
は、VB.NETでは使用できないようです。(相当する定数はない?)

「vbFromUnicode」と同等の機能を、VB.NETで使用したいのですが、
どうすれば良いでしょうか?

Aベストアンサー

思いっきり、例文に「COM1」と書いてますが、USBに書き換えてくださいね^^;

それとふと思ったのですが
udtReaderWriterModeWithoutEncryption
変数は構造体ですよね?

メンバが
lngPortName
lngBardRate
というのは、型宣言をINTEGERに変換してますよね?

ちょっとばかり不安に思ったので、追記しておきました。

参考URL:http://okweb.jp/kotaeru.php3?q=1257613


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

人気Q&Aランキング