文字列の配列の場合
Dim m As Variant
Dim moji As String

m=Array("aa","bb","cc","dd",・・・)
moji=m(1)

とすれば"bb"がmojiに代入されるのはわかるのですが
これを二次元配列(3行4列)にする場合どのように
宣言(Dim~や、Array~)等はどのように記述すればよろしいですか?


基本的な質問でごめんなさい。
よろしくお願いします。

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

A 回答 (6件)

oribeyakiさん ありがとうございます。


「Type」の意味は「独自の構造体をつくってみては?」という事だったのですね。
それならば納得です。
感謝です。
    • good
    • 0

1の方ではないですが、「TYPE」です。


(※用法的にはTYPEと動的配列を併用することが多いです)

◇宣言部
Private Type TEST
  strA As String
  strB As String
  lngC As Long
End Type

Private TestArray() As TEST

実行部
sub subTEST()
Dim I as integer

ReDim TestArray(0 to 9)

For I = 0 To 9
TestArray(I).strA = "A"
TestArray(I).strB = "B"
TestArray(I).lngC = I
Next

このような形になります。
この利点としては、異なるデータ型のものを一元管理できることがあげられます。
(DBのレコードをそのまま取り込めるので非常に便利)

でわ。
    • good
    • 0

サンプルです。

全て2次元配列を作成します。
しかし、※3subArrayは2次元配列のように見せているだけで、VBでいう2次元配列というものとは、ちょっと違います。

※1と※2は配列要素が宣言してあるのと、実行途中で要素が定まるという違いがあります。


※1に適したものの例(要素数が変わることがなく、要素数があらかじめわかっているもの)
信号の色、性別、都道府県、血液型 など
※2に適したものの例(要素数が変わる恐れがある。もしくは要素数があらかじめわからない)
生徒の数、ユーザに都道府県を選択させたあとの市町村の数 など
※3に適したものの例
特に適したものはないが、プログラミングが楽。ただ宣言がVariantであるためにメモリ消費が大きいので、膨大な配列には使用を避けた方がいいかも?


※1
Sub subDim()
  Dim m(2, 3) As String
  
  Dim i  As Long
  Dim j  As Long
  
  m(0, 0) = "aa": m(0, 1) = "bb": m(0, 2) = "cc": m(0, 3) = "dd"
  m(1, 0) = "ee": m(1, 1) = "ff": m(1, 2) = "gg": m(1, 3) = "hh"
  m(2, 0) = "ii": m(2, 1) = "jj": m(2, 2) = "kk": m(2, 3) = "ll"
  
  For i = LBound(m, 1) To UBound(m, 1)
    For j = LBound(m, 2) To UBound(m, 2)
      Debug.Print m(i, j),
    Next j
    Debug.Print
  Next i
End Sub

※2
Sub subRedim()
  Dim m() As String
  
  Dim i  As Long
  Dim j  As Long
  
  ReDim m(2, 3) As String
  m(0, 0) = "aa": m(0, 1) = "bb": m(0, 2) = "cc": m(0, 3) = "dd"
  m(1, 0) = "ee": m(1, 1) = "ff": m(1, 2) = "gg": m(1, 3) = "hh"
  m(2, 0) = "ii": m(2, 1) = "jj": m(2, 2) = "kk": m(2, 3) = "ll"
  
  For i = LBound(m, 1) To UBound(m, 1)
    For j = LBound(m, 2) To UBound(m, 2)
      Debug.Print m(i, j),
    Next j
    Debug.Print
  Next i
End Sub

※3
Sub subArray()
  Dim m  As Variant
  
  Dim i  As Long
  Dim j  As Long
  
  m = Array(Array("aa", "bb", "cc", "dd"), Array("ee", "ff", "gg", "hh"), Array("ii", "jj", "kk", "ll"))
  
  For i = LBound(m) To UBound(m)
    For j = LBound(m(i)) To UBound(m(i))
      Debug.Print m(i)(j),
    Next j
    Debug.Print
  Next i
End Sub



それと#1のBigBoobsさんの発言で「type」とありますが、ぼくはその方法を知らないです。
その方法はどんな方法か、もしこの発言を見てたらサンプルを載せてもらえませんか?
    • good
    • 0
この回答へのお礼

いつもいつもありがとうございます。

ここに質問するといっつも
知らないことばっか吸収できてすごく
勉強になります。

お礼日時:2002/01/15 00:57

こんにちは。

maruru01です。
配列の要素数が決まっている場合(例えば3行4列)は、
Dim m(2, 3) As String
Dim moji As String

m(0, 0) = "aa"
m(0, 1) = "bb"
  :
  :
moji = m(0, 1)
こんな感じで良いのではじゃないでしょうか。
要素数が未定の場合は動的配列宣言して、後で宣言をしなおせば良いと思いますが。
Dim m() As String
要素数がa行b列に決まったら、
ReDim m(a-1, b-1)
として、各要素の値を代入していきます。
では。
    • good
    • 0
この回答へのお礼

返事遅くなってごめんなさい。
ぱそこん、調子わるくて。

回答ありがとうございました。
この方法でやり成功しました。
ありがとうございました。

お礼日時:2002/01/15 00:53

単純に



Dim a(1, 10) As Stringじゃ駄目ですか?
3次元なら Dima(1,10,100) As String

配列の大きさが変動するなら
コードの途中で
Redim a(1,10,100)とかって…
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
3次元の配列もあるんですね?
正直びっくりです。

お礼日時:2002/01/15 00:58

typeを使うのはだめ?


うちはそうしたけど、結構便利だった
    • good
    • 0

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

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

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

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
などとすることで、動作するのではないかと推測します。

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...続きを読む

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を考えた場合変数とおなじであるからだとおもいます

Q[VB6/VBA] Variant型配列リテラルの書き方

http://oshiete1.goo.ne.jp/qa4043791.html
の#1のURIに
http://exceler.blog68.fc2.com/blog-entry-20.html

Dim a() As Variant // As Variant追加。As Integerとかは無理っぽい
a = [{32,5,0}] //これ

というような表記があるのですが,msdn.comもしくはmicrosoft.comのどこかに,この書き方に関する解説はありますか?

VB.NETで
Option Explicit On
Option Compare Binary
Option Strict On
Option Infer Off
Module Program
Sub Main()
Dim a() As Integer
a = new integer(){1,2,3}
End Sub
End Module

というような書き方が出来るのは知っているのですが。

Aベストアンサー

ExcelVBAの機能用ですよ
『Microsoft Excel x.xx Object LIBRARY』を参照設定してやると
ご質問のような記述が可能になるようです

公式なドキュメントは見つけられませんでした
VB付属の MSDNで『配列』『リテラル』を検索すると
ExcelのApplicationオブジェクト Internationalプロパティの中に
『配列リテラル』を見つける事が出来ました


人気Q&Aランキング

おすすめ情報