Excel VBA質問箱 IV

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

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


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

【7791】配列についての質問です kawata 03/9/18(木) 11:53 質問
【7795】Re:配列についての質問です ichinose 03/9/18(木) 12:04 回答
【7797】Re:配列についての質問です こうちゃん 03/9/18(木) 12:12 発言
【7798】Re:配列についての質問です kawata 03/9/18(木) 12:39 お礼
【7802】Re:配列についての質問です こうちゃん 03/9/18(木) 13:29 発言
【7803】Re:配列についての質問です kawata 03/9/18(木) 13:46 お礼
【7796】Re:配列についての質問です こうちゃん 03/9/18(木) 12:11 回答

【7791】配列についての質問です
質問  kawata  - 03/9/18(木) 11:53 -

引用なし
パスワード
   kawataです、よろしくお願いします。
(Windows2000/Excel2000)

セルのデータを加工するのに、これまではセルデータを直に
読んで書いてとやっておりましたが、ここにきて、ようやく
配列に手を出しはじめました(^^;。
望むように動作すれば圧倒的な速度差に感激しております。

で、いろいろ勉強のためにテストしているのですが、

Sub test()
Dim aaa() As Variant
  With Sheets("sheet1").Range("a1:a20")
    aaa = .Value
    For i = 1 To UBound(aaa)
      aaa(i, 1) = "済" & aaa(i, 1)
    Next
    .Value = aaa
  End With
End Sub

「test」は問題なく動作します、これを・・・・・

Sub test2()
Dim aaa() As Variant
Dim bbb() As Variant
  With Sheets("sheet1").Range("a1:a20")
    aaa = .Value
    ReDim bbb(UBound(aaa), 1)
    For i = 1 To UBound(aaa)
      bbb(i, 1) = "済" & aaa(i, 1)
'      Debug.Print bbb(i, 1)
    Next
    .Value = bbb
  End With
End Sub

のようにすると、Range("a1:a20")は全部消えてしまいます。
根本的なところで配列の理解ができていないように思います(^^;。

とんちんかんな質問をしているのかどうかも自分で判断できません。
ぜひ、よろしくお願いします。
※Debug.Print bbb(i, 1)で中身は確認できているのですけども・・。

【7795】Re:配列についての質問です
回答  ichinose  - 03/9/18(木) 12:04 -

引用なし
パスワード
   ▼kawata さん:
こんにちは。

>kawataです、よろしくお願いします。
>(Windows2000/Excel2000)
>
>セルのデータを加工するのに、これまではセルデータを直に
>読んで書いてとやっておりましたが、ここにきて、ようやく
>配列に手を出しはじめました(^^;。
>望むように動作すれば圧倒的な速度差に感激しております。
>
>で、いろいろ勉強のためにテストしているのですが、
>
>Sub test()
>Dim aaa() As Variant
>  With Sheets("sheet1").Range("a1:a20")
>    aaa = .Value
>    For i = 1 To UBound(aaa)
>      aaa(i, 1) = "済" & aaa(i, 1)
>    Next
>    .Value = aaa
>  End With
>End Sub
>
>「test」は問題なく動作します、これを・・・・・
>
>Sub test2()
>Dim aaa() As Variant
>Dim bbb() As Variant
>  With Sheets("sheet1").Range("a1:a20")
>    aaa = .Value
    ReDim bbb(1 to UBound(aaa), 1 to 1)
'にしてみて下さい
>    For i = 1 To UBound(aaa)
>      bbb(i, 1) = "済" & aaa(i, 1)
>'      Debug.Print bbb(i, 1)
>    Next
>    .Value = bbb
>  End With
>End Sub
>
>のようにすると、Range("a1:a20")は全部消えてしまいます。
>根本的なところで配列の理解ができていないように思います(^^;。
>
>とんちんかんな質問をしているのかどうかも自分で判断できません。
>ぜひ、よろしくお願いします。
>※Debug.Print bbb(i, 1)で中身は確認できているのですけども・・。

【7796】Re:配列についての質問です
回答  こうちゃん E-MAIL  - 03/9/18(木) 12:11 -

引用なし
パスワード
   kawataさん、こんにちは

配列のベースが0になってませんか?
モジュールの先頭に下記を書いてみてください。

Option Base 1

【7797】Re:配列についての質問です
発言  こうちゃん E-MAIL  - 03/9/18(木) 12:12 -

引用なし
パスワード
   ichinoseさん、ごめんなさい、かぶっちゃいました。
開きっぱなしで検証してました(^^;)

【7798】Re:配列についての質問です
お礼  kawata  - 03/9/18(木) 12:39 -

引用なし
パスワード
   kawataです、よろしくお願いします。

ichinoseさん、こうちゃんさん、ありがとうございました。
OKでした、望む結果になりました。

で、さてと・・・・・・・・(^^;、

ReDim bbb(1 to UBound(aaa), 1 to 1)
及び
Option Base 1

とする理由を、これから調べないと(^^;。
いまいち、配列はややこしいの感を抜け出せないでいますが、
使いこなせるようになるとスマートなコードを書けますね、
頑張ります。

ありがとうございました!!。
またよろしくお願いします。

特に配列主体で解説してくれているサイト等あります?(^^;。

【7802】Re:配列についての質問です
発言  こうちゃん E-MAIL  - 03/9/18(木) 13:29 -

引用なし
パスワード
   kawataさん、こんにちは

>ReDim bbb(1 to UBound(aaa), 1 to 1)
>及び
>Option Base 1
>とする理由

ですが、詳細はお調べいただくこととして、簡単に解説を・・

配列は特に指定しないと、添字が「0」から始まります。
ReDim bbb(UBound(aaa), 1) としてUBound(aaa)が 20 だった場合は
bbb(0,0)からbbb(20,1)までの器ができることになります。

一方、エクセルの範囲を配列を宣言せずに使用して格納する場合、変数(1,1)から格納されます。
kawataさんのコードではaaa(1,1)〜aaa(20,1)に格納されることになります。
コードから、bbbも、bbb(1,1)〜bbb(20,1)に値が格納されています。
これをセル範囲に書き戻す場合、添字を指定せずに、一括書き込みする場合、
(.Value = bbb のような指定)一番低い次元から書き込みされます。
この場合は、bbb(0,0)〜bbb(19,0)が書き戻されることになりますのでなにも表示されなくなります。

>ReDim bbb(1 to UBound(aaa), 1 to 1)
または
>Option Base 1
とすることにより、bbbのベースを1とする(bbb(1,1)からbbb(20,1)を作成)ことによりコードの矛盾を回避できます。

ちなみに、下記のコードを実行すると感覚がつかめるかも・・

Sub test2()
Dim aaa() As Variant
Dim bbb() As Variant
  With Sheets("sheet1").Range("a1:a20")
    aaa = .Value
    ReDim bbb(UBound(aaa), 1)
    For i = 1 To UBound(aaa)
      bbb(i, 1) = "済" & aaa(i, 1)
    Next
    Sheets("sheet1").Range("a1:b20").Value = bbb
  End With
End Sub

【7803】Re:配列についての質問です
お礼  kawata  - 03/9/18(木) 13:46 -

引用なし
パスワード
   kawataです、よろしくお願いします。

こうちゃんさん、ありがとうございます。

>>ReDim bbb(1 to UBound(aaa), 1 to 1)
>>及び
>>Option Base 1
上の2つは、同じことをしているということまではヘルプから
たどりつくことができました。
「1 to UBound(aaa)」の「1」ですね、ポイントは。
しかし、それが疑問の解決にはならなくてモンモンとしていたところ(^^;、

>一方、エクセルの範囲を配列を宣言せずに使用して格納する場合、変数(1,1)から格納されます。
>kawataさんのコードではaaa(1,1)〜aaa(20,1)に格納されることになります。
>コードから、bbbも、bbb(1,1)〜bbb(20,1)に値が格納されています。
>これをセル範囲に書き戻す場合、添字を指定せずに、一括書き込みする場合、
>(.Value = bbb のような指定)一番低い次元から書き込みされます。
>この場合は、bbb(0,0)〜bbb(19,0)が書き戻されることになりますのでなにも表示されなくなります。

これで目が覚めたようです(^^;。
まだボンヤリとですが分かりかけてきたような気がします、
頂いたサンプルをいろいろ条件を変えてチェックしてみます。
これからのコーディングにおおいに役立ちそうです。
ありがとうございました。

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