Excel VBA質問箱 IV

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

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


11318 / 13646 ツリー ←次へ | 前へ→

【16720】他のブックからの、値のみスマートなコピー ackkn 04/8/7(土) 0:08 質問[未読]
【16721】Re:他のブックからの、値のみスマートなコ... Asaki 04/8/7(土) 0:30 回答[未読]
【16726】Re:他のブックからの、値のみスマートなコ... ackkn 04/8/7(土) 11:13 質問[未読]
【16727】Re:他のブックからの、値のみスマートなコ... Asaki 04/8/7(土) 11:29 回答[未読]
【16728】Re:他のブックからの、値のみスマートなコ... ackkn 04/8/7(土) 15:00 質問[未読]
【16759】Re:他のブックからの、値のみスマートなコ... Asaki 04/8/9(月) 9:03 回答[未読]
【16773】Re:他のブックからの、値のみスマートなコ... ackkn 04/8/9(月) 15:45 お礼[未読]

【16720】他のブックからの、値のみスマートなコピ...
質問  ackkn  - 04/8/7(土) 0:08 -

引用なし
パスワード
   初めまして、ackknと申します。
どなたかご教示下さい、よろしくお願いします。
他のブックを開いて、シートの一部の値のみをスマートにコピーしたいのですが、力ずくで下記のコードでコピーしていますが、どう見てもスマートとは思えません。 初心者ですので、レベルアップしたく恥を忍んで投稿します。
どうかよろしくお願い致します。

  Target_Cel(1) = "A5"
  Target_Cel(2) = "B5"
  '--- データファイルオープン
  Application.ScreenUpdating = False
  On Error GoTo ERR_Dtrans
    Workbooks.Open (InFName)
  On Error GoTo 0
  Set TEST_DATA = ActiveSheet
  
  '--- 実データエリアアドレス取得
  Adr_Top(1) = Range("E2").Address
  Adr_Btm(1) = Range("E65536").End(xlUp).Address
  Adr_Top(2) = Range("K2").Address
  Adr_Btm(2) = Range("K65536").End(xlUp).Address

  '---データを取り込む
  For i = 1 To 2
    With TEST_DATA
      .Activate
      .Range(Adr_Top(i), Adr_Btm(i)).Select
      Selection.Copy
    End With
    ThisWorkbook.Worksheets("MAIN").Activate
    Range(Target_Cel(i)).Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
  Next i
  Range(Target_Cel(1)).Select
  Application.CutCopyMode = False  '--- Clipboard Clear
  
  '--- データファイルクローズ
  Workbooks(FName).Close
  Application.ScreenUpdating = True
  Exit Sub

【16721】Re:他のブックからの、値のみスマートな...
回答  Asaki  - 04/8/7(土) 0:30 -

引用なし
パスワード
   こんばんは。

スマートかどうか解りませんが、↓のような感じでは如何でしょうか?
2箇所くらいだと、ループしなくてもよいかな、と思います。

Sub test()
  Dim strFile     As String
  Dim rngCopy     As Range
  
  Application.ScreenUpdating = False
  'ファイルオープン
  Workbooks.Open Filename:=strFile

  'データコピー
  With ThisWorkbook.Worksheets("MAIN")
    Set rngCopy = _
      ActiveSheet.Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(6536, 5).End(xlUp))
    .Cells(5, 1).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
    Set rngCopy = _
      ActiveSheet.Range(ActiveSheet.Cells(2, 11), ActiveSheet.Cells(6536, 11).End(xlUp))
    .Cells(5, 2).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
  End With
  Set rngCopy = Nothing
  Workbooks(Dir(strFile)).Close
  Application.ScreenUpdating = True
  
End Sub

【16726】Re:他のブックからの、値のみスマートな...
質問  ackkn  - 04/8/7(土) 11:13 -

引用なし
パスワード
   ▼Asaki さん:
>こんばんは。
>
>スマートかどうか解りませんが、↓のような感じでは如何でしょうか?
>2箇所くらいだと、ループしなくてもよいかな、と思います。
>
>Sub test()
>  Dim strFile     As String
>  Dim rngCopy     As Range
>  
>  Application.ScreenUpdating = False
>  'ファイルオープン
>  Workbooks.Open Filename:=strFile
>
>  'データコピー
>  With ThisWorkbook.Worksheets("MAIN")
>    Set rngCopy = _
>      ActiveSheet.Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(6536, 5).End(xlUp))
>    .Cells(5, 1).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
>    Set rngCopy = _
>      ActiveSheet.Range(ActiveSheet.Cells(2, 11), ActiveSheet.Cells(6536, 11).End(xlUp))
>    .Cells(5, 2).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
>  End With
>  Set rngCopy = Nothing
>  Workbooks(Dir(strFile)).Close
>  Application.ScreenUpdating = True
>  
>End Sub

Asaki さん、早速のレスありがとうございました。

早速やってみますが、何せ初心者ですので、できましたら下記の部分の簡単な解説をして頂けないでしょうか?

>    Set rngCopy = _
>      ActiveSheet.Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(6536, 5).End(xlUp))
>    .Cells(5, 1).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
>    Set rngCopy = _
>      ActiveSheet.Range(ActiveSheet.Cells(2, 11), ActiveSheet.Cells(6536, 11).End(xlUp))
>    .Cells(5, 2).Resize(rngCopy.Rows.Count).Value = rngCopy.Value

それと、ActiveSheet.Cells(6536, 11).End(xlUp))の 6536 の部分は、通常データの量から何も最下行(65536)から上がらなくてもという事でしょうか?

よろしくご教示下さい。

【16727】Re:他のブックからの、値のみスマートな...
回答  Asaki  - 04/8/7(土) 11:29 -

引用なし
パスワード
   >Set rngCopy = _
>  ActiveSheet.Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(6536, 5).End(xlUp))
>.Cells(5, 1).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
コピーするセル範囲を、オブジェクト変数rngCopy にセットして、
この領域の値を、貼り付け先の領域に代入
という流れです。
セル範囲の矩形を一致させるために Resize を使用しています。
A5セルという1セル分のセル範囲を、rngCopy の行数分、縦方向に拡張します。

>それと、ActiveSheet.Cells(6536, 11).End(xlUp))の 6536 の部分は、
>通常データの量から何も最下行(65536)から上がらなくてもという事でしょうか?
65536 と書いたつもりで、単なるタイプミスです。(2箇所直してください)
すみません。
勿論、Maxのデータが解っているのであれば、そこからEnd(xlUp)しても構わないと思います。

【16728】Re:他のブックからの、値のみスマートな...
質問  ackkn  - 04/8/7(土) 15:00 -

引用なし
パスワード
   ▼Asaki さん:
>>Set rngCopy = _
>>  ActiveSheet.Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(6536, 5).End(xlUp))
>>.Cells(5, 1).Resize(rngCopy.Rows.Count).Value = rngCopy.Value
>コピーするセル範囲を、オブジェクト変数rngCopy にセットして、
>この領域の値を、貼り付け先の領域に代入
>という流れです。
>セル範囲の矩形を一致させるために Resize を使用しています。
>A5セルという1セル分のセル範囲を、rngCopy の行数分、縦方向に拡張します。
>
>>それと、ActiveSheet.Cells(6536, 11).End(xlUp))の 6536 の部分は、
>>通常データの量から何も最下行(65536)から上がらなくてもという事でしょうか?
>65536 と書いたつもりで、単なるタイプミスです。(2箇所直してください)
>すみません。
>勿論、Maxのデータが解っているのであれば、そこからEnd(xlUp)しても構わないと思います。

Asaki さん、早速のレスありがとうございます。
実際に動かしながら確認し、自分の物にしたいと思います。
それと、もう一つ教えて下さい。
Asakiさんは、Range("K65536")とせずに、Cells(65536, 11)とされていますが、この方が何か利点があるのでしょうか?

よろしくご教示下さい。

【16759】Re:他のブックからの、値のみスマートな...
回答  Asaki  - 04/8/9(月) 9:03 -

引用なし
パスワード
   >Range("K65536")とせずに、Cells(65536, 11)とされていますが、
>この方が何か利点があるのでしょうか?
Cells() のほうが、Range() より微妙に速いです。
(大量の)ループ処理中などで使用する場合などでは、多少、実感できるかもしれません。

【16773】Re:他のブックからの、値のみスマートな...
お礼  ackkn  - 04/8/9(月) 15:45 -

引用なし
パスワード
   ▼Asaki さん:
>>Range("K65536")とせずに、Cells(65536, 11)とされていますが、
>>この方が何か利点があるのでしょうか?
>Cells() のほうが、Range() より微妙に速いです。
>(大量の)ループ処理中などで使用する場合などでは、多少、実感できるかもしれません。

Asaki さん、色々とありがとうございました。
改めて旧コードと並べて見ると、実にスマートになり、本当に勉強になりました。
また、1つのセルを指定する場合はCells()を使った方が、速度的にも早いんですね!、見た目にRange("A5")とかの方が判り易いのでついRange()を使っちゃいますが、今後は意識してCells()を使いたいと思います。

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