このトピックに書きこむ |
---|
Re[17]: 配列の中身の一部分を指定したい。 | |
---|---|
[195210] Re[17]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/09/05(13:33)) □U R L/ >以前、Forループで転記しているのを、Indexに書き直したことがありましたが、 遅くなったので、元に戻したことがあります。 Forループの方が10倍ぐらい速いという結果になりました。 参考になります!!真逆かと思っておりました。 情報をありがとうございます。 シンプルにループだけど、 >配列から配列への転記は高速ですよ。 ・・の通りなのですね。。 |
[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倍ぐらい速いという結果になりました。 |
[195207] Re[15]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/09/03(18:21)) □U R L/ マナさん アドバイスありがとうございます!! >配列から配列への転記は高速ですよ。 そうなのですね!!勉強になります^^ 試してみます。 |
[195203] Re[14]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/09/02(19:38)) □U R L/ ちなみに、↓試してみてはどうですか。配列から配列への転記は高速ですよ。 >子供バッファを別に用意してそこにfor文でバッファ"v"の指定した部分を入れ込んでいき、 >子供バッファができあがったらそれをそのままセルにコピペすることで >少しでも速度を早くしてみようかとも思いました。 |
[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) |
[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)"))のように短くまとまらないかもです。。 |
[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 |
[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}]) |
[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のコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[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のコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195188] Re[7]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/09/01(15:27)) □U R L/ その場合は Evaluate("row(" & cnt & ":4)") とか Application.Sequence(3, , cnt) |
[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のコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195186] Re[5]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/09/01(14:30)) □U R L/ 数式だと C1:=CHOOSEROWS(A1:A5,ROW(2:4)) |
[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のコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195184] Re[3]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/09/01(14:01)) □U R L/ マナさんいつもありがとうございます!! 例えば、以下のイメージです。 行 _A_ _B_ _C_ 1 あ い 2 い う 3 う え 4 え 5 お |
[195183] Re[2]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ マナ -(2022/09/01(13:59)) □U R L/ 図表モード |
[195182] Re[1]: 配列の中身の一部分を指定したい。- ■記事引用/メール受信=OFF■ □投稿者/ 無職勉強中 -(2022/09/01(13:57)) □U R L/ 行 _A_ _B_ _C_ 1 あ い 2 い う 3 う え 4 え 5 お |
[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 ++++++++++++++++++++ |