Page 881 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼配列で他の列に値を渡すと#N/Aが表示される ishy 03/3/14(金) 0:47 ┗Re:配列で他の列に値を渡すと#N/Aが表示される Kein 03/3/14(金) 1:16 ┗Re:配列で他の列に値を渡すと#N/Aが表示される ishy 03/3/14(金) 10:16 ┗Re:配列で他の列に値を渡すと#N/Aが表示される Kein 03/3/14(金) 15:27 ┗Re:配列で他の列に値を渡すと#N/Aが表示される ishy 03/3/14(金) 17:27 ┗Re:配列で他の列に値を渡すと#N/Aが表示される Kein 03/3/15(土) 20:28 ┗Re:配列で他の列に値を渡すと#N/Aが表示さ... ishy 03/3/17(月) 10:29 ─────────────────────────────────────── ■題名 : 配列で他の列に値を渡すと#N/Aが表示される ■名前 : ishy <ishy88@hotmail.com> ■日付 : 03/3/14(金) 0:47 -------------------------------------------------------------------------
2回目の質問です。宜しくお願いします。 やりたいこと:列コピーをしていると、とても時間がかかるので、 配列で列コピーのようなことをしたい。 理由:列コピーは現在なんとかできているのですが、取り込みシート5枚、総列数500弱を 出力先シートに規定の数の列だけ、コピーする。 この処理に時間がかかります。 コピー用の関数をつくりましたが、まだ時間がかかっている気がしてしかたがないのです。 実際に配列で上記のやりたいことはできました。 ただし、空白セルに"#N/A"が入ってしまうのです。 もちろんあとで、これを消す手もありますが、とても無駄なような気がします。 最初から"#N/A"でなければ話は早いと思います。 どうすればいいのでしょうか。。。 (配列は初チャレンジなので、変な使い方をしていたらすいません それも教えていただくとうれしいです。) 下記に私が作成したコードを書きます。 (同シートのA列からB列に値を渡しています。 "#N/A"がでないようにするところだけけっこうなので 宜しくお願いします。) Sub test1() Dim buf() As Variant'取り込み元の各列のセルには数値もあれば文字列もある。 Dim i As Long, n As Long buf = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Value '↑とりあえず、その列に値の最終行に関係なく、列ごと取得しています。 With Columns(2) .ClearContents .Value = buf() End With End Sub |
With Range("A1", Range("A65536").End(xlUp)) .Offset(, 1).Value = .Value End With これだけでいいのでは・・? |
▼Kein さん:おはようございます。 さっそくの回答ありがとうございます! >With Range("A1", Range("A65536").End(xlUp)) > .Offset(, 1).Value = .Value >End With > >これだけでいいのでは・・? 確かに"#N/A"が一切でませんでした。こんなに短かい 書き方ですむのですね。しりませんでした。 もし宜しければ、できれば列指定をoffsetではない方法 も教えていただけないでしょうか。 今回は同一シートでテストしてますが、実際には別シートの列に 値を渡すパターンが多いのです。ですので 別シートにしても大丈夫そうなコードが知りたいです。 質問のしかたが悪かったため、何度もすいません。 よろしくお願いします! |
>別シートの列に値を渡す 例えば参照する数式を入れる方法なら Dim MyArea As String With Sheets("Sheet1") MyArea = .Range("A1", .Range("B65536").End(xlUp)).Address End With Sheets("Sheet3").Range(MyArea).Formula = "=Sheet1!" & MyArea もちろん値を代入するコード Sheets("Sheet3").Range(MyArea).Value = _ Sheets("Sheet1").Range(MyArea).Value でも出来ますが、範囲が大きいなら数式の方が安全です。 |
▼Kein さん:ありがとうございます。 教えていただいたコードをテストしてみた所うまくいきました。 ありがとうございます。 一つ質問なんですが、 >でも出来ますが、範囲が大きいなら数式の方が安全です。 範囲が大きいということはどういう意味でしょうか。 ニュウアンスはわかるのですが、具体的に教えていただくとうれしいです。 (どう表現すればいいのかわからないのですが、 keinさんに教えてもらった方法を参照渡しと表現します。 間違えていたら教えて下さい。) 例えば、 1.2シート間で列の値を参照渡しする。 このとき、その列は連続した複数列である。 その列数が多い。(←多いの度合いもわからないのですが) 2.2シート間で列の値を参照渡しする。 このとき、列は一列だが、繰り返しその処理を行う。 繰り返し処理が多い。。(←多いの度合いもわからないのですが) 3.BOOK間で処理を行う。 (1.2.両方の処理を行う。) といったところでしょうか。 変数の中の値が不安定になるのでしょうか? 数式はというのは普通の代入のことでいいでしょうか。 例: Sheets("Sheet3").range(cells(1,1),cells(1,10)).Value = _ Sheets("Sheet1").range(cells(1,1),cells(1,10)).Value また、今は最終行("B65536")まで指定していますが、これを 本当に欲しい行までに指定すれば、少しは防げるのでしょうか。 よくわかっていなくて・・・。考えすぎでしょうか。 よろしくご指導お願いします。 |
▼ishy さん: >範囲が大きいということはどういう意味でしょうか。 >変数の中の値が不安定になるのでしょうか? 具体的にこれぐらい、とは言えません。値を代入する方法は、いちど全てのデータ をメモリに読み込むため、システムに大きな負荷がかるということです。 それなら大量のメモリを積めば良いのかというと、少ないよりはいいですが、 間違いなく効果がある、というわけではないようです。つまり環境によっても 状況によっても、不安定になる時とそうでない時があります。一度のテストで 問題がなかったとしても、大事な仕事に使うのであれば、安全を優先するべき と思います。突然メッセージが出てアプリが固まったら、時間をかけて入力した データが全てパーになります。そうなるかならないかを見極めるのは、玄人でも 難しいことのようです。 >また、今は最終行("B65536")まで指定していますが、これを >本当に欲しい行までに指定すれば、少しは防げるのでしょうか。 ("B65536").End(xlUp) になっていることを確認して下さい。エクセルの最大行数 まででなく「入力された値のある最終行」までを処理範囲にしてます。だから 10行しかなければ 10行分、ということになります。 65536行一杯まで使うことは、普通はありえないですから、このように書けるのです。 もしそこまで使うとしたら、値の代入かコピーかの選択以前に、迷わず Access等 のデータベースを使うことをお勧めします。 |
▼Kein さん:ありがとうございます。 すいません。最初の質問を超えたような、質問をしてしまって。 keinさんの説明がわかりやすくとても納得しました。 ↓本当に難しいですよね。本当に何を選択していけばいいのか、 まだまだひよこなんで色んな所で迷います。 >具体的にこれぐらい、とは言えません。値を代入する方法は、いちど全てのデータ >をメモリに読み込むため、システムに大きな負荷がかるということです。 >それなら大量のメモリを積めば良いのかというと、少ないよりはいいですが、 >間違いなく効果がある、というわけではないようです。つまり環境によっても >状況によっても、不安定になる時とそうでない時があります。一度のテストで >問題がなかったとしても、大事な仕事に使うのであれば、安全を優先するべき >と思います。突然メッセージが出てアプリが固まったら、時間をかけて入力した >データが全てパーになります。そうなるかならないかを見極めるのは、玄人でも >難しいことのようです。 ↓すいません読み切れてなかったです。 >("B65536").End(xlUp) になっていることを確認して下さい。エクセルの最大行数 >まででなく「入力された値のある最終行」までを処理範囲にしてます。だから >10行しかなければ 10行分、ということになります。 >65536行一杯まで使うことは、普通はありえないですから、このように書けるのです。 >もしそこまで使うとしたら、値の代入かコピーかの選択以前に、迷わず Access等 >のデータベースを使うことをお勧めします。 本当にありがとうございました。 とても勉強になりました。 今回はユーザさんに配布する、アプリとなる予定ですので、 安全を第一におこないと思います。 本当はaccessなどを使えればいいのですが、不特定(まあ大体は決まってるのですが) のユーザさんが使うので、accessを持ってないことも考えられて エクセルで、データベースまがいを頑張ることになっているのです。 これからもそういう開発が多いようです(-_-;) また機会がありましたら宜しくお願いします。 ありがとうございました。 |