• 締切済み

表(縦横)形式データを配列にしたい

Type GYO ' 文字列要素 gyono As String ' 項番 hinmei As String ' 品名 hinmeicode As String ' 品名コード hinmeicnt As String ' 数量 End Type 行数可変であれば以上の様に列の定義をし、行はgyo(i) i=1,2,3,4とすればよいのですが、列も可変なのです。 この場合、どのように定義すればよいのでしょうか?

  • reina
  • お礼率22% (2/9)

みんなの回答

  • sorarisp
  • ベストアンサー率58% (7/12)
回答No.1

>行数可変であれば以上の様に列の定義をし、行はgyo(i) >i=1,2,3,4とすればよいのですが、列も可変なのです。 2次元配列を使用するという事ですか? それでしたら a(gyo,retu) でいいと思いますが。 dim a() as string redim a(i,j) それとも構造体を可変にしたいということでしょうか? Type GYO name as String value() As String End Type この方法はあまり言い方法とはいえません。 gyo(0..n)に対して行単位でvalue()の要素を宣言 する必要があるからです。 質問の内容を誤解していましたらすみません。 参考になれば。。。

reina
質問者

補足

即答ありがとうございます。参考になります。 後者の方でTYPEで構造体可変配列を定義したいのです。 理由は行単位での処理を行う必要があるためです。 >この方法はあまり言い方法とはいえません。 >gyo(0..n)に対して行単位でvalue()の要素を宣言 >する必要があるからです。 ↑の宣言を教えていただけますか? 列:4~10で行は多くても100くらいです。

