戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
配列の中身の一部分を指定したい。

    [195181] 配列の中身の一部分を指定したい。-

    ■親トピック/記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(13:52))
    □U R L/

      教えてください。

      以下でdatabufという配列を定義しました。
      -------------------------------------

      dim databuf as variant

      databuf=range("A1:A5")

      -------------------------------------


      rangeですと、例えばrange("A2:A4")とか一文で複数のセルの中身を指定できるのですが
      databufだと、複数箱分の指定の仕方があるのかわかりません。


      やるとしたら、以下のようにfor文でループするしかないでしょうか。
      for cnt = 1 to 3
      range("C" & cnt) = databuf(cnt+1,1)
      next


      <イメージ>

      A
      1 あ
      2 い
      3 う
      4 え
      5 お



      A B C
      1 あ い
      2 い う
      3 う え
      4 え
      5 お




      ++++++++++++++++++++
      OS      ⇒OTHER
      Version⇒OTHER
      ++++++++++++++++++++




    [195182] Re[1]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(13:57))
    □U R L/

      行 _A_ _B_ _C_
      1 あ い
      2 い う
      3 う え
      4 え
      5 お




    [195183] Re[2]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(13:59))
    □U R L/

      図表モード




    [195184] Re[3]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(14:01))
    □U R L/
      マナさんいつもありがとうございます!!
      例えば、以下のイメージです。
      
      行  _A_  _B_  _C_
       1   あ        い
       2   い        う
       3   う        え
       4   え
       5   お




    [195185] Re[4]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(14:21))
    □U R L/
      index関数
      
      Sub test()
          Dim v
          
          v = Range("A1:A5").Value
          v = Application.Index(v, [row(2:4)])
          Range("C1").Resize(UBound(v)).Value = v
      
      End Sub
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195186] Re[5]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(14:30))
    □U R L/

      数式だと

      C1:=CHOOSEROWS(A1:A5,ROW(2:4))




    [195187] Re[6]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(15:12))
    □U R L/
      マナさん
      
      ありがとうございます!!
      Application.index自体、全く知らなかったです。。[]というカギかっこの方法も。。
      
      ただ、実際には[row(2:4)]でなくて、[row(cnt:4)]みたいに変数が入るようにしたいので以下をテストしたのですが、どうしてもエラーが出てしまいます。
      こちらはどのようにしたらよろしいでしょうか。。
      
      Sub test()
          Dim v
          Dim cnt As Long
      
          '仮に"2"を入れてテストしました。
          cnt = 2
      
          v = Range("A1:A5").Value
          v = Application.Index(v, [row(cnt:4)])
          Range("C1").Resize(UBound(v)).Value = v
      
      End Sub


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195188] Re[7]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(15:27))
    □U R L/

      その場合は

      Evaluate("row(" & cnt & ":4)")
      とか
      Application.Sequence(3, , cnt)




    [195189] Re[8]: 配列の中身の一部分を指定したい。-

    保留中です・・・ / 記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(16:17))
    □U R L/
      マナさん
      
      ありがとうございます!!以下で成功、うまくいきました。
      (いろいろネットで調べても文献が見つからずわからずでしたが、凄いです。。(;;
      ))
      
      []の代わりにevaluateというものがあるんですね。
      
      Sub test()
          Dim v
          Dim cnt As Long
      
          '仮に"2"を入れてテストしました。
          cnt = 2
      
          v = Range("A1:A5").Value
          v = Application.Index(v, Evaluate("row(" & cnt & ":4)"))
          Range("C1:C3") = v
      
      
      End Sub
      
      また、これで応用しようと思ったのですが、
      以下のような多次元の配列での実現は難しいですか。
      いくらやってみてもうまくいかなかったです。
      
      例えば、Range("A2:C4")に対する指定とか、Range("B2:C4")に対する指定とか。。
      
      
      行  _A_  _B_  _C_
       1   あ   か   さ  
       2   い   き   し  
       3   う   く   す  
       4   え   け   せ
       5   お   こ   そ
      
      
      もし応用の場面があって実現難しければ、子供バッファを別に用意してそこにfor文でバッファ"v"の指定した部分を入れ込んでいき、子供バッファができあがったらそれをそのままセルにコピペすることで少しでも速度を早くしてみようかとも思いました。。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195190] Re[9]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(16:28))
    □U R L/
      こうです。
      
      Sub test()
          Dim v
          
          v = Range("A1:C5").Value
          v = Application.Index(v, [{2;3;4}], [{2,3}])
          Range("E1").Resize(UBound(v, 1), UBound(v, 2)).Value = v
      
      End Sub
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195191] Re[10]: 配列の中身の一部分を指定したい。-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/01(17:12))
    □U R L/

      ありがとうございます!!
      実現できました。

      ただ、行の{2;3;4}はセミコロン区切りで、列の{2,3}は何故カンマなのかとか全くわからずで迷宮入りです。。(;;)
      v = Application.Index(v, [{2;3;4}], [{2,3}])




    [195192] Re[11]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/01(20:49))
    □U R L/

      >行の{2;3;4}はセミコロン区切りで、列の{2,3}は何故カンマ

      ht tps://support.microsoft.com/ja-jp/office/%E9%85%8D%E5%88%97%E5%AE%9A%E6%95%B0%E3%82%92%E9%85%8D%E5%88%97%E6%95%B0%E5%BC%8F%E3%81%AE%E4%B8%AD%E3%81%A7%E4%BD%BF%E3%81%86-477443ea-5e71-4242-877d-fcae47454eb8




    [195193] Re[12]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/02(12:54))
    □U R L/

      マナさん

      ありがとうございます!!
      拝見いたしました!!
      なるほど、セミコロンが改行を表し、カンマが横に移動ということですね。
      よく理解できました。

      ただ、数値が変数でして場合により長いと1万{2;3;・・10000}{2,3,・・10000}とかにも及びそうで
      v = Application.Index(v, [{2;3;4}], [{2,3}])

      最初に質問しました1列だけのパターン
      v = Application.Index(v, Evaluate("row(" & cnt & ":4)"))のように短くまとまらないかもです。。




    [195200] Re[13]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/02(16:37))
    □U R L/

      index関数の第3引数も同じように変数を使えばよいだけ。
      違いは、1次元配列であること。


      >{2;3;・・10000}

      [row(2:10000)]
      Evaluate("row(2:10000)")
      Application.Sequence(9999,,2)


      >{2,3,・・10000}

      [transpose(row(2:10000))]
      Evaluate("transpose(row(2:10000))")
      Evaluate("transpose(row(" & cnt & ":10000))")
      Application.Sequence(,9999,2)
      Application.Sequence(,9999,cnt)




    [195203] Re[14]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ マナ -(2022/09/02(19:38))
    □U R L/
      ちなみに、↓試してみてはどうですか。配列から配列への転記は高速ですよ。
      
      >子供バッファを別に用意してそこにfor文でバッファ"v"の指定した部分を入れ込んでいき、
      >子供バッファができあがったらそれをそのままセルにコピペすることで
      >少しでも速度を早くしてみようかとも思いました。
      




    [195207] Re[15]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/03(18:21))
    □U R L/

      マナさん

      アドバイスありがとうございます!!

      >配列から配列への転記は高速ですよ。

      そうなのですね!!勉強になります^^
      試してみます。





    [195208] Re[16]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ hatena -(2022/09/04(20:46))
    □U R L/
      以前、Forループで転記しているのを、Indexに書き直したことがありましたが、
      遅くなったので、元に戻したことがあります。
      
      今回、下記のようなコードで試してみました。
      
      10000×1000の配列から、5000×500の部分を配列に抜き出す。
      
      Option Explicit
      Const rcnt = 10000
      Const ccnt = 1000
      Dim ary()
      
      Public Sub MakeAry()
          Dim st As Single
          st = Timer
      
          ReDim ary(1 To rcnt, 1 To ccnt)
          
          Dim r As Long, c As Long
          For r = 1 To rcnt
              For c = 1 To ccnt
                  ary(r, c) = "R" & r & "C" & c
              Next
          Next
          Debug.Print "MakeAry", Format(Timer - st, "0.00000")
      
      End Sub
      
      Public Sub testIndex()
          Dim st As Single
          st = Timer
          
          Dim v()
          v = Application.Index(ary, Application.Sequence(5000, , 2500), Application.Sequence(, 500, 250))
          Debug.Print "Index使用", Format(Timer - st, "0.00000")
          
          Application.ScreenUpdating = False
          Worksheets(2).Cells(1).Resize(UBound(v, 1), UBound(v, 2)).Value = v
          Application.ScreenUpdating = True
      
      End Sub
      
      Public Sub testForLoop()
          Dim st As Single
          st = Timer
          
          Dim v()
          Dim w()
          ReDim w(1 To 5000, 1 To 500)
          Dim r As Long, c As Long
          For r = 1 To 5000
              For c = 1 To 500
                  w(r, c) = ary(r + 2499, c + 249)
              Next
          Next
          Debug.Print "Forループ使用", Format(Timer - st, "0.00000")
          
          Application.ScreenUpdating = False
          Worksheets(2).Cells(1).Resize(UBound(w, 1), UBound(w, 2)).Value = w
          Application.ScreenUpdating = True
      
      End Sub
      
      
      当方の環境では、結果は下記になりました。
      
      配列生成      6.26563
      Index使用     3.15625
      Forループ使用 0.27344
      
      Forループの方が10倍ぐらい速いという結果になりました。
      
      
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195210] Re[17]: 配列の中身の一部分を指定したい。-

    記事引用/メール受信=OFF■

    □投稿者/ 無職勉強中 -(2022/09/05(13:33))
    □U R L/

      >以前、Forループで転記しているのを、Indexに書き直したことがありましたが、
      遅くなったので、元に戻したことがあります。
      Forループの方が10倍ぐらい速いという結果になりました。

      参考になります!!真逆かと思っておりました。
      情報をありがとうございます。


      シンプルにループだけど、
      >配列から配列への転記は高速ですよ。
      ・・の通りなのですね。。



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G