Cでの開発経験はありますが、VBに関しては初心者です。

現在現在VBを使用したシステムを作成するにあたり、ユーザーインターフェイスを検討するため、DBアクセス部を省略したプロトタイプを作成しています。
このシステムでは商品カテゴリを選択するコンボボックスと、選択されたカテゴリの商品一覧を表示するリストボックスからなるものです。
以下のようなプログラム(Cとのごちゃ混ぜですみません。)を作成すればとりあえず動くものは簡単にできるであろうと考えたのですが、VBでの初期化済み配列変数の定義の仕方が分からず困っています。
VBではどのようにすれば良いのでしょうか?
また、VBでこのようなことができない場合、通常はどのようにするものなのでしょうか?


struct Shouhin {
char name[100];
int price;
};

struct Shouhin shouhin_list[][] = {
{
{"鉛筆", 40},
{"ボールペン", 100}
}, {
{"大学ノート", 100},
{"お絵かき帳", 200}
}
};


---


' コンボボックスでの選択に合わせてリストボックスの内容を切り替える。
Private Sub ComboBox_Click()
ListBox.list = shouhin_list[ComboBox.ListIndex]
End Sub

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

A 回答 (1件)

こんな回答で良いのでしょうか。


VBでは、1次元配列に限り、関数でArrayがあります。VBAでも使えます。
Youbi=Array("日曜","火曜","水曜","木曜","金曜","土曜")
のように使います。
A=youbi(2)でAに文字列の水曜が入ります。
二次元のデータを扱うときは,次元数が2,3次元程度なら
下記で凌げます。文字列、数値をまぜても差し支えない。
Youbix=Array("日曜",6,"月曜",6,"火曜",5,"水曜",6,"木曜", _
6,"金曜",6,"土曜",5)

    日曜      6(出席者6人とか色々の意味あり)
    月曜      6
    火曜      5 
    水曜      6
     ・
     ・
    土曜      5
の2次元表が定義できます。
使うときは
    For i=0 to 11 step 2
       you=youbix(i)  
       ninnzu=youbix(i+1)
      (処理 略)
    Next i
で使えます。 
とび先(ブランチ先)を配列にしたいときは、不勉強で
経験ありません。
誰かご存知の方答えてください。
コントロール配列と言うのも別にあります。
VBでは区切りセミコロンがないので、行を次ぎに変えて
続けるときは、スペース+アンダーバーを使います。
     以 上
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
先にも書きましたが、VBビギナーのため、ご回答内容を理解、検討するのに時間がかかり、お礼が遅くなってしまいました。
申し訳ありません。

ご回答を参考に私なりに試行錯誤した結果、一応目的は達せられました。
以下にその過程を記述します。


質問ではユーザー定義型Shouhinの配列を用意することを考えていましたが、Array関数の引数にユーザー定義型データを与えることはVBの仕様で不可能でした。

最終的にはリストボックスに表示するので、特にユーザー定義型である必要はありませんので、"鉛筆 40"、"ボールペン 100"のような文字列の配列を作成すればよいかと考えました。
しかし、"_"による行連結は最大10までしかできませんでした。
(質問中のサンプルはフィールド数もデータ数も少ないのですが、作成しようとしているシステムはリストボックスに通常数百個の項目が並ぶもので、プロトタイプでもスクロールが行える程度の数(20個ぐらい)のレコードが必要です。)

最後に、ご回答の最後の方で触れられているコントロール配列を以下のように使ってみて一応目的は達せられましたが、imogasiさんの想定されていたのはこのようなものでしょうか?


---


1. 商品を表示するためのリストボックス(lstShouhinListView)とは別に、データを保持するためだけの、非表示リストボックスを商品カテゴリの数だけ用意し、これらをコントロール配列(lstShouhinListData())とする。
(商品のリストの内容はフォームデザイナのプロパティウィンドウで設定する。)

2. コンボボックスにてカテゴリが選択されたら、選択されたカテゴリのデータ保持用ListBoxの内容を、商品一覧表示用のリストボックスへコピーする。

Private Sub cmbCategory_Click()
  Dim lb As ListBox
  Dim i As Integer

  Set lb = lstShouhinListData(cmbCategory.ListIndex)
  lstShouhinListView.Clear
  For i = 0 To lb.ListCount
    lstShouhinListView.AddItem (lb.List(i))
  Next
End Sub

お礼日時:2001/10/12 16:51

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

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

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

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

QVB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

VB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

Aベストアンサー

