過去ログ

                                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
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示される  ■名前 : Kein  ■日付 : 03/3/14(金) 1:16  -------------------------------------------------------------------------
   With Range("A1", Range("A65536").End(xlUp))
  .Offset(, 1).Value = .Value
End With

これだけでいいのでは・・?
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示される  ■名前 : ishy <ishy88@hotmail.com>  ■日付 : 03/3/14(金) 10:16  -------------------------------------------------------------------------
   ▼Kein さん:おはようございます。
さっそくの回答ありがとうございます!

>With Range("A1", Range("A65536").End(xlUp))
>  .Offset(, 1).Value = .Value
>End With
>
>これだけでいいのでは・・?

確かに"#N/A"が一切でませんでした。こんなに短かい
書き方ですむのですね。しりませんでした。

もし宜しければ、できれば列指定をoffsetではない方法
も教えていただけないでしょうか。
今回は同一シートでテストしてますが、実際には別シートの列に
値を渡すパターンが多いのです。ですので
別シートにしても大丈夫そうなコードが知りたいです。

質問のしかたが悪かったため、何度もすいません。
よろしくお願いします!
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示される  ■名前 : Kein  ■日付 : 03/3/14(金) 15:27  -------------------------------------------------------------------------
   >別シートの列に値を渡す
例えば参照する数式を入れる方法なら

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

でも出来ますが、範囲が大きいなら数式の方が安全です。
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示される  ■名前 : ishy <ishy88@hotmail.com>  ■日付 : 03/3/14(金) 17:27  -------------------------------------------------------------------------
   ▼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")まで指定していますが、これを
本当に欲しい行までに指定すれば、少しは防げるのでしょうか。

よくわかっていなくて・・・。考えすぎでしょうか。
よろしくご指導お願いします。
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示される  ■名前 : Kein  ■日付 : 03/3/15(土) 20:28  -------------------------------------------------------------------------
   ▼ishy さん:
>範囲が大きいということはどういう意味でしょうか。
>変数の中の値が不安定になるのでしょうか?
具体的にこれぐらい、とは言えません。値を代入する方法は、いちど全てのデータ
をメモリに読み込むため、システムに大きな負荷がかるということです。
それなら大量のメモリを積めば良いのかというと、少ないよりはいいですが、
間違いなく効果がある、というわけではないようです。つまり環境によっても
状況によっても、不安定になる時とそうでない時があります。一度のテストで
問題がなかったとしても、大事な仕事に使うのであれば、安全を優先するべき
と思います。突然メッセージが出てアプリが固まったら、時間をかけて入力した
データが全てパーになります。そうなるかならないかを見極めるのは、玄人でも
難しいことのようです。
>また、今は最終行("B65536")まで指定していますが、これを
>本当に欲しい行までに指定すれば、少しは防げるのでしょうか。
("B65536").End(xlUp) になっていることを確認して下さい。エクセルの最大行数
まででなく「入力された値のある最終行」までを処理範囲にしてます。だから
10行しかなければ 10行分、ということになります。
65536行一杯まで使うことは、普通はありえないですから、このように書けるのです。
もしそこまで使うとしたら、値の代入かコピーかの選択以前に、迷わず Access等
のデータベースを使うことをお勧めします。
 ───────────────────────────────────────  ■題名 : Re:配列で他の列に値を渡すと#N/Aが表示さ...  ■名前 : ishy <ishy88@hotmail.com>  ■日付 : 03/3/17(月) 10:29  -------------------------------------------------------------------------
   ▼Kein さん:ありがとうございます。
すいません。最初の質問を超えたような、質問をしてしまって。
keinさんの説明がわかりやすくとても納得しました。

↓本当に難しいですよね。本当に何を選択していけばいいのか、
まだまだひよこなんで色んな所で迷います。
>具体的にこれぐらい、とは言えません。値を代入する方法は、いちど全てのデータ
>をメモリに読み込むため、システムに大きな負荷がかるということです。
>それなら大量のメモリを積めば良いのかというと、少ないよりはいいですが、
>間違いなく効果がある、というわけではないようです。つまり環境によっても
>状況によっても、不安定になる時とそうでない時があります。一度のテストで
>問題がなかったとしても、大事な仕事に使うのであれば、安全を優先するべき
>と思います。突然メッセージが出てアプリが固まったら、時間をかけて入力した
>データが全てパーになります。そうなるかならないかを見極めるのは、玄人でも
>難しいことのようです。

↓すいません読み切れてなかったです。
>("B65536").End(xlUp) になっていることを確認して下さい。エクセルの最大行数
>まででなく「入力された値のある最終行」までを処理範囲にしてます。だから
>10行しかなければ 10行分、ということになります。
>65536行一杯まで使うことは、普通はありえないですから、このように書けるのです。
>もしそこまで使うとしたら、値の代入かコピーかの選択以前に、迷わず Access等
>のデータベースを使うことをお勧めします。

本当にありがとうございました。
とても勉強になりました。
今回はユーザさんに配布する、アプリとなる予定ですので、
安全を第一におこないと思います。

本当はaccessなどを使えればいいのですが、不特定(まあ大体は決まってるのですが)
のユーザさんが使うので、accessを持ってないことも考えられて
エクセルで、データベースまがいを頑張ることになっているのです。

これからもそういう開発が多いようです(-_-;)
また機会がありましたら宜しくお願いします。
ありがとうございました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 881