For~Eachで構造体配列の特定のメンバーの合計を求める方法
- For~Eachを使って構造体配列の特定のメンバーの合計を求める方法について説明します。
- For~Eachを活用することで、構造体配列の要素の個数が不定な場合でも簡単に合計を求めることができます。
- また、多次元配列でも同様の方法で特定の次元要素の処理が行えます。
- ベストアンサー
構造体配列の特定のメンバーをFor~Eachで
みなさんこんにちは。昔Vb6を少々やっていましたが ここ数年遠のいていました。 必要に迫られ最近Vb2010を勉強しはじめた50歳です。 サンプルの通り3つのメンバーを持つ構造体配列があり、 メンバーData3の合計を得るのに、ループで回して 計算してましたが、これを For~Next ではなくFor~Each で やれないかと考えておりました。配列の要素の個数が不定 な場合に便利だと思ったからです。 サンプルの ???_1が「型」で ???_2が「コレクション」と なるように記述するのだということまではわかりますが、 具体的な記述がわかりません。For~NetでもDo~Loopでも 他にも方法があるのは知っています。勉強の為に、For~Eachでの やりかたを知りたいのです。また、構造体配列ではなく、多次元配列での 特定の次元要素を同様に処理する方法も知りたいです。 どなたかご教授お願いできれば幸いです。 ネット上でそれなりに調べましたが、目的に沿う情報は みつけることができません。 Public Class Form1 Structure STR Dim Data1 As Double Dim Data2 As Double Dim Data3 As Double End Structure Private Sub Button1_Click(sender As System.Object, _ e As System.EventArgs) Handles Button1.Click Dim Str_1(10000) As StR Dim Rn As New System.Random() For i = 0 To 9999 Str_1(i).Data3 = Rn.Next(100) Next '以降いろんな処理をやる ' ' 'このあと For~Nex ではなくFor Each をつかってメンバーDat3の合計を得るには? Dim sum As Double For Each X As ???_1 in ???_2 '???_1 と ???_2 の記述がわからない sum += X Next Label1.Text = sum.ToString End Sub End Class
- ponpokovvv
- お礼率100% (3/3)
- Visual Basic
- 回答数1
- ありがとう数7
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
For eachで 構造体のメンバーを直接取得って出来ないと思います やるならば 構造体を個別に抽出して そのメンバーをループ中で使う方法になると思います ???_1に『STR』???_2に『Str_1』を使って for each X as STR in Str_1 Sum += X.data3 Next といった具合かと …
関連するQ&A
- 構造体 多段階配列について
Private Structure test Dim a As Integer Dim b As String Dim c as String End Structure Dim a() As test = New test(2) {} Dim b() As test = New test(2) {} Dim c()() As test c = New test()() {a, b} Dim temp() as integer cは多段階配列で、 例えば、c(0)のメンバaのデータをすべて取り出したい 時はどうすればよろしいのでしょうか? //気持ち的にはこのようにしたいのですが、 できません。 temp = c(0).a どなたか、わかるかた、教えてください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 構造体配列
こんにちわ。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 の部分です 宜しくお願いします
- 締切済み
- Visual Basic
- VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法
VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ??? '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。
- 締切済み
- Visual Basic
- Excel VBA のFor Each ・・・ Next について
配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。
- ベストアンサー
- Visual Basic
- 構造体 要素2次元配列の初期化方法
Module Public Structure Elem Public nr As Integer Public type As Integer Public side()() As Double ' side(Nr.)(x|y|z)== normal vector Public Sub initialize() Dim side(100)() As Double End Sub End Structure Public e_enq As Elem() = New Elem(100) {} End Module '****** 以下ボタンなどで本文内で動作させている *********** Dim i, j, k As Integer 1 ReDim e_enq(100).side(50)(2) 2 For k = 0 To 10 With e_enq(k) For j = 0 To 10 .side(j)(0) = 0.0 '*** .side(j)(1) = 0.0 .side(j)(2) = 0.0 Next j End With Next k 1 の方法での記述で newが必要とのエラーコメント 2 の方法でも '***部でやはり newが必要とのエラーコメントが出る sideが1次元ならば、動作するのですが、2次元にするとエラーが発生します。 現在、プログラムが進展しなくて困っています。 どなたか、お詳しい方がいらしゃれば、どうかご指導をお願いいたします。
- ベストアンサー
- Visual Basic
- VB2008で構造体を引数とした時にエラー
VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1 Public Structure str_IN Public in_aaa As String End Structure Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ~ Dim stin As New str_IN '------------------------------------ stin.in_aaa = "aaa" Label1.Text = Test_Sub(stin) '<------- これはok '------------------------------------- Dim cls = New Class1 stin.in_aaa = "aaa" Label1.Text = cls.CFnk(stin) '<----- エラーになる End Sub Private Function Test_Sub(ByVal prm_in As str_IN) As String Dim stin As New str_IN Dim sout As String sout = "test_aaa" Return sout End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス Public Structure str_IN Public in_aaa As String End Structure Public Function CFnk(ByVal prm_in As str_IN) As String Dim stin As New str_IN Dim sout As String sout = "test_aaa" Return sout End Function End Class
- ベストアンサー
- Visual Basic
- セルに対してFor Each~In~Nextを使う
セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 構造体配列のソート
VB6 ソートのやり方は知っていますが、構造体の定義が変わると対応できません。 ソート処理部分だけを共通関数にできますでしょうか? Private Type Sort strCol1 As String intCol2 As Integer sttCol3 As String End Type Private Sub A() Dim typSort(3) As Sort 'ここに、構造体データ設定処理を記述 Call subSort(typSort(), typSortCopy) End Sub Private Sub subSort(typTaget() As Sort) Dim lngOutLoop As Long Dim lngCurent As Long Dim lngInLoop As Long Dim Min As Variant Dim typSortCopy As Sort For lngOutLoop = LBound(typTaget) To UBound(typTaget) - 1 Min = typTaget(lngOutLoop).strCol1 lngCurent = lngOutLoop For lngInLoop = lngOutLoop + LBound(typTaget) + 1 To UBound(typTaget) If typTaget(lngInLoop).strCol1 < Min Then Min = typTaget(lngInLoop).strCol1 lngCurent = lngInLoop End If Next lngInLoop typTagetCopy = typTaget(lngOutLoop) typTaget(lngOutLoop) = typTaget(lngCurent) typTaget(lngCurent) = typTagetCopy Next lngOutLoop End Sub
- ベストアンサー
- Visual Basic
- VB2008: 構造体に関するMSDNの解釈について!
' ================== ' 構造体変数の代入 ' ================== Module theTEST Private Structure TEST4 Dim MembersCount As Integer Dim Member1 As String Dim Member2 As String End Structure Sub Main() Dim T4_1 As TEST4 Dim T4_2 As TEST4 T4_1.MembersCount = 1 T4_1.Member1 = "T4_1:Member1" T4_1.Member2 = "T4_1:Member2" T4_2 = T4_1 Debug.Print(T4_2.MembersCount.ToString) Debug.Print(T4_2.Member1) Debug.Print(T4_2.Member2) End Sub End Module [イミディエイト ウインドウ] 1 T4_1:Member1 T4_1:Member2 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 (http://msdn.microsoft.com/ja-jp/library/18ytyskd(VS.80).aspx) このMSDNライブラリの説明によると、 [イミディエイト ウインドウ] 0 T4_1:Member1 T4_1:Member2 という結果を得るというのが私の予測。 もしかしたら、MSDNライブラリの説明の舌足らず。 >構造体の要素が値型であらば値がコピーされますが、文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 ということでしょうか?
- ベストアンサー
- Visual Basic
- VB.Net データ読み取りの For Each
お世話になります。 .Net 駆け出しの者です。 下記のような場合(全く違う記述でもいいです)、SQLDr("項目名")で値を取得できると思うのですが、直に項目名を書かず変数で値を取得したいのと、While と For Each 文なんかを組み合わせて全レコード、全フィールドの値を取得したいのです。 下記で言いますと例えば2レコード 3項目 合計で6つの値があるとすると データ座標 1,1 が A 1,2 が B 1.3 が C 2,1 が D 2,2 が E 2,3 が F 結果的に A,B,C D,E,F このような形でデータを取得したいのです 何卒よろしくお願いいたします。 Dim SQLCon As SqlConnection = New SqlConnection(接続文字列) Dim SQLCmd As SqlCommand = New SqlCommand(SQL文, SQLCon) SQLCon.Open() Dim SQLDr As SqlDataReader = SQLCmd.ExecuteReader Dim value As Boolean value = SQLDr.HasRows 'True と仮定します ’*********************************************************** ここからが質問です。 SQLDr("項目名")と記述すれば値を取得することは わかるのですが、 直に項目名を書かず編集ですべての値を取得する記述の仕方をお教えくださいませ。 たとえば Dim Cnt as Integer = 0 Dim CntField as Integer = 0 While SQLDr.Read() For Each o As Read In SQLDr.Read こんな感じで全データを抽出したいのです こんな記述はないと思いますが SQLDr(CntField) 変数で値を取得したいのです 2つの変数の値が座標データ SQLDr(CntField)が値データになります。 CntField = CntField + 1 'フィールドの位置 Next Cnt = Cnt + 1 'レコードの位置 CntField = 1 End While ’*********************************************************** SQLDr.Close() SQLCon.Close()
- ベストアンサー
- Visual Basic
お礼
>For eachで 構造体のメンバーを直接取得って出来ないと思います そうでしたか・・・。 >for each X as STR in Str_1 > Sum += X.data3 >Next >といった具合かと … たぶんこれでも同じ行数で書けると思うので十分満足です。 For~Eachは要素の数が不定だったり、どうでも よかったり順番がどうでもよいときに便利だと思っています。 ほんとにほんとにありがとうございました。