[[20180621111412]] 『ubound 引数dimensionについて』(ばうんど) ページの最後に飛ぶ

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

 

『ubound 引数dimensionについて』(ばうんど)

エクセルVBA初心者です。学習テキストを進めていくうちに次の問題で少し疑問が残りました。

option base 1
sub rangetovariant

dim mydata as variant

dim r as integer,c as integer

worksheets("Sheet1").activate

mydata = range("a1").currentregion.value

r = ubound(mydata,1)
c = ubound(mydata,2)

worksheets("Sheet2").activate

range(cells(1,1),cells(r,c)).value =mydata

end sub

uboundの引数dimensionの説明を見ると次元を指定するとあります。
このコードで記述されている
r = ubound(mydata,1)
c = ubound(mydata,2)
の変数rには行の最大値、変数cには列の最大値が格納されるようですが、
引数dimensionは常に1は行、2は列というような認識で正しいのでしょうか?

< 使用 Excel:unknown、使用 OS:unknown >


 ubound 関数で第二引数を省略した場合の規定値は 1。

 ubound(mydata), ubound(mydata,1) は同じ値になる。(私は多次元配列では省略しませんが)

 >引数dimensionは常に1は行、2は列というような認識で正しいのでしょうか? 

 二次元配列ではそのような理解でいいでしょう。
(seiya) 2018/06/21(木) 11:53

質問自体はseiyaさんが答えていらっしゃるので割愛しますが、それ以外で気になったというか興味がわいたので投稿します。

モジュールレベルで「Option Base 1」としてますが、このコードに限って言えば意味あるんでしょうか?
結局のところ

 Dim Mydata As Variant
 Mydata = Range("a1").CurrentRegion.Value

としているので、わざわざ「Option Base 1」を書かなくても1から始まっちゃう気がするんですが、何か他にメリットあるんでしょうか?

ちなみに、その参考にされた本は学習のために一度配列に格納してから別シートに出力させているんでしょうけど、こんな感じでやれば配列に格納せずダイレクトに参照させることもできそうですね。

    Sub Sample()
        With Worksheets("Sheet1").Range("A1").CurrentRegion
            Worksheets("Sheet2").Cells(1, 1).Resize(.Rows.Count, .Columns.Count).Value = .Value
        End With
    End Sub

(もこな2) 2018/06/21(木) 13:15


どうでも良いけど、私はこの構文嫌いです。
>range(cells(1,1),cells(r,c)).value =mydata
もしアクティブではないシートを処理しようとしたら、Worksheetを3回書かなければならないので冗長になりやすいし、後からcellsにシート名を付け忘れてエラーの元となりやすいからです。
あと2,2が起点の場合に、r+1、c+1等と直さなくちゃいけないですよね。

じゃあどうするの?って話ですが、行数、列数が明確な時はこうやって書くと間違いが起こりにくいです。
cells(1,1).resize(r,c).value = mydata

P.S. ExcelVBAにおいては1次元目が行、二次元目が列としないと、Rangeとの入出力が一発で出来ないので暗黙の了解でそうなりますが、自作の配列変数なら自由に定義出来てしまいます。
>としているので、わざわざ「Option Base 1」を書かなくても1から始まっちゃう気がするんですが、何か他にメリットあるんでしょうか?
きっとDim data(10,10)としたときに、Option Base 1が未指定だとdata(0〜10,0,10)になってしまうのでその対策じゃないかとエスパーしてみます。

身勝手な回答でお邪魔しました。
(名無し) 2018/06/21(木) 13:53


ご回答ありがとうございます。御二方の書いてくださった構文も目から鱗で大変勉強になりました。
(ばうんど) 2018/06/21(木) 14:04

「Option Base 1」について追記。
省略すると定義したときに0がベースになっちゃうのではってところは、1 to ☓☓ って記述をすれば回避できますね。
(動作未確認ですが、サンプルです。)

    Sub Sample2()
        Dim MyData As Variant
        Dim x As Long, y As Long

        With Worksheets("Sheet1").Range("A1").CurrentRegion
            ReDim MyData(1 To .Rows.Count, 1 To .Columns.Count)

            For x = 1 To ubound(mydata,1) 
                For y = 1 To ubound(mydata,2) 
                    MyData(x, y) = .Cells(x, y).Value
                Next y
            Next x
        End With

        'For〜Nextステートメントを実行した際に1ステップ分、余分に増加している分を引く
        Worksheets("Sheet2").Cells(1, 1).Resize(x - 1, y - 1).Value = MyData

    End Sub
(もこな2) 2018/06/21(木) 23:28

コメント返信:

[ 一覧(最新更新順) ]


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