Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13021 / 13644 ツリー ←次へ | 前へ→

【7341】異なるブック間でのデータコピー 初心者 03/9/2(火) 20:14 質問
【7354】Re:異なるブック間でのデータコピー ichinose 03/9/3(水) 7:45 回答
【7379】Re:異なるブック間でのデータコピー 初心者 03/9/3(水) 17:05 お礼
【7380】Re:異なるブック間でのデータコピー 初心者 03/9/3(水) 17:10 発言
【7384】Re:異なるブック間でのデータコピー ichinose 03/9/3(水) 19:39 回答
【7422】Re:異なるブック間でのデータコピー 初心者 03/9/4(木) 16:29 お礼

【7341】異なるブック間でのデータコピー
質問  初心者  - 03/9/2(火) 20:14 -

引用なし
パスワード
   度々失礼致します。
既存エクセルファイルと新規ブックの間でのデータコピーを試みています。
さらに、この処理は何度も使用する箇所なので、
クリップボードを使用しない方法を模索しています。

とあるサイトで「クリップボードを使用しないブック間コピー」という
サンプルを見つけたのですが、うまくいきません。
以下、問題点を教えていただけないでしょうか。

【概要】
 エクセルファイルAと新規ブックの2つのファイルを開き、Aのデータを新規ブックにコピーする。

【処理】
  Dim NewBook as String

  Workbooks.Open FileName:= (Excel形式のファイルAの絶対パス)
  Workbooks.Add
  NewBook = ActiveWorkbook.Name  ←"Book1"のような名前が入ります。

  Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
  Workbooks(NewBook).Worksheets(1).Range(Cells(3,1)) 
                        ↑ここでエラーになります。

※Workbooks(NewBook).Worksheets(1).Activate 
処理ではエラーになりませんでしたので、新規ブックの認識はされているようです。

宜しくお願い致します。

【7354】Re:異なるブック間でのデータコピー
回答  ichinose  - 03/9/3(水) 7:45 -

引用なし
パスワード
   ▼初心者 さん:
おはようございます。

>度々失礼致します。
>既存エクセルファイルと新規ブックの間でのデータコピーを試みています。
>さらに、この処理は何度も使用する箇所なので、
>クリップボードを使用しない方法を模索しています。
>
>とあるサイトで「クリップボードを使用しないブック間コピー」という
>サンプルを見つけたのですが、うまくいきません。
>以下、問題点を教えていただけないでしょうか。
>
>【概要】
> エクセルファイルAと新規ブックの2つのファイルを開き、Aのデータを新規ブックにコピーする。
>
>【処理】
>  Dim NewBook as String
>
>  Workbooks.Open FileName:= (Excel形式のファイルAの絶対パス)
>  Workbooks.Add
>  NewBook = ActiveWorkbook.Name  ←"Book1"のような名前が入ります。
>
>  Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
   Workbooks(NewBook).Worksheets(1).Cells(3,1)
     'してたらどうでしょうか? 
>                        ↑ここでエラーになります。
>
>※Workbooks(NewBook).Worksheets(1).Activate 
>処理ではエラーになりませんでしたので、新規ブックの認識はされているようです。
>
>宜しくお願い致します。

【7379】Re:異なるブック間でのデータコピー
お礼  初心者  - 03/9/3(水) 17:05 -

引用なし
パスワード
   ▼ichinose さん:
お返事ありがとうございます。

>   Workbooks(NewBook).Worksheets(1).Cells(3,1)
>     'してたらどうでしょうか? 
ごめんなさい。
NewBookが複数且つ事前にOPENする必要ありなので、
ブック名を特定する必要があったのです。

自分なりにも色々試してしましたが、
現在、以下の方法で動くことを確認しています。
(Officeのバージョンは '97を使用しています。)

 Dim strPosition as String
 strPosition = Application.ConvertFormula(引数記述略) 
                        ←R1C1形式をA1形式に変換
 Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
 Workbooks(NewBook).Worksheets(1).Range(strPosition)          

理由はわかりませんが、Rangeの部分の記述において
 Range(A1形式)      -> OK
 Range(Cells(Row,Col)) -> NG
となりました。
どちらも同じように思えますが・・・。

【7380】Re:異なるブック間でのデータコピー
発言  初心者  - 03/9/3(水) 17:10 -

引用なし
パスワード
   >▼ichinose さん:

すみません。
お返事が意味不明な文章になってしまいました。
送信前に確認すべきでした。
以下、お返事の訂正です。

Range記述ではなくCells記述にすると、
範囲指定をしてコピーをする際に繰返処理回数が増えてしまうので、
Cellsは使用せずにRangeにごだわりました。

【7384】Re:異なるブック間でのデータコピー
回答  ichinose  - 03/9/3(水) 19:39 -

引用なし
パスワード
   ▼初心者 さん:
こんばんは。

>NewBookが複数且つ事前にOPENする必要ありなので、
>ブック名を特定する必要があったのです。
>
>自分なりにも色々試してしましたが、
>現在、以下の方法で動くことを確認しています。
>(Officeのバージョンは '97を使用しています。)
>
> Dim strPosition as String
> strPosition = Application.ConvertFormula(引数記述略) 
>                        ←R1C1形式をA1形式に変換
> Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
> Workbooks(NewBook).Worksheets(1).Range(strPosition)          
>
>理由はわかりませんが、Rangeの部分の記述において
> Range(A1形式)      -> OK
> Range(Cells(Row,Col)) -> NG
  '↑こういう指定は、そもそもできませんが・・・
  range(Cells(Row,Col).address) 'ならわかりますが・・・ 
>となりました。

例えば、ブックA.xlsのシートSampleのセルa1を
Workbooks(NewBook).Worksheets(1)で取得できるシートのセルA1〜A10に
コピーすることを考えます。
この場合、

Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
 Workbooks(NewBook).Worksheets(1).Range(cells(1,1),cells(10,1))    

とすると、同様のエラーが発生します。
Cellsは、プロパティですから、その前にはオブジェクトが必要です。
省略すると、アクティブシートのプロパティと見なされますが、
アクティブなシートがブックA.xlsのシートSampleだったら、記述に矛盾が出てきてしまいます(Workbooks(NewBook).Worksheets(1)に貼り付けるのに、
Worksheets("Sample")のプロパティでは矛盾でしょ?)。

上記の記述でも変数Newbookで示されるブックの左端シートがアクティブになっていれば、正常に実行されるはずです。

with Workbooks(NewBook).Worksheets(1)
  Workbooks("A.xls").Worksheets("Sample").Range("A1").Copy _
   .Range(.cells(1,1),.cells(10,1))
  end with    

どちらのブックがアクティブになっていてもエラーにならないはずです。
元々の採用されているコードとどちらが良いかは、又別の問題ですが・・・。

ご質問の回答になったでしょうか?

【7422】Re:異なるブック間でのデータコピー
お礼  初心者  - 03/9/4(木) 16:29 -

引用なし
パスワード
   ▼ichinose さん:
お返事ありがとうございます。

>> Range(A1形式)      -> OK
>> Range(Cells(Row,Col)) -> NG
>  '↑こういう指定は、そもそもできませんが・・・
>  range(Cells(Row,Col).address) 'ならわかりますが・・・ 

(間、省略させて頂きました。)

>Cellsは、プロパティですから、その前にはオブジェクトが必要です。
>省略すると、アクティブシートのプロパティと見なされますが、
>アクティブなシートがブックA.xlsのシートSampleだったら、記述に矛盾が出てきてしまいます(Workbooks(NewBook).Worksheets(1)に貼り付けるのに、
>Worksheets("Sample")のプロパティでは矛盾でしょ?)。

なるほど。
Range(A1形式)とRange(Cells(Row,Col))は違うものだったのですね。
試しに元のエラーになったコードを「cells(row,col).Address」と
してみたところ、正常に動きました。
お陰様で、変換処理を通さなくて良くなりました。
本当に、本当にありがとうございました。

13021 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free