Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9311 / 13646 ツリー ←次へ | 前へ→

【28028】VariantにRangeオブジェクトを代入したとき ちくたく 05/8/26(金) 19:53 質問[未読]
【28029】Re:VariantにRangeオブジェクトを代入した... ichinose 05/8/26(金) 20:05 発言[未読]
【28031】Re:VariantにRangeオブジェクトを代入した... ちくたく 05/8/26(金) 21:08 質問[未読]
【28036】Re:VariantにRangeオブジェクトを代入した... ichinose 05/8/26(金) 23:01 発言[未読]
【28048】Re:VariantにRangeオブジェクトを代入した... ichinose 05/8/27(土) 11:24 発言[未読]
【28106】Re:VariantにRangeオブジェクトを代入した... ちくたく 05/8/29(月) 9:27 お礼[未読]

【28028】VariantにRangeオブジェクトを代入したと...
質問  ちくたく  - 05/8/26(金) 19:53 -

引用なし
パスワード
   いつもお世話になっています。
標題についてですが、例えば、

Dim rVar as Variant
rVar = Range("A1:A10")

とすると、rVarは1次元目にA1〜A10の値が入った
2次元配列になりますよね。
このrVarを1次元にする方法、つまり、
rVal(1,1) = Range("A1").Valueなのを、
rVal(1) = Range("A1").Value
にする方法はありますか?

例えば、
Dim newArr() As Integer, i As Integer
ReDim newArr(UBound(rVar))
For i = 1 To UBound(rVar)
   newArr(i) = rVar(i,1)
Next i
のような方法は思いつきますが、
わざわざループ用意するのもなぁ、と思いまして。

目的は、うざったいなぁ、と思う気分的なものなのですが。。。
よろしくお願いします。

【28029】Re:VariantにRangeオブジェクトを代入し...
発言  ichinose  - 05/8/26(金) 20:05 -

引用なし
パスワード
   ▼ちくたく さん:
こんばんは。
Transpose関数を使ってみて下さい。
'===============================================
Sub sample()
  Dim myvalue As Variant
  myvalue = Application.Transpose(Range("a1:a10").Value)
  For g0 = LBound(myvalue) To UBound(myvalue)
   MsgBox myvalue(g0)
   Next
End Sub

【28031】Re:VariantにRangeオブジェクトを代入し...
質問  ちくたく  - 05/8/26(金) 21:08 -

引用なし
パスワード
   ichinose さん、さっそくのご返事感謝致します。

お忙しいところ申し訳ありませんが、もう少し教えて頂けませんか。
Transpose関数というのが、行列を入れ替えるものだということがわかりました。
ですが、なぜ、行列を入れ替えると、一次元になるんでしょう???
myArr(0 To 10, 1)が
myArr(1, 0 To 10)になるイメージなのですが???
不思議でたまりません。

> Range("a1:a10").Value
のように、Valueプロパティを使っていれるのがポイントかとも
思ったのですがそうでもないみたいですし。
ネットで検索かけてみたんですが、うーん。
目からうろこなんですが、不思議です。

>▼ちくたく さん:
>こんばんは。
>Transpose関数を使ってみて下さい。
>'===============================================
>Sub sample()
>  Dim myvalue As Variant
>  myvalue = Application.Transpose(Range("a1:a10").Value)
>  For g0 = LBound(myvalue) To UBound(myvalue)
>   MsgBox myvalue(g0)
>   Next
>End Sub

【28036】Re:VariantにRangeオブジェクトを代入し...
発言  ichinose  - 05/8/26(金) 23:01 -

引用なし
パスワード
   ▼ちくたく さん:
こんばんは。

>
>お忙しいところ申し訳ありませんが、もう少し教えて頂けませんか。
>Transpose関数というのが、行列を入れ替えるものだということがわかりました。
>ですが、なぜ、行列を入れ替えると、一次元になるんでしょう???
>myArr(0 To 10, 1)が
>myArr(1, 0 To 10)になるイメージなのですが???
>不思議でたまりません。
そうですねえ!!
私も不可解です・・・。
本当の理由は、Excelに聞いてみないとわかりません!!

ただ、・・・。

例えば、2次元配列って内部データも
Excelシートのように平面にデータが配置されているわけではありません。

内部的には全て一次元配列のようにデータは配置されていると思っています。

これをExcelはアルゴリズムを駆使して、2次元配列や3次元配列を扱っているように
私たちには見せてくれているのだと思います。

例えば Myarray(1 to 5,1 to 3)

Myarray(r,c)は

Myarray(5*(c-1)+r)

というような一次元配列で管理されているのだと思います。


この過程で
myArr(0 To 10, 1)をmyArr(0 To 10)に変換する方が
アルゴリズムが簡単だったのだろうと推測していますが・・・。

あくまでも推測ですけどネ!!

【28048】Re:VariantにRangeオブジェクトを代入し...
発言  ichinose  - 05/8/27(土) 11:24 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。
>>ですが、なぜ、行列を入れ替えると、一次元になるんでしょう???
がわかったわけではありませんが、Trannspose関数も追伸。

>Sub sample()
>  Dim myvalue As Variant
>  myvalue = Application.Transpose(Range("a1:a10").Value)
>  For g0 = LBound(myvalue) To UBound(myvalue)
>   MsgBox myvalue(g0)
>   Next
>End Sub

は、myvalue(1 to 10,1)の配列の一次元への変換でしたが、

range("a1:j1")を一次元配列に格納するには??
'====================================
Sub sample2()
  Dim myvalue1 As Variant
  Dim myvalue2 As Variant
  Range("a1:j1").Value = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  myvalue1 = Range("a1:j1").Value
  For g0 = LBound(myvalue1, 2) To UBound(myvalue1, 2)
    MsgBox "myvalue1(1," & g0 & ")= " & myvalue1(1, g0)
    Next
  'そのまま移行するとMyvalue(1 to 1,1 to 10)の2次元配列ですが
  
  With Application
    myvalue2 = .Transpose(.Transpose(Range("a1:j1").Value))
    End With
  '↑のようにTransposeに2回通すと一次元配列にしてくれます。
  For g0 = LBound(myvalue2) To UBound(myvalue2)
    MsgBox "myvalue2(" & g0 & ")= " & myvalue2(g0)
    Next
End Sub

実行してみて下さい。


但し、このTranspose関数Excel2000では
配列は、添え字の上限は5xxxまでです。
Excel2002以降でも 65536です。
ここに関連トピックがありますから
参考にして下さい。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=18896;id=excel

【28106】Re:VariantにRangeオブジェクトを代入し...
お礼  ちくたく  - 05/8/29(月) 9:27 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。
返信が遅くなりまして申し訳ありません。

ますますもって不思議なTrannspose関数による一次元変換。
Microsoftに言わせれば、お得意の、
仕様
ということになるのでしょうか。

>  'そのまま移行するとMyvalue(1 to 1,1 to 10)の2次元配列ですが
>  With Application
>    myvalue2 = .Transpose(.Transpose(Range("a1:j1").Value))
>    End With

これも、不可解ですね。不思議です。
個人的にもネットで調べたりしてみたのですが、
多次元配列→一次元配列の謎は解けませんでした。
ただ、このスクリプトをみると、妙なアルゴリズムで、
次元変換をしている可能性を示唆している感じがします。
アルゴリズム考えるの苦手なんで、何故こんなアルゴリズムを
組み立てたのかに思いははせられませんが。
ありがとうございます。

いやぁ、相変わらず、エクセルって不思議です。
計算間違いとかしてくれなければもっといい子なのに(ボソッ)

9311 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free