&="&"
&="""
=Right([nendo],2) & "/06&quot  -> =Right([nendo],2) & "/06"
[nendo]はアクセスのフィールド名か(アクセスのVBA?)。[]で囲むから。
中身は、#2でご指摘の年度で2007とかは行っているのでしょう。
Right関数は文字列の右側、最後から文字数を指定して切り出す。
&は文字列を結合する演算子。
/06をこの順序で結合するもの。

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

QExcelのファイル{(75行*1列の1セット)*33セット分}データをVBで扱う方法を教えてください。

Excelのファイル{(75行*1列の1セット)*33セット分}データをVBで扱う方法を教えてください。

ExcelのデータをVBに読み込んで、それを並び替えするプログラムを作ろうとしています。
なのですが、ExcelのデータをVBに読み込む方法がわかりません。
ネットで調べたらopen,close,get・・とあるのですが、いまいちわかりません。

どなたか教えてください。

Aベストアンサー

Open/Close では実質的に言って無理です。
( Excel のファイル構造がわかればできるかもしれませんが・・・)
VB6 と VB.NET では少し記述方法が違いますが、VB.NET だと

Dim eb As Object
Dim es As Object
Dim strFileName As String

strFileName = "C:\Temp\Book1.xls"
eb = GetObject(strFileName)
es = eb.Sheets(1)
MessageBox.Show(es.Cells(2, 1).value, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information)
eb = Nothing

のような感じで Excel のような感じで内容を読むことができます。
(上の例では 1番目のシートの A列 2行目のセルの内容をメッセージボックスに表示します。)
並び替えですが、Excel 上で並び替えをすることも可能ですが、
読み込んでから並び替えをするなら、
VB6の場合:並び替え関数を自作(並び替えのアルゴリズムはクイックソートやヒープソートなどいろいろありますので、検索して調べてみてください。どこかに VB のサンプルがあるかも。)
VB.NETの場合:Array.Sort が使用可能です。

Open/Close では実質的に言って無理です。
( Excel のファイル構造がわかればできるかもしれませんが・・・)
VB6 と VB.NET では少し記述方法が違いますが、VB.NET だと

Dim eb As Object
Dim es As Object
Dim strFileName As String

strFileName = "C:\Temp\Book1.xls"
eb = GetObject(strFileName)
es = eb.Sheets(1)
MessageBox.Show(es.Cells(2, 1).value, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information)
eb ...続きを読む

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

QVB6のComboBox関連の書き方をVB.NETに変換

VB6のコードだと思うのですが
Combo1.ItemData(Combo1.NewIndex) = &H1
というものを
VB.NET用に書き直すとどうなりますか?
よろしくお願いいたします。

Aベストアンサー

>Combo1.NewIndex
ないらしいので別にメンバ変数を用意して,
Addした時の戻り値を格納しておくことになりそうです。

>Combo1.ItemData
Tagプロパティを使ってみてください

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

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型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

QVB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログ

VB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログラムを考えています。

グローバルキーフックを使用しないで、実現する方法はありますでしょうか?
ご教示の程お願いいたします。

Aベストアンサー

>グローバルキーフック
これの引数っていろいろありますよね?

マウスとキーボードだけは.NETで捕らえることができます。
ただCTL+ALT+DELというショートカットは、これらの管理よりもっと深いところで行われているので、仮にCで作成してフックしても目的の制御の実現は出来ません。


>グローバルキーフックを使用しないで
となると、やはり#1さんの方法しかありません。


#1さんの参考URL中に
「SAS発生時の動作:」
というのがあります。そこに
「GINAのWlxLoggedOnSas()」
というところがあるのですが、その近辺を熟読してください。
そしてこれ
http://msdn.microsoft.com/en-us/library/aa380570(VS.85).aspx


#1さんが示した情報は「古い」のではなく、古くから存在する実現方法というだけです。
そして現在、新たな別方法が出現しているわけではありません。

.NETで作成するDLLとCで作成するDLLは当然異なりますので、質問の
「VB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログラム」
という質問には、「無理です」としか言いようがありません。

>グローバルキーフック
これの引数っていろいろありますよね?

マウスとキーボードだけは.NETで捕らえることができます。
ただCTL+ALT+DELというショートカットは、これらの管理よりもっと深いところで行われているので、仮にCで作成してフックしても目的の制御の実現は出来ません。


>グローバルキーフックを使用しないで
となると、やはり#1さんの方法しかありません。


#1さんの参考URL中に
「SAS発生時の動作:」
というのがあります。そこに
「GINAのWlxLoggedOnSas()」
というところがあるのですが、その...続きを読む


人気Q&Aランキング

おすすめ情報