関連するQ&A

  • VB6で、一次元配列と二次元配列の相互コピー

    VB6で、一次元配列と二次元配列の相互コピーをしたいです。 (1)元々下記のような宣言をもつ配列がありました。 Public Type TKey no As String id As String code As String atr() As String End Type Public Type tr Key As TKey atr() As String abc As Boolean End Type Public gtr() As tr (2)コピー用に、下記のような二次元配列用宣言をつくりました。 Public Type TKey2 2no As String 2id As String 2code As String a2tr() As String End Type Public Type 2tr Key22 As TKey2 atr22() As String abc22 As Boolean End Type Public g2tr() As 2tr (3)  (1)から(2)にデータを複製したり、 (4)  (2)から(1)にデータを複製したいです。 今は、下記のように面倒くさいことをしています。 dim gtr(maxcnt) ReDim Preserve g2tr(500, maxcnt) ループ g2tr(cnt, i).Key22.2code = gtr(i).Key.code ・・・(3) gtr(i).Key.code = g2tr(j, i).Key22.2code ・・・(4)       今は上記を全ての宣言の配列に実行しています。 なにかもっと効率のよい方法はないでしょうか。 (1)の配列は、1~500くらいはあり、不定です。

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • msgboxの表示

    A列の値とC列の値をMsgboxに表示するにはどうしたらいいのでしょうか?C列で一番高い商品とその品名A列を表示させたいのですが・・ Sub hinmei() Dim i As Long For i = 2 To Range("C65535").End(xlUp).Row Dim x As Long Dim a As Long x = Cells(i + 1, 5) If Cells(i, 5).Value < x Then a = x End If Next MsgBox a End Sub

  • VBA 表作成 続続

    以前何度もこの「VBA表作成」というタイトルで何度か質問させていただきました。 前回の締め切りのあと何度もデバック?やってみながら訂正してみたりしたのですが出来ませんでした。 ☆詳細(仕様?) ・入力フォームブックで日付を入力すると出力ブックに入力した日付から1ヶ月の日付が表示されます。 ・入力データブックがあり入力フォームで入力した日付から1ヶ月の日付で入力データにあるデータを貼り付けます。 ・重複したデータは足して表示させます。 ☆入力データブック ・B列に日付:日付の下に曜日が表示されています。 ・M列に区分:1か2が書いてあります。 ・T列に商品名:結合は関係ないとは思いますが、TからAPまで結合されています。 ・AQ列に数量:AQからAUまで結合されています。 ・BA列にコード:表示上記4つに比べ1行下に表記されていてBAからBDまで結合されています。 ☆出力ブック ・BからHまで結合されており、B6に商品名が表示されます。(現時点では商品1つ分しかないので増えるたびに1行ずつセルが結合され挿入されます ・IからKまで結合されており、I6にコードが表示されます。(これも上記と同じ) ・6行目~→区分1の場合・8行目~→区分2の場合に表示します。 (1)出力ブック(以下book)の表は品名とコードを表示する部分が結合されているのですが、挿入され別の値が表示となったときに結合されておらず、コードも表示されませんでした。 (2)入らないはずの所に数値が入ってしまいます。 (3)入るはずの所に値が表示されません(8行目以降の欄) ・品名:B5からH5まで結合されています。 品名が表示されるのはB6からH6までで挿入されるときも結合されて表示されたいです。 ・コード:I5からK5まで結合されています。 コードが表示されるのはI6からI6までで挿入されるときも結合されて表示されたいです。 Sub Get_nyuryoku(wDate As String, hNm As String, hCd As String, hKbn As String, s As Integer) Dim wData As Worksheet Dim i As Integer Dim mR As Long Set wData = Workbooks("入力データ.xls").Worksheets("Sheet1") With wData mR = .Cells(Rows.Count, "B").End(xlUp).Row For i = 3 To mR If .Cells(i, "B") = wDate Then '←ここで両方の日付を確認 hNm = .Cells(i, "T")  ←商品名 hCd = .Cells(i, "BA") ←コード hKbn = .Cells(i, "M") ←区分 s = .Cells(i, "AQ")  ←数量 Exit For End If Next End With End Sub お手数掛けますがよろしくおねがいします。 他に書かなきゃいけないことがありましたら言ってください。

  • textデータをexcelに取り込む

    VBA初心者です。 テキストファイルのデータをEXCELに自動取り込みしてcsv形式で保存したいのですが、テキストデータが65536行を超えているのでWorkbooks.OpenTextでは65537行以後が取り込めません。インターネットで調べた方法FileSystemObjectでテキストデータを1行ごとに取り込もうと思ったのですが、「ユーザー定義型が定義されていません」のエラーメッセージが表示されて旨くいきません。FileSystemObjectの使い方が良く解らないので誰か教えてください。 なお、テキストデータは1行に8フィールド有りますので、取り込んだデータはフィールドごとに8列に分けたいのですが、その方法も解りません。 テキストデータサンプル(1行分) 2004/1/5 101 i 10787 10862 10785 10825 726690000 以下に試みた方法を記述します。 Option Explicit Sub READ_TextFile3() Const cnsFILENAME = "D:\Test\test1.txt" Dim FSO As New FileSystemObject ' FileSystemObject Dim TS As TextStream ' TextStream Dim strREC As String ' 読み込んだレコード内容 Dim GYO As Long ' 収容するセルの行 Set TS = FSO.OpenTextFile(cnsFILENAME, ForReading) GYO = 1 Do Until TS.AtEndOfStream strREC = TS.ReadLine GYO = GYO + 1 Cells(GYO, 1).Value = strREC Loop TS.Close Set TS = Nothing Set FSO = Nothing End Sub

  • 表を新しいブックに保存

    Sub 表を新しいブックに保存反映日ごと() Application.ScreenUpdating = False Dim フルパス As String, ファイル名 As String, パス As String, 新ファイル名 As String 新ファイル名 = ActiveSheet.Name フルパス = ActiveWorkbook.FullName ファイル名 = Dir(フルパス) 'パスを取得 パス = Replace(フルパス, ファイル名, "") '表の範囲選択をする Range("A1").Select Dim 行数 As Long, 列数 As Long 行数 = 1 列数 = 1 Do While Cells(行数, 1) <> "" 行数 = 行数 + 1 Loop 行数 = 行数 - 1 Do While Cells(1, 列数) <> "" 列数 = 列数 + 1 Loop 列数 = 列数 - 1 Range(Cells(1, 1), Cells(行数, 列数)).Select Selection.Copy '新しいブックを開く Workbooks.Add Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Do While Range("A2") <> "" Range("A1").Select '一番上の発売日の範囲を取得 Range("A2").Select Dim 列 As Long Dim i As Long 列 = 1 '列数を取得 Do While Cells(1, 列) <> "" 列 = 列 + 1 Loop 列 = 列 - 1 '発売日ごとのデータ量を取得 i = 2 Do Until Cells(i, 1) <> Range("A2").Value i = i + 1 Loop i = i - 1 '発売日のまとまりのデータ範囲を選択 Range(Cells(1, 2), Cells(i, 列)).Select '発売日ごとのデータをコピー Selection.Copy '発売日を取得 Dim 発売日 As Long 発売日 = Range("A2").Value '新しいブックを追加してシート名を発売日に設定 Workbooks.Add ActiveSheet.Name = 発売日 新ファイル名 = ActiveSheet.Name Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select 'シート名をファイル名にして保存 ActiveWorkbook.SaveAs Filename:=パス & "メンテ_" & 新ファイル名 & ".xls", _ FileFormat:=xlExcel8, _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWindow.Close Range("A1").Select '保存された発売日分のデータを削除 Range(Cells(2, 1), Cells(i, 列)).Select Selection.Delete Shift:=xlUp Loop '不要になった表転記用ブックを閉じる Application.DisplayAlerts = False ActiveWindow.Close Application.DisplayAlerts = True Range("A1").Select Application.ScreenUpdating = True End Sub Sub 表を新しいブックに保存() Application.ScreenUpdating = False Dim フルパス As String, ファイル名 As String, パス As String, 新ファイル名 As String 新ファイル名 = ActiveSheet.Name フルパス = ActiveWorkbook.FullName ファイル名 = Dir(フルパス) 'パスを取得 パス = Replace(フルパス, ファイル名, "") '表の範囲選択をする Range("A1").Select Dim 行数 As Long, 列数 As Long 行数 = 1 列数 = 1 Do While Cells(行数, 1) <> "" 行数 = 行数 + 1 Loop 行数 = 行数 - 1 Do While Cells(1, 列数) <> "" 列数 = 列数 + 1 Loop 列数 = 列数 - 1 Range(Cells(1, 1), Cells(行数, 列数)).Select Selection.Copy '新しいブックを開く Workbooks.Add Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select 'シート名をファイル名にして保存 ActiveWorkbook.SaveAs Filename:=パス & 新ファイル名 & ".xls", _ FileFormat:=xlExcel8, Password:="", _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWindow.Close Range("A1").Select Application.ScreenUpdating = True End Sub

  • AccessVBAで、二次元配列を動的に設定したい

    以下のコードにあるattrという配列に、DB上のとあるコードと名前を設定したいと思います。 DB上のデータ量は可変なので、データを取得するごとに動的に配列attrの要素数を動的に増やしたいと思っています。 検索等で色々と調べながら以下のコードを書いてみたのですが、どうもうまく動きません。 ご教授願います。 --------------------------------------------------- Dim attr() As String [loop start] ReDim Preserve attr(i, 0) ReDim Preserve attr(i, 1) attr(i, 0) = コード attr(i, 1) = 名前 [loop end]

  • VBAでユーザ定義変数名をシートから取得したい

    VBAでユーザ定義型変数を宣言する際、 要素名をシートに記述した名称にすることは可能でしょうか? 【例】 シート「Sheet1」のセルA1とA2に 「SYAIN_NO」と「SYAIN_NM」が入力されています。 ユーザ定義型変数syainの要素名1と要素名2をシートから名称を取得し [取得前] Type syain 要素名1 As Long 要素名2 As String End Type [取得後] Type syain SYAIN_NO As Long SYAIN_NM As String End Type にしたいです。 今後、シートに名称を追加することで変数を拡張したいと考えています。

  • (VBA)UserForm.Hideについて

    こんにちわ。 以下様なプログラムを実行したいです。 Public Sub closeForm(FormName As String, Gyo As Integer) (FormName & Gyo).Hide End Sub (FormName & Gyo).Hideの前に何か追加すればよいと思うのですが、 どうしたらよいでしょうか。 教えてください。お願いします。

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

専門家に質問してみよう