[[20140924155432]] 『pubulic 二次元配列の要素数?』(S) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『pubulic 二次元配列の要素数?』(S)

はじめまして。
すべてたとえでいいます。

今回、配列で「あ」「い」「う」と三つのものを入れたいです。
あ、い、う それぞれには
「あ、か、さ、た、な・・・」「い、き、し、ち、に・・・」「う、く、す、つ、ぬ・・・」
とデータがあるので、
配列 日本語Array(●,2)←2は「あ=0」「い=1」「う=2」です
まではいいのですが、
●の方に何を入れたらいいのか悩んでます。

最初は、「あ〜わ」ということで、10個あるので、10と入れていましたが、
これがいつも10というわけではないので、
データにあるだけの処理を最後まで繰り返すようにしたいです。
説明が下手ですみません。

たとえば、「あ〜た」までにした時にも対応できるように、ということです。

更に問題点が、↑の解決方法が、redimを使ったりUboundを使ったりなどはしてみたんですが、あいにく宣言場所が標準モジュールで、public宣言しています。

こういうようになった理由は、最初はSheet1に処理を施してたんですが、publicを宣言しようとすると、コンパイルエラーが出て、調べると、VBAでは標準モジュールでpublic宣言しなくてはいけないと出たので、その通りにしています。
さらに、標準モジュールでは、普通の宣言?たとえばfor nextとかdimとかをしようとすると、プロシージャの外では無効です。
とエラーが出てしまいます。

標準モジュールでpublicを宣言するところは変えずに、最後のデータがあるところまで処理をするようにしたいんですが、どのようにしたらいいか助言いただけたら嬉しいです。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 二次元配列のサイズ変更(Redim)は最終要素しか変更できません。
 ですので、不定長の要素を持つ配列にするには、

 Public 日本語Array()

 Sub Sample()
    ReDim Preserve 日本語Array(0)
    日本語Array(0) = Array("あ", "い", "う", "え", "お")

    ReDim Preserve 日本語Array(1)
    日本語Array(1) = Array("か", "き", "く", "け", "こ")

    ReDim Preserve 日本語Array(2)
    日本語Array(2) = Array("や", "ゆ", "よ")

    For i1 = 0 To UBound(日本語Array)
        For i2 = 0 To UBound(日本語Array(i1))
            Cells(i1 + 1, i2 + 1).Value = 日本語Array(i1)(i2)
        Next
    Next
 End Sub

 のようにしてどうでしょうか。
(Mook) 2014/09/24(水) 16:08

やってみます。
助言ありがとうございます。
(S) 2014/09/24(水) 16:43

 質問を読み返すと、今回はサイズ変更ということではなかったようですね。
 ちょっと、過剰な処理かもしれません。

 データは3つで、それぞれのデータ数が異なるのであれば、やはり最大数で作るのが
 通常の運用だと思います。

 データ数が少ない部分は0なり、−1なり、自分でデータがない値を定義しておけば、
 処理中でそれを判定すれば、通常の静的配列で出来るかと思います。
(Mook) 2014/09/24(水) 16:52

 配列の扱い方については、色んな方法があるので、これは検討していただくとして、

 私が気になったのは、↓ここです。

 >最初はSheet1に処理を施してたんですが、publicを宣言しようとすると、コンパイルエラーが出て

 対象変数の性質上、シートに置くべき変数なら、シートに置くのが自然ですよね?

 が、このエラーが出る・・・、そもそも変数をPublic宣言すべきなのか? という事を検討してください。

 変数の意味などから、置くべき場所がここだと思うなら、そこに置くべきです。
 少なくとも エラーになるから標準モジュールに置く という選択はよりは、ずっと(はるかに)良い
 と思います。

 でもエラーになる・・・。

 Public宣言は、エラーになっても Private 宣言なら、エラーにはなりませんよね!!

 外からのモジュールからのアクセスは、この配列の事をよく考え、どんな手続きを作成すればよいか
 よくよく考えます。この配列の事を本当に将来的なことも考慮して考えます。
 結果、この配列に必要な手続きを変数を宣言したモジュールに作成します。

 Sheet1のモジュールを例にとり、配列 myarrayのデータの受け渡しを考えると・・・、

 Sheet1のモジュールに

 Option Explicit
 Private myarray() As Variant
 Sub aryscale(ByVal rw As Long, ByVal col As Long)
    ReDim myarray(1 To rw, 1 To col)
 End Sub
 Property Get ary(ByVal rw As Long, ByVal col As Long) As Variant
    ary = myarray(rw, col)
 End Property
 Property Let ary(ByVal rw As Long, ByVal col As Long, ByVal myval As Variant)
    myarray(rw, col) = myval
 End Property
 Sub aryers()
    Erase myarray
 End Sub

 呼び出しモジュールでは

 Option Explicit
 Sub test()
    Dim g0 As Long
    With Sheet1
       .aryscale 2, 2
       .ary(1, 1) = 1
       .ary(1, 2) = 2
       .ary(2, 1) = 3
       .ary(2, 2) = 4
       For g0 = 1 To 2
          MsgBox g0 & ",1=" & .ary(g0, 1) & vbCrLf & g0 & ",2=" & .ary(g0, 2)
       Next
       .aryers
    End With
 End Sub

 このようなコードが書けます。 検討してみてください。

( ichinose) 2014/09/25(木) 09:15


ichinoseさん

その通りです。
publicにする必要のないものを宣言していました。
そのような書き方もあるのですね。
ichinoseさんの書き方も取り入れさせていただきます。
ありがとうございます。
(syk) 2014/09/25(木) 15:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.