• ベストアンサー

構造体についてここが知りたい!(参照方法について)

いつもお世話になっています、宜しくお願いします。 現在ACCESS2002、SQLサーバーで次のことを実現しようと思っています。 やっていることは 項目名が数字部分のみ違う要素を30個もつ構造体(構造体名:Kouzoutai) 下記のように用意します。 Type Kouzoutai  KOUMOKU1  KOUMOKU2  KOUMOKU3   ・   ・   ・  KOUMOKU29  KOUMOKU30 End Type この項目、KOUMOKU1~30でNULLのものには1を格納するという処理を 行いたいと思っています。 IF文を30個書いても良いのですが、あまりに冗長的なソースに なってしまうので、ループを使って行いたいと思っています。 例えばコントロール名などでは、ME("KOUMOKU" & CNT).VALUEというような 書き方で値が取得できるので、そのような感じで下記のように 記述したのですが、うまく動かず行き詰っています。 Dim CNT As integer CNT = 1 DO WHILE CNT <= 30  IF ISNULL(Kouzoutai.("KOUMOKU" & CNT) THEN   Kouzoutai.("KOUMOKU" & CNT) = 1  END IF  CNT = CNT + 1 LOOP 基本的なことを見落としているかもしれませんが、 何かお気づきの方が居られましたら、ご教授ください。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.1

すべて同じ名前でよいのであれば、 配列にしてしまえば、悩まずにすむはずですが。 Dim Koumoku(1 to 30) as Variant これでは、駄目な理由を説明してもらえるならば、他の手を考えてみますが?

takatoo
質問者

お礼

早速のレスありがとうございます!! 確かに配列にすれば、うまくいきました。 簡単なようですが、頭の固い私には思いつきませんでした。 質問にも書きましたが、コントロール名の場合に ["コントロール名" & CNT]の書き方で書いたもので、 この方法しか頭にありませんでした。 本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

まずKouzoutai.("KOUMOKU" & CNT)に無理があります。 Kouzoutai.KOUMOKU0というな処理を期待されてたかと思いますが KOUMOKU0というのは文字列ではなく変数名です。 カウントしていきたいのなら Type Kouzoutai KOUMOKU(30) End type とするべきです。 コントロールの場合はそういう書き方も可能ですが結局はコントロール名からメモリの場所を検索して割り出してるにすぎません。 そういう場合はコントロールも配列にした方が(速度的な面も含めて)良いです。 ネイティブコードコンパイルの場合、基本的に変数名の情報はなくなります。

takatoo
質問者

お礼

早速のレスありがとうございます! you-mさんにもご教授していただいたのですが、配列にするとうまくできました。 >コントロールの場合はそういう書き方も可能ですが結局はコントロール名からメ >モリの場所を検索して割り出してるにすぎません。 >そういう場合はコントロールも配列にした方が(速度的な面も含めて)良いで >す。 貴重なご教授ありがとうございます。 大変参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • VB6で構造体(ユーザー定義型)の比較でエラーになります。

    VB6で構造体(ユーザー定義型)の比較でエラーになります。 仕様でしょうか? type TEST_STRUC x as integer y(0 to 10) as byte end type a as TEST_STRUC b as TEST_STRUC a.x = 1 b.x = 1 if a = b then    <--- ここでエラー msgbox("同じ") end if 強引でも比較できる方法があれば知りたいです。 項目ごとに比較するしかないのでしょうか if a.x = b.x then のように、長々と記述するのが間違えそうで・・・ 簡単に比較できると、楽です。

  • 制御方法について

    所属名毎にシートを作成し都道府県と所属名が一致したら集計させループさせたいのですがうまくいきません。 データには列135に所属名があり139に都道府県が入っています。 解約シートには6行目5列目から都道府県名が入っています。 最終が沖縄となるので沖縄が入れば抜けるようになっています。 今の状態で実行すると所属名の数毎、都道府県の件数を更にを集計してしまいます。 一度シートを作成した所属はFor~Nextを読み込まないようにしたいのですが 自分なりに制御させようと試みましたが上手く集計されません。 何かアドバイス等ありましたらお願いします。 Dim ingcnt As Integer Dim intHjn As Integer Dim strhjn As String Dim Areastrhjn As String Dim list_cnt As Integer Dim Arealist_cnt As Integer Dim (2) As Worksheet Dim Area_cnt As Integer With Worksheets("解約データ") Set (2) = Sheets("解約・所属別") list_cnt = 2 strhjn = "" Area_cnt = 5 '所属CD1毎のシート作成 Do While Trim$(.Cells(list_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す If strhjn <> .Cells(list_cnt, 135) Then strhjn = .Cells(list_cnt, 135) Sheets("解約").Select Sheets("解約").Copy Before:=Sheets("解約") Sheets("解約(2)").Name = strhjn ActiveSheet.Cells(1, 15) = strhjn End If For Area_cnt = 5 To (2).Cells(6, (2).Columns.Count).End(xlToLeft).Column Area = (2).Cells(6, Area_cnt) Arealist_cnt = 2 Areastrhjn = "" Do While Trim$(.Cells(Arealist_cnt, 1)) <> "" '(A列)が空白でない限り繰り返す Areastrhjn = .Cells(Arealist_cnt, 135) 'エリア集計 If Areastrhjn = .Cells(Arealist_cnt, 135) And _ .Cells(Arealist_cnt, 139) = Area Then ActiveSheet.Cells(7, Area_cnt) = ActiveSheet.Cells(7, Area_cnt) + 1 End If Arealist_cnt = Arealist_cnt + 1 Loop If Area = "沖縄" Then Exit For Next list_cnt = list_cnt + 1 Loop End With End Sub

  • プログラムの記述方法について

    プログラム初心者です。 よろしくお願いいたします。 数個の変数を構造体で定義し、そのメンバ名を 順に実行させたいのですができますでしょうか? type koumoku a1 as string a2 as string a3 as string End type Sub main() koumoku.a1="egg" koumoku.a2="book" koumoku.a3="ohasi" Dim syori as string syori = koumoku.a1 ※ここでeggを用いた処理を実施   syori = koumoku.a2 ※ここでbookを用いた処理を実施 syori = koumoku.a3 ※ここでohasiを用いた処理を実施 End sub 上記で実施している構造体のメンバ(a1~a3)は 繰り返し処理するので、繰り返し文にしたいと 思っていますが、そのような考えは間違っているでしょうか? 実際には、a1~a10など増やしたいと思っています。 また、不完全なコーディングですが誤りがあればご指摘いただきたく 何卒よろしくお願いいたします。

  • 構造体変数の参照方法について

    ----------------------------------- Private Type DATA str1 As String str2 As String End Type Dim A as DATA MsgBox A.str1 ----------------------------------- 構造体を参照するときはこのようなやり方がポピュラーだと思うのですが、 ---------- tmp="str1" A.tmp ---------- だとか ---------- A.item(1) ---------- など、別の参照方法はあるのでしょうか? よろしくお願いします。

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • Accessでのテキストボックスのv記載方法

    Accessでのvbaを使用したコードの書き方について教えて欲しいです。 vbaを使用したますたメンテナンス(データ管理)のコードをAccessで組んでいるのですがで組んでいるのですがどうも上手くいかないところが多いです。 1. コードという名前のテキストボックス(プロパティ→すべて→名前でつけた名前を使用しています)の入力チェックが上手くいきません。ここでは自作関数を呼び出してif文で空白かどうかチェックしてるのですが コード(テキストボックス)=Nullとなってしまい、""のチェックに引っかかってくれません。どうしたら空白=""になってくれるのでしょうか。 デバッグをしてみたらテキストボックスは常にNull(Variant型)なってるのではなくたまに""(String型)になったりするので何が原因で型が変わってるのかも謎です テキストボックスだから""で空文字判定できると思うのですが… 書いたのは以下のコードです。 わかる方よろしくお願いします。 Public Function EmptyCheck(Koumoku As String) As Boolean '引数で渡された項目が入力されているかチェック If Koumoku = ""Then Koumoku.SetFocus Exit Function EmptyCheck = Ture Else EmptyCheck = False End If End Function Private Sub コード_KeyDown(KeyCode As Integer, Shift As Integer) 'Enterキー押したときに処理を開始する If KeyCode = 13 Then If EmptyCheck(コード) = True Then MsgBox "TextBox &を入力してください。" End If

  • 値(参照)渡しでの引数(構造体)のデータ型

    Typeで構造体をいくつか宣言して、それをクリアする関数 を作ろうとしています。どんな構造体がきてもOKなように 作りたいんですが、???の部分にどうかけばいいかが わかりません。こういうのって無理なんでしょうか? Sub Test(ByVal 構造体 As ???) '構造体のクリア Call ZeroMemory(構造体, Len(構造体)) End Function ある構造体のみと考えればわかるんですが、どれでもOKと なるとわかりません・・・同じようなことでもいいので、 何かいい方法はないでしょうか?よろしくお願いします。

  • 多くの選択項目を処理(SELECT)するストアド

    多くの選択項目を処理(SELECT)するストアド とあるデータ検索において、選択項目が10項目以上あり各項目の値をパラメータとして受取り、 該当データを返すストアドを検討しています。 項目が省略された場合は Null値がパラメータとして入ってきて、その項目は条件から除外します。 (全ての項目が省略されたら、全てのレコードが返される)下記の様な方法を考えています・・・ ----------------------------------------------------------------- if @para1 is null  if @para2 is null   if @para3 is null    select * from TBL   else    select * from TBL where koumoku3 = @para3  else   if @para3 is null    select * from TBL where koumoku2 = @para2   else    select * from TBL where koumoku2 = @para2 and koumoku3 = @para3 else  if @para2 is null   if @para3 is null    select * from TBL where koumoku1 = @para1   else    select * from TBL where koumoku1 = @para1 and koumoku3 = @para3  else   if @para3 is null    select * from TBL where koumoku1 = @para1 and koumoku2 = @para2   else    select * from TBL where koumoku1 = @para1 and koumoku2 = @para2 and koumoku3 = @para3 ------------------------------------------------------ 三つでも面倒なのに10項目以上では考えられません。 こんな時どのように作り込めばいいのでしょうか 動的ストアドにして where文自体を編集した物を渡す事も考えましたが、 エクセル出力時のパラメーター長の制限(?)で断念しました。 省略されなかった項目だけでデータを選択したいような事は多々あると思うのですが、 そんな時のオーソドックスは方法はどんな方法なんでしょうか? よろしくお願いします。

  • csvファイルのデータを構造体に

    csvファイルのカンマを数えて任意の文字列を抜き出すまでは出来たのですがそこから構造体に格納するまでがこちらのサイトでも検索しましたがよくわかりません。 ご指摘のほどよろしくお願いします。 csvデータ 番号,名前,住所,電話,年齢,性別 1,佐藤,東京,1234,33,A 2,田中,,5678,22, 3,坂井,名古屋,,,B ・ ・ 番号,住所,電話,年齢を格納する場合 struct k_data { char no[4];/* 出来れば番号を右詰めにしたい */ char add[20]; int tel; int age; } kaiin[256]; /* 文字列を抜き出す↓ */ int main(void) { FILE *fp1,*fp2; char dat[256]; char *ch; int cnt; /* fp1 ファイルオープン */ /* fp2 ファイルクローズ */ while (fgets(dat, 256, fp1) != NULL) { cnt = 0; for (ch = dat; *ch != '\0'; ch++) { if (*ch ==',') { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc('\n', fp2); } cnt++; } else { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc(*ch, fp2); } } } putc('\0', fp2); } fclose(fp2); fclose(fp1); }