戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
配列を使って範囲の値を一括別の場所にコピー

    [191456] 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/23(15:41))
    □U R L/
      配列の書式をネットで調べながらやってみたのですが、うまくいきません。教えてください。
      B2からK11までの10列10行の範囲に入力されている値を
      A2〜A102までの1列にコピーしたいです。
      
      For Each in のループでコピーするマクロは完成したのですが、仕事では1200個のデータを扱うため、少し時間がかかります。
      配列で一気にできないかと思い、質問いたしました。
      
      下記のものを書いたのですが、A2からA12の1列分のみコピーされ、その下には
      エラー値が表示されてしまいます。
      
      Dim MyAry As Variant
      MyAry = Range("B2:K11").Value
      Range("A2:A102").Value = MyAry
      
      どのようにすればいいでしょうか。


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

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



      ++++++++++++++++++++
      OS      ⇒Windows XP
      Version⇒Excel 2007
      ++++++++++++++++++++




    [191457] Re[1]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 半平太 -(2020/02/23(16:03))
    □U R L/
      >1200個のデータ
       1200程度だったら大した時間は掛からないと思うんですけどねぇ。
      
       画面更新を止めるくらいの処置で改善するんじゃないですか?
      
       つまり、下記2行を挿入する。
      
       For ループの上に Application.ScreenUpdating = False
      
       Next の下に    Application.ScreenUpdating = True


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

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




    [191460] Re[2]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/23(17:56))
    □U R L/
      ・縦長の配列を予め準備
      ・繰り返しで配列に転記
      ・一括してシートに書き込み
      としては?




    [191463] Re[3]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/23(18:37))
    □U R L/

      ご回答ありがとうございます。
      screenupdaing false true はすでにやっております。
      1200個はわずかで、待ち時間も十数秒ですが、極限までの時間短縮を目指しております。

      縦の配列を繰り返す方法、試してみます!




    [191464] Re[4]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/23(20:58))
    □U R L/
      僭越ながらコードを書いてみました。
      
      Sub test()
          Dim ary As Variant
          Dim mat()
          Dim j&, k&, nr&, nc&
          
          Dim t
          t = Timer
          
          'ary = Range("B2:K11").Value
          ary = Range("B2").Resize(120, 10).Value
          
          '配列定義
          nr = UBound(ary, 1)
          nc = UBound(ary, 2)
          ReDim mat(1 To nr * nc, 1 To 1)
          
          '転記
          For j = 1 To nc
              For k = 1 To nr
                  mat((j - 1) * nr + k, 1) = ary(k, j)
              Next
          Next
          
          'シート書き込み
          Range("A2").Resize(nr * nc, 1).Value = mat
      
          Debug.Print Timer - t
      End Sub
      
      1200セルで10数秒はかかりすぎですね。
      他のセルに計算式がたくさんあるんでしょうか。
      マクロで、手作業モードでしてから処理実行し、元に戻すようにしてみたら、
      10数秒が圧縮されませんか?
      
      ちなみに、上記のコードだとたぶん0.1秒もかからないと思います。
      
      


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

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




    [191466] Re[5]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/23(21:14))
    □U R L/
      コードありがとうございます。
      理解力が足りなく、書いていただいたコードがしっくり理解できません。
      下記のようにシンプル化しましたので、理屈を教えてください。
      データが2列分あるとします。
      1列ごと配列に格納します。
      各列を別の配列にループして追加します。
      それを一括、貼りつけます。
      という意図で、追加のところまで書いたのですが、
      間違っているようです。どう書き直せばいいでょうか。
      
      Dim MyAry1 As Variant
      Dim MyAry2 As Variant
      
      Dim MyAry As Variant
      
      MyAry1 = Range("b2:b11")
      MyAry2 = Range("c2:c11")
      
      MyAry() = MyAry1
      Redim Preserve MyAry() = MyAry2


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

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




    [191467] Re[6]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/23(21:25))
    □U R L/
      申し訳ないですが、私が提示したものを使ってもらえますか?
      それをそのまま解釈するように務めて下さい。
      あなたの自己流に解釈したものは間違っているので、
      論じても意味がないと思われます。
      




    [191468] Re[7]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/23(21:35))
    □U R L/

      了解いたしました。
      がんばります!




    [191471] Re[8]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/24(08:25))
    □U R L/

      ありがとうございました。



      ++++++++++++++++++++
      OS      ⇒Windows XP
      Version⇒Excel 2007
      ++++++++++++++++++++




    [191475] Re[9]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/24(12:04))
    □U R L/
      参考までに、あなたの(2020/02/23(21:14))の発言について
      あらためてコメントしておきます。
      
      (1)MyAry() = MyAry1 はMyAryが配列として宣言されていないので、実行時エラーとなる。
         また、そもそも、MyAry() = という書き方は成立しない。indexを指定する必要がある。
      
      (2)Redim Preserve MyAry() = MyAry2  も同様。
         そもそもRedim Preserve を使って動的配列を広げていく手法は、
         配列の大きさが予め決められないときに使用するもの。
         今回は、転記元の配列が決まっているのだから、一度だけRedimすればよいはずです。
         
      (3)仮に使うとしても、Redim は 配列の次元(と、それぞれの下限、上限)を指定するものだが、
         要素が指定されていない。
         それに、Redimと代入を同時に実行するといった文法は許されていない。
      
      要するに適当にキーワードをつなげているだけではないでしょうか。
      
      最大限忖度してエラーの出ないものに修正すると、こんなことになる。
      Sub test()
          Dim MyAry1 As Variant
          Dim MyAry2 As Variant
      
          Dim MyAry() As Variant
      
          MyAry1 = Range("b2:b11")
          MyAry2 = Range("c2:c11")
      
          ReDim MyAry(0)
          MyAry(0) = MyAry1
          ReDim Preserve MyAry(0 To 1)
          MyAry(1) = MyAry2
      End Sub
      
      しかし、こうしてできあがったMyAryは、
      ふたつの要素がそれぞれ配列である1次元配列となるが、これをワークシートに書くことはできない。
      ワークシートに書き込める形式の配列は、
      通常の数値や文字列を要素に持つ二次元配列(もしくは一次元配列)に限られます。
      (そのような二次元配列であるVariant型変数も同類です)
      
      そして重要なのは、そうした二次元配列に値を入れるには、
      要素ごとに転記するしか手がないということ。
      配列をまとめて要素毎に転記するといった機能は、VB6の機能として提供されていない。
      例えば、二次元配列mat(1 To 2, 1 to 2)の一行目だけをまとめて 
      mat(1,) = Array(1,2)のように更新するといったことはできません。
      mat(1,1),mat(1,2)にそれぞれ値を入れるしかありません。
      
      これは、一次元配列に要素を書き込むときも同様。
      要素毎にひとつづつ入れていくほかない。
      
      ○
      コーディングというものは、
      自由奔放に自分のアイデアを可視化していく絵画のようなものとは違います。
      一定のルールに沿って書かないとエラーになるだけです。
      自分の思いつきではなく、まずは例文などをもとに、それを修正していくような
      着実な方法をとったほうがよいと思います。
      実際に動くものを提示しているのに、それとまったく異なるものを引き合いに
      出してくるのはとても違和感がありました。
      
      なお、要素ごとに転記する方法は、一般的なものと思います。
      配列の宣言方法や、For .. Nextの繰り返しの構文さえ理解していればさほど
      難しいことではないと思います。
      理解いただけたのでしょうか?
      
      そして、
      >極限までの時間短縮を目指しております。
      についての結果はどうだったのですか?
      イミディエイトウインドウに所要時間(秒)が表示されるはずです。


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

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




    [191476] (削除)-

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

    □投稿者/ / -(2020/02/24(13:05))
    □U R L/

      この記事は削除されました




    [191477] Re[11]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ ・・・・・ -(2020/02/24(13:47))
    □U R L/

      多分同じ人です。

      [[20200210140928]] 『最速の転記方法について』(C)
      h ttp://www.excel.studio-kazu.jp/kw/20200210140928.html




    [191478] Re[11]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ まっつわん -(2020/02/24(13:52))
    □U R L/
       >極限までの時間短縮を目指しております。
      解決が早いですねー。。。
      0.5秒未満なら実用としてはOKくらいの感覚でしょうか。。。。?
      
      Sub test()
          Dim rngFrom As Range
          Dim rngTo As Range
          Dim c As Range
          Dim ix As Long
          Dim t
          
          t = Timer
          
          Set rngFrom = Range("B2").Resize(200, 60)
          Set rngTo = Range("A2").Resize(rngFrom.Cells.Count)
          
          For Each c In rngFrom
              ix = ix + 1
              rngTo(ix).Value = c.Value
          Next
          
          MsgBox Timer - t & " 秒"
      End Sub
      
      1個づつ転記して、こちらの環境で1秒強。
      
      って12000個で実験してるし><
      
      Sub test2()
          Dim rngFrom As Range
          Dim rngTo As Range
          Dim vrtFrom As Variant
          Dim vrtTo As Variant
          Dim v As Variant
          Dim ix As Long
          Dim t
          
          t = Timer
          
          Set rngFrom = Range("B2").Resize(200, 60).Cells
          Set rngTo = Range("A2").Resize(rngFrom.Cells.Count).Cells
          vrtFrom = rngFrom.Value
          vrtTo = rngTo.Value
          
          For Each v In vrtFrom
              ix = ix + 1
              vrtTo(ix, 1) = v
          Next
          
          rngTo.Value = vrtTo
          
          MsgBox Timer - t & " 秒"
      End Sub
      
      配列で処理したら、、、、
      0.1秒未満だ!と思ったら縦優先!?
      (T_T)
      
      新規ブックのまま空白で実験してて気づかなかった><
      そうなると1200個のセルで10秒以上というのは、
      γさんが言及されているように、
      数式の再計算が影響しているのかなぁとというのが第一感ですね。
      シート上がどうなっているか詳しい説明が欲しいところです。
      
      もう少し改善の余地もあるのかな。。。。
      あ、他の方の回答のコードは見てません。
      自分が勉強した成果を共有して参考になればと思い書き込みしてます。
      比較してみることに意義はあるとは思いますが、
      同じことをしてもしょうがないし。(その比較の結果報告は質問者さんにお願いしたい)
      
      >rngTo(ix).Value = c.Value
      rngTo(ix) = c
      とすると若干速くなりそうですね。(バージョンで結果が違うかも知れません)
      若干なので、僕なら1秒未満で処理できるなら、読みやすさを優先させますが、
      極限を目指すなら、コツとして覚えておいて損はないかと。
      
      参考になれば。


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

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




    [191484] Re[12]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/24(16:14))
    □U R L/
      以下のほうが理解し易いのではという指摘を頂きました。
      まったくそのとおりでした。ありがとうございました。
      # 頭が石になりつつあるんですかね。
      
         '転記
          n = 1
          For j = 1 To nc
              For k = 1 To nr
                  mat(n, 1) = ary(k, j)
                  n = n + 1
              Next
          Next
      
      また、
      Dim j& というのも不適切だったですね。
      Dim j As Long
      と同じです。
      
      型宣言文字といいます。
      文字列は $
      Doubleは  #
      など、記載の手間が減るので自分のコードには使います。
      回答するときは控えているのですが、ついうっかりしました。
       
      


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

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




    [191492] Re[13]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ 鳥獣Gaga -(2020/02/24(18:01))
    □U R L/

      大変ご丁寧に説明をありがとうございます。
      おかげさまで、理解が進みました。
      文法をしっかり把握していないものですから、ついつい、こんなふうにできないか、という発想で、やってみては、質問をして間違いを教えていただいております。

      さて、実際の速度のことなのですが、十数秒かかった時の状態がどうなっていたかは保存してなくてわかりません。申し訳ございません。

      130行×10列のデータ処理と、あらたに、転記したものを並べ替えて、同一データの個数を隣に表示させて、などのを追加しても、0.2秒くらいです。



      ++++++++++++++++++++
      OS      ⇒Windows XP
      Version⇒Excel 2007
      ++++++++++++++++++++




    [191514] Re[14]: 配列を使って範囲の値を一括別の場所にコピー-

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

    □投稿者/ γ -(2020/02/25(06:33))
    □U R L/
      私も勉強になりました。
      デタラメなコードを出して回答者の修正に期待する、
      という方式を意識的に採る人がいる。
      しかもそれを指摘しても、なんら変えようとは思わないとのこと。
      いろいろな方がいらっしゃるということを、改めて学習いたしました。
      ありがとう。
      こちらも適度に距離を置いた回答に留める必要があるようです。
      
      



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

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

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


- Child Forum -
Edit:ゆう